renderer

package module
v0.0.0-...-60a1763 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 17, 2018 License: MIT Imports: 5 Imported by: 0

README

Renderer

Docker Automated build Moonlight contractors Godoc Reference

Renderer is a gRPC service that renders webpage HTML using the Chromeless package. It was inspired by the chromeless-prerender project.

Motivation

At Moonlight, we needed to do prerendering of our Javascript single-page application. We wanted to use prerender.io, but it didn't seem maintained enough to be compatible with the latest Javascript. We put together this renderer project so that we could just run one (or more) containers inside of our Kubernetes cluster for rendering. We manage caching on the client, so no explicit caching is added to this server.

Contributing

Changes are welcome. If you modify the proto file, please regenerate and commit the built protoc files using make. This allows this package to be go get-able for use in clients that interact with the server.

Usage

Booting server in Docker

docker-compose up # add `--build` to force a rebuild, `-d` to run in background
Go Client
package main

import (
	"fmt"

	"golang.org/x/net/context"

	"github.com/moonlightwork/renderer"
	"google.golang.org/grpc"
)

func main() {
	// Create connection (insecure)
	opts := []grpc.DialOption{grpc.WithInsecure()}
	conn, err := grpc.Dial("localhost:3000", opts...)
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// Create client
	client := renderer.NewRendererServiceClient(conn)

	// Try health check endpoint to make sure container is online
	_, err = client.CheckHealth(context.Background(), &renderer.Empty{})
	if err != nil {
		panic(err)
	}
	fmt.Println("✅ API Online")

	// Try rendering a URL
	res, err := client.Render(context.Background(), &renderer.Request{Url: "https://www.moonlightwork.com/about"})
	if err != nil {
		panic(err)
	}

	// Printing HTML to show that it's been rendered
	fmt.Printf("\n\n%v\n\n", res.Data)

	fmt.Println("💡 Successfully fetched HTML")
}

Documentation

Overview

Package renderer is a generated protocol buffer package.

It is generated from these files:

renderer.proto

It has these top-level messages:

Request
Response
Empty

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func RegisterRendererServiceServer

func RegisterRendererServiceServer(s *grpc.Server, srv RendererServiceServer)

Types

type Empty

type Empty struct {
}

not using google.proto.Empty because it doesn't play nicely with dynamic imports

func (*Empty) Descriptor

func (*Empty) Descriptor() ([]byte, []int)

func (*Empty) ProtoMessage

func (*Empty) ProtoMessage()

func (*Empty) Reset

func (m *Empty) Reset()

func (*Empty) String

func (m *Empty) String() string

type RendererServiceClient

type RendererServiceClient interface {
	CheckHealth(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	Render(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
	Screenshot(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
	Print(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
}

func NewRendererServiceClient

func NewRendererServiceClient(cc *grpc.ClientConn) RendererServiceClient

type RendererServiceServer

type RendererServiceServer interface {
	CheckHealth(context.Context, *Empty) (*Empty, error)
	Render(context.Context, *Request) (*Response, error)
	Screenshot(context.Context, *Request) (*Response, error)
	Print(context.Context, *Request) (*Response, error)
}

type Request

type Request struct {
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
}

func (*Request) Descriptor

func (*Request) Descriptor() ([]byte, []int)

func (*Request) GetUrl

func (m *Request) GetUrl() string

func (*Request) ProtoMessage

func (*Request) ProtoMessage()

func (*Request) Reset

func (m *Request) Reset()

func (*Request) String

func (m *Request) String() string

type Response

type Response struct {
	Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
}

func (*Response) Descriptor

func (*Response) Descriptor() ([]byte, []int)

func (*Response) GetData

func (m *Response) GetData() string

func (*Response) ProtoMessage

func (*Response) ProtoMessage()

func (*Response) Reset

func (m *Response) Reset()

func (*Response) String

func (m *Response) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL