Skip to content

Commit

Permalink
Merge pull request #39 from cofacts/grpc
Browse files Browse the repository at this point in the history
Using gRPC instead of GraphQL for url resolver
  • Loading branch information
MrOrz committed Aug 23, 2019
2 parents d5711b6 + a921232 commit 05400af
Show file tree
Hide file tree
Showing 36 changed files with 2,882 additions and 2,695 deletions.
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
!package.json
!package-lock.json
!index.js
!docker-test.js
!schema.js
!src/*
!docker-test.sh
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
vendor
*pb.js
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
node_modules
.env
coverage
*pb.js
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ language: node_js
node_js: '10'

script:
- npm run compile
- npm run lint
- npm t -- --coverage

Expand Down
7 changes: 5 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ RUN chmod +x /usr/local/bin/dumb-init
# Install puppeteer so it's available in the container.
# We then don't put puppeteer as dependency in package.json
# https://github.com/ebidel/try-puppeteer/blob/master/backend/Dockerfile
#
RUN npm i puppeteer@1.8.0


# Add user so we don't need --no-sandbox.
# DOESN'T WORK WITH SANDBOX -- https://github.com/Googlechrome/puppeteer/issues/290
Expand All @@ -44,8 +43,12 @@ RUN groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \
WORKDIR /srv/www
COPY package.json package-lock.json ./
RUN npm install --production
RUN npm i puppeteer@1.8.0

COPY . .

RUN npm run compile

# Run everything after as non-privileged user.
USER pptruser

Expand Down
69 changes: 69 additions & 0 deletions docker-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
require('dotenv').config();

const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');

const PORT = process.env.PORT || 4000;

const PROTO_PATH = __dirname + '/src/typeDefs/url_resolver.proto';
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
});

const urlResolverProto = grpc.loadPackageDefinition(packageDefinition)
.url_resolver;

const testResolveUrl = () => {
const client = new urlResolverProto.UrlResolver(
`localhost:${PORT}`,
grpc.credentials.createInsecure()
);
const urls = [];
const call = client.ResolveUrl({ urls });
const responses = [];
call.on('data', response => {
responses.push(response);
});
call.on('error', err => {
throw new Error(`Test failed: ${err}`);
});
// eslint-disable-next-line no-console
call.on('end', () => console.log(JSON.stringify(responses, null, 4)));
};

testResolveUrl();

/** For browser stats; uncomment to use it **/
/*
const BROWSER_PROTO_PATH = __dirname + '/src/typeDefs/browser_stats.proto';
const browserPackageDefinition = protoLoader.loadSync(BROWSER_PROTO_PATH, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
});
const browserProto = grpc.loadPackageDefinition(browserPackageDefinition)
.browser_stats;
const testGetBrowserStats = () => {
const client = new browserProto.BrowserStats(
`localhost:${PORT}`,
grpc.credentials.createInsecure()
);
client.GetStats({}, (err, res) => {
if (err) {
throw new Error(err);
}
// eslint-disable-next-line no-console
console.log(JSON.stringify(res, null, 4));
});
};
testGetBrowserStats();
*/
5 changes: 3 additions & 2 deletions docker-test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#/bin/bash

npm start &
wget --post-data='{"query":"{ resolvedUrls(urls: [\"example.com\"]) { url }}"}' --header='Content-Type: application/json' -O - http://localhost:4000
node index.js &
sleep 10
node docker-test.js
56 changes: 40 additions & 16 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,44 @@
require('dotenv').config();

const schema = require('./src/schema');
const { ApolloServer } = require('apollo-server');
const PORT = process.env.PORT || 4000;
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const { resolveUrls } = require('./src/resolvers/resolveUrls');
const { getBrowserStats } = require('./src/resolvers/browser');

const PROTO_PATHS = {
urlResolver: __dirname + '/src/typeDefs/url_resolver.proto',
browserStats: __dirname + '/src/typeDefs/browser_stats.proto',
};
const protoLoaderOptions = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};

const packageDefinitions = {};
Object.keys(PROTO_PATHS).map(key => {
packageDefinitions[key] = protoLoader.loadSync(
PROTO_PATHS[key],
protoLoaderOptions
);
});

const apolloOption = { schema };
if (process.env.ENGINE_API_KEY) {
apolloOption.engine = { apiKey: process.env.ENGINE_API_KEY };
}
const urlResolverProto = grpc.loadPackageDefinition(
packageDefinitions.urlResolver
).url_resolver;
const browserProto = grpc.loadPackageDefinition(packageDefinitions.browserStats)
.browser_stats;

const PORT = process.env.PORT || 4000;

const server = new ApolloServer(apolloOption);
server
.listen({
port: PORT,
})
.then(({ url }) => {
// eslint-disable-next-line no-console
console.log(`🚀 Server ready at ${url}`);
});
const server = new grpc.Server();
server.addService(urlResolverProto.UrlResolver.service, {
ResolveUrl: resolveUrls,
});
server.addService(browserProto.BrowserStats.service, {
GetStats: getBrowserStats,
});
server.bind(`0.0.0.0:${PORT}`, grpc.ServerCredentials.createInsecure());
server.start();

0 comments on commit 05400af

Please sign in to comment.