@sellout/service 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.dist/BaseService.d.ts +22 -0
  2. package/.dist/BaseService.js +77 -0
  3. package/.dist/BaseService.js.map +1 -0
  4. package/.dist/ConsoleLogManager.d.ts +9 -0
  5. package/.dist/ConsoleLogManager.js +18 -0
  6. package/.dist/ConsoleLogManager.js.map +1 -0
  7. package/.dist/MongoConnectionManager.d.ts +9 -0
  8. package/.dist/MongoConnectionManager.js +52 -0
  9. package/.dist/MongoConnectionManager.js.map +1 -0
  10. package/.dist/NatsConnectionManager.d.ts +115 -0
  11. package/.dist/NatsConnectionManager.js +215 -0
  12. package/.dist/NatsConnectionManager.js.map +1 -0
  13. package/.dist/PbAsyncMessageHandler.d.ts +15 -0
  14. package/.dist/PbAsyncMessageHandler.js +26 -0
  15. package/.dist/PbAsyncMessageHandler.js.map +1 -0
  16. package/.dist/PbBroadcastProxy.d.ts +25 -0
  17. package/.dist/PbBroadcastProxy.js +41 -0
  18. package/.dist/PbBroadcastProxy.js.map +1 -0
  19. package/.dist/PbMessageHandler.d.ts +26 -0
  20. package/.dist/PbMessageHandler.js +46 -0
  21. package/.dist/PbMessageHandler.js.map +1 -0
  22. package/.dist/PbServiceProxy.d.ts +38 -0
  23. package/.dist/PbServiceProxy.js +64 -0
  24. package/.dist/PbServiceProxy.js.map +1 -0
  25. package/.dist/Segment.d.ts +12 -0
  26. package/.dist/Segment.js +34 -0
  27. package/.dist/Segment.js.map +1 -0
  28. package/.dist/Tracer.d.ts +22 -0
  29. package/.dist/Tracer.js +49 -0
  30. package/.dist/Tracer.js.map +1 -0
  31. package/.dist/TracerExpress.d.ts +1 -0
  32. package/.dist/TracerExpress.js +42 -0
  33. package/.dist/TracerExpress.js.map +1 -0
  34. package/.dist/build/tsconfig.json +32 -0
  35. package/.dist/build/tslint.json +17 -0
  36. package/.dist/env.d.ts +5 -0
  37. package/.dist/env.js +8 -0
  38. package/.dist/env.js.map +1 -0
  39. package/.dist/interfaces.d.ts +31 -0
  40. package/.dist/interfaces.js +3 -0
  41. package/.dist/interfaces.js.map +1 -0
  42. package/.dist/joiToErrors.d.ts +3 -0
  43. package/.dist/joiToErrors.js +43 -0
  44. package/.dist/joiToErrors.js.map +1 -0
  45. package/.dist/schemas.d.ts +0 -0
  46. package/.dist/schemas.js +1 -0
  47. package/.dist/schemas.js.map +1 -0
  48. package/package.json +34 -0
  49. package/src/BaseService.ts +98 -0
  50. package/src/ConsoleLogManager.ts +23 -0
  51. package/src/MongoConnectionManager.ts +49 -0
  52. package/src/NatsConnectionManager.ts +268 -0
  53. package/src/PbAsyncMessageHandler.ts +28 -0
  54. package/src/PbBroadcastProxy.ts +41 -0
  55. package/src/PbMessageHandler.ts +49 -0
  56. package/src/PbServiceProxy.ts +66 -0
  57. package/src/Segment.ts +35 -0
  58. package/src/Tracer.ts +55 -0
  59. package/src/TracerExpress.ts +36 -0
  60. package/src/build/tsconfig.json +32 -0
  61. package/src/build/tslint.json +17 -0
  62. package/src/env.ts +5 -0
  63. package/src/interfaces.ts +47 -0
  64. package/src/joiToErrors.ts +48 -0
  65. package/src/schemas.ts +0 -0
  66. package/tsconfig.json +28 -0
  67. package/tslint.json +21 -0
package/src/Tracer.ts ADDED
@@ -0,0 +1,55 @@
1
+ import { initTracer, Span, SpanContext } from 'jaeger-client';
2
+ const JAEGER_AGENT_HOST = process.env.JAEGER_AGENT_HOST;
3
+
4
+ console.log(`Jaeger Agent Host: ${JAEGER_AGENT_HOST}`);
5
+
6
+ export default class Tracer {
7
+
8
+ serviceName: string;
9
+ logger: any;
10
+ tracer: any;
11
+
12
+ constructor(serviceName: string, logger: any = console, verbose: boolean = true) {
13
+ this.serviceName = serviceName;
14
+ this.logger = logger ? logger : console;
15
+ this.tracer = initTracer(this.config(verbose), this.options());
16
+ }
17
+
18
+ config(verbose: boolean) {
19
+ return {
20
+ serviceName: this.serviceName,
21
+ sampler: {
22
+ type: "const",
23
+ param: 1
24
+ },
25
+ reporter: {
26
+ // agentHost: 'jaeger-agent',
27
+ agentHost: JAEGER_AGENT_HOST,
28
+ // agentHost: 'foobar',
29
+ // collectorEndpoint: "http://localhost:14268/api/traces",
30
+ logSpans: verbose
31
+ }
32
+ };
33
+ }
34
+
35
+ options() {
36
+ const options = {
37
+ logger: this.logger,
38
+ };
39
+
40
+ return options;
41
+ }
42
+
43
+ startSpan(name: string, parentSpan?: (Span | SpanContext | string)) {
44
+ let childOf;
45
+
46
+ if (typeof parentSpan === 'string') {
47
+ childOf = SpanContext.fromString(parentSpan);
48
+ } else if (parentSpan instanceof Span) {
49
+ childOf = parentSpan.context();
50
+ } else if (parentSpan instanceof SpanContext) {
51
+ childOf = parentSpan;
52
+ }
53
+ return this.tracer.startSpan(name, { childOf });
54
+ }
55
+ }
@@ -0,0 +1,36 @@
1
+ import Tracer from './Tracer';
2
+ import * as url from 'url';
3
+
4
+ const traceHTTP = (req, res, tracer): void => {
5
+ const pathname = url.parse(req.url).pathname;
6
+ const span = tracer.startSpan(<string>pathname);
7
+ span.logEvent('request_recieved');
8
+ span.setTag('span.kind', 'server');
9
+ span.setTag('http.method', req.method);
10
+ span.setTag('http.url', req.url);
11
+
12
+ res.setHeader('uver-trace-id', span.context().toString());
13
+
14
+ req.span = span;
15
+ req.tracer = tracer;
16
+
17
+ const finish = () => {
18
+ span.logEvent('request_finished');
19
+ span.setTag('http.status_code', res.statusCode);
20
+ if(res.statusCode >= 500) {
21
+ span.setTag('error', true);
22
+ span.setTag('sampling.priority', 1);
23
+ }
24
+ span.finish();
25
+ };
26
+
27
+ res.on("finish", finish);
28
+ };
29
+
30
+ export const tracerExpress = (serviceName: string) => {
31
+ const tracer = new Tracer(serviceName);
32
+ return async (req, res, next): Promise<void> => {
33
+ traceHTTP(req, res, tracer);
34
+ next();
35
+ }
36
+ };
@@ -0,0 +1,32 @@
1
+ {
2
+ "compileOnSave": true,
3
+ "compilerOptions": {
4
+ "inlineSourceMap": true,
5
+ "baseUrl": ".",
6
+ "moduleResolution": "node",
7
+ "target": "es6",
8
+ "esModuleInterop": true,
9
+ "lib": ["es6", "dom", "esnext.asynciterable"],
10
+ "module": "commonjs",
11
+ "outDir": "./.dist/",
12
+ "declaration": true,
13
+ // "sourceMap": true,
14
+ // "strictNullChecks": true,
15
+ "noUnusedLocals": true,
16
+ "paths": {},
17
+ "types": [
18
+ "node",
19
+ "long",
20
+ "mocha"
21
+ ]
22
+ },
23
+ "include": [
24
+ "src/**/*.ts",
25
+ "src/templates",
26
+ ],
27
+ "exclude": [
28
+ "node_modules",
29
+ "test/*",
30
+ "dist/*"
31
+ ]
32
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "tslint-config-airbnb",
3
+ "rules": {
4
+ "quotemark": [
5
+ true,
6
+ "single"
7
+ ],
8
+ "import-name": false,
9
+ "variable-name": false,
10
+ "max-line-length": false,
11
+ "no-console": false,
12
+ "ban": false
13
+ },
14
+ "jsRules": {
15
+ "max-line-length": false
16
+ }
17
+ }
package/src/env.ts ADDED
@@ -0,0 +1,5 @@
1
+ export const DISABLE_PROMETHEUS = process.env.DISABLE_PROMETHEUS || false;
2
+ export const LOAD_TEST_ENABLED = process.env.LOAD_TEST_ENABLED === '1';
3
+ export const SEGMENT_IO_WRITE_KEY = process.env.SEGMENT_IO_WRITE_KEY;
4
+ export const SENTRY_DSN = process.env.SENTRY_DSN;
5
+ export const NODE_ENV = process.env.NODE_ENV || 'development';
@@ -0,0 +1,47 @@
1
+ export interface ISubscriptionRoutes {
2
+ [routeName: string]: IMessageHandler;
3
+ }
4
+
5
+ export interface IConnectionManager {
6
+ connect();
7
+ close();
8
+ on(event: string, cb: (...args: any[]) => void);
9
+ send(
10
+ serviceId: string,
11
+ method: string,
12
+ req: Buffer,
13
+ cb: (error, reply) => void,
14
+ timeout?: number
15
+ );
16
+ sendAsync(
17
+ serviceId: string,
18
+ method: string,
19
+ req: Buffer,
20
+ cb: (error, reply) => void,
21
+ timeout?: number
22
+ );
23
+ sendBroadcast(messageId: string, req: Buffer, cb: (error, reply) => void);
24
+ subscribe(serviceId: string, queue: string, routes: ISubscriptionRoutes);
25
+ subscribeBroadcast(serviceId: string, routes: ISubscriptionRoutes);
26
+ }
27
+
28
+ export interface ILogManager {
29
+ info(msg: string, ...params: string[]): void;
30
+ warn(msg: string, ...params: string[]): void;
31
+ error(msg: string, ...params: string[]): void;
32
+ }
33
+
34
+ export interface ILogManagerOpts {
35
+ serviceName: string;
36
+ }
37
+
38
+ export interface IMessageHandler {
39
+ process(req: Buffer): Promise<Buffer>;
40
+ }
41
+
42
+ export interface IServiceOpts {
43
+ serviceName: string;
44
+ connectionMgr: IConnectionManager;
45
+ logManager: ILogManager;
46
+ storageManager?: any;
47
+ }
@@ -0,0 +1,48 @@
1
+ /*
2
+ * Converts Joi error objects to a { key, message } type object (pb.Error, Object, etc.)
3
+ */
4
+ const joiToErrors = (joiErrors, errorClass) => {
5
+ const errors = joiErrors.details.map(detail => {
6
+ const key = detail.path[0];
7
+ const type = detail.type;
8
+
9
+ // Note, these messages eventually need to be symbolic, and also localized / translated.
10
+ // Right now, we're mainly using the English strings returned by the Joi validators.
11
+ const defaultMessage = detail.message;
12
+ const message = publicErrorMessage(key, type, defaultMessage);
13
+
14
+ return new errorClass({ key, message });
15
+ }, {});
16
+
17
+ return errors;
18
+ };
19
+
20
+ /*
21
+ * Override default Joi messages, which aren't always safe to show to our users.
22
+ */
23
+ const publicErrorMessage = (key, type, defaultMessage) => {
24
+ let message = defaultMessage;
25
+
26
+ switch (type) {
27
+ case "string.regex.base": {
28
+ // regex errors echo back the value, which is dangerous for passwords
29
+ message = `"${key}" does not meet the requirements`;
30
+ }
31
+ }
32
+
33
+ return message;
34
+ };
35
+
36
+ /*
37
+ * Function used for more detailed key info and custom error messages
38
+ */
39
+ export const joiToErrorMessages = (joiErrors, errorClass) => {
40
+ const errors = joiErrors.details.map(detail => {
41
+ const key = detail.context.label;
42
+ const message = detail.message;
43
+ return new errorClass({ key, message });
44
+ }, {});
45
+ return errors;
46
+ };
47
+
48
+ export default joiToErrors;
package/src/schemas.ts ADDED
File without changes
package/tsconfig.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "compileOnSave": true,
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "moduleResolution": "node",
6
+ "target": "es6",
7
+ "module": "commonjs",
8
+ "outDir": "./.dist/",
9
+ "declaration": true,
10
+ "sourceMap": true,
11
+ "strictNullChecks": true,
12
+ "noUnusedLocals": true,
13
+ "paths": {},
14
+ "types": [
15
+ "node",
16
+ "long"
17
+ ]
18
+ },
19
+ "typeRoots": [
20
+ "node_modules/@types"
21
+ ],
22
+ "include": [
23
+ "./src/**/*.ts"
24
+ ],
25
+ "exclude": [
26
+ "node_modules"
27
+ ]
28
+ }
package/tslint.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "extends": "tslint-config-airbnb",
3
+ "rules": {
4
+ "max-line-length": {
5
+ "options": [120]
6
+ },
7
+ "no-console": false,
8
+ "ban": [
9
+ true,
10
+ {
11
+ "name": ["Math", "random"],
12
+ "message": "Use a better RNG, perhaps UUID?"
13
+ }
14
+ ]
15
+ },
16
+ "jsRules": {
17
+ "max-line-length": {
18
+ "options": [120]
19
+ }
20
+ }
21
+ }