@koeroesi86/node-worker-express 22.3.12-fd2e588 → 23.3.4361459321-main

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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/constants/index.d.ts +11 -0
  3. package/dist/index-aad82b3f.js +15 -0
  4. package/dist/index-aad82b3f.js.map +1 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +446 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/middleware/bodyParser.d.ts +5 -0
  9. package/dist/middleware/index.d.ts +19 -0
  10. package/dist/staticWorker.d.ts +3 -0
  11. package/dist/staticWorker.js +194 -0
  12. package/dist/staticWorker.js.map +1 -0
  13. package/dist/types/index.d.ts +41 -0
  14. package/dist/utils/constructWsMessage.d.ts +3 -0
  15. package/dist/utils/getClientIp.d.ts +3 -0
  16. package/dist/utils/isWebSocket.d.ts +3 -0
  17. package/dist/utils/parseWsMessage.d.ts +3 -0
  18. package/dist/utils/workerPool.d.ts +19 -0
  19. package/dist/workerInvoke.d.ts +1 -0
  20. package/dist/workerInvoke.js +54 -0
  21. package/dist/workerInvoke.js.map +1 -0
  22. package/package.json +8 -3
  23. package/rollup.config.js +12 -0
  24. package/.travis.yml +0 -17
  25. package/constants/index.js +0 -12
  26. package/examples/public/favicon.ico +0 -0
  27. package/examples/public/websocket/worker.js +0 -60
  28. package/examples/public/worker.js +0 -42
  29. package/examples/server.js +0 -29
  30. package/examples/staticWorker.js +0 -237
  31. package/index.d.ts +0 -64
  32. package/index.js +0 -3
  33. package/middleware/bodyParser.js +0 -36
  34. package/middleware/index.js +0 -288
  35. package/middleware/workerInvoke.js +0 -54
  36. package/nodemon.json +0 -6
  37. package/scripts/version.js +0 -9
  38. package/utils/constructWsMessage.js +0 -27
  39. package/utils/getClientIp.js +0 -71
  40. package/utils/isWebSocket.js +0 -16
  41. package/utils/parseWsMessage.js +0 -25
  42. package/utils/workerPool.js +0 -101
@@ -0,0 +1,194 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+ var fs = require('fs');
5
+ var crypto = require('crypto');
6
+ var child_process = require('child_process');
7
+ require('stream');
8
+
9
+ let timer;
10
+ function debounce(fn = () => { }, timeout = 0) {
11
+ if (timer)
12
+ clearTimeout(timer);
13
+ timer = setTimeout(() => {
14
+ timer = undefined;
15
+ fn();
16
+ }, timeout);
17
+ }
18
+ function getContentType(extension = '') {
19
+ const contentTypes = {
20
+ '.aac': 'audio/aac',
21
+ '.abw': 'application/x-abiword',
22
+ '.arc': 'application/x-freearc',
23
+ '.avi': 'video/x-msvideo',
24
+ '.azw': 'application/vnd.amazon.ebook',
25
+ '.bin': 'application/octet-stream',
26
+ '.bmp': 'image/bmp',
27
+ '.bz': 'application/x-bzip',
28
+ '.bz2': 'application/x-bzip2',
29
+ '.csh': 'application/x-csh',
30
+ '.css': 'text/css',
31
+ '.csv': 'text/csv',
32
+ '.doc': 'application/msword',
33
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
34
+ '.eot': 'application/vnd.ms-fontobject',
35
+ '.epub': 'application/epub+zip',
36
+ '.gz': 'application/gzip',
37
+ '.gif': 'image/gif',
38
+ '.htm': 'text/html',
39
+ '.html': 'text/html',
40
+ '.ico': 'image/vnd.microsoft.icon',
41
+ '.ics': 'text/calendar',
42
+ '.jar': 'application/java-archive',
43
+ '.jpeg': 'image/jpeg',
44
+ '.jpg': 'image/jpeg',
45
+ '.js': 'text/javascript',
46
+ '.json': 'application/json',
47
+ '.jsonld': 'application/ld+json',
48
+ '.mid': 'audio/midi',
49
+ '.midi': 'audio/x-midi',
50
+ '.mjs': 'text/javascript',
51
+ '.mp3': 'audio/mpeg',
52
+ '.mpeg': 'video/mpeg',
53
+ '.mpkg': 'application/vnd.apple.installer+xml',
54
+ '.odp': 'application/vnd.oasis.opendocument.presentation',
55
+ '.ods': 'application/vnd.oasis.opendocument.spreadsheet',
56
+ '.odt': 'application/vnd.oasis.opendocument.text',
57
+ '.oga': 'audio/ogg',
58
+ '.ogv': 'video/ogg',
59
+ '.ogx': 'application/ogg',
60
+ '.opus': 'audio/opus',
61
+ '.otf': 'font/otf',
62
+ '.png': 'image/png',
63
+ '.pdf': 'application/pdf',
64
+ '.php': 'application/php',
65
+ '.ppt': 'application/vnd.ms-powerpoint',
66
+ '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
67
+ '.rar': 'application/vnd.rar',
68
+ '.rtf': 'application/rtf',
69
+ '.sh': 'application/x-sh',
70
+ '.svg': 'image/svg+xml',
71
+ '.swf': 'application/x-shockwave-flash',
72
+ '.tar': 'application/x-tar',
73
+ '.tif': 'image/tiff',
74
+ '.tiff': 'image/tiff',
75
+ '.ts': 'video/mp2t',
76
+ '.ttf': 'font/ttf',
77
+ '.txt': 'text/plain',
78
+ '.vsd': 'application/vnd.visio',
79
+ '.wav': 'audio/wav',
80
+ '.weba': 'audio/webm',
81
+ '.webm': 'video/webm',
82
+ '.webp': 'image/webp',
83
+ '.woff': 'font/woff',
84
+ '.woff2': 'font/woff2',
85
+ '.xhtml': 'application/xhtml+xml',
86
+ '.xls': 'application/vnd.ms-excel',
87
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
88
+ '.xml': 'application/xml',
89
+ '.xul': 'application/vnd.mozilla.xul+xml',
90
+ '.zip': 'application/zip',
91
+ '.3gp': 'video/3gpp',
92
+ '.3g2': 'video/3gpp2',
93
+ '.7z': 'application/x-7z-compressed',
94
+ };
95
+ return contentTypes[extension] || contentTypes['.txt'];
96
+ }
97
+ function etag(body) {
98
+ if (body.length === 0) {
99
+ // fast-path empty
100
+ return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"';
101
+ }
102
+ // compute hash of entity
103
+ const hash = crypto
104
+ .createHash('sha1')
105
+ .update(body, 'utf8')
106
+ .digest('base64')
107
+ .substring(0, 27);
108
+ // compute length of entity
109
+ const len = typeof body === 'string'
110
+ ? Buffer.byteLength(body, 'utf8')
111
+ : body.length;
112
+ return `"${len.toString(16)}-${hash}"`;
113
+ }
114
+ /**
115
+ * TODO: implement
116
+ * @param {Buffer} body
117
+ * @param {string} fileName
118
+ * @returns {boolean|string}
119
+ */
120
+ function getCharset(body, fileName) {
121
+ // Byte order mark
122
+ if (body[0] === 0xEF && body[1] === 0xBB && body[2] === 0xBF)
123
+ return 'utf8';
124
+ if (body[0] === 0xFE && body[1] === 0xFF)
125
+ return 'utf16be';
126
+ if (body[0] === 0xFF && body[1] === 0xFE)
127
+ return 'utf16le';
128
+ if (body.indexOf('') === 0)
129
+ return 'iso-8859-1';
130
+ try {
131
+ return child_process.execSync(`file -b --mime-encoding ${fileName}`).toString('utf8').trim();
132
+ }
133
+ catch (e) {
134
+ //
135
+ }
136
+ return false;
137
+ }
138
+ const staticWorker = (event, callback = () => { }) => {
139
+ debounce(() => {
140
+ console.log('Exiting static worker.');
141
+ process.exit(0);
142
+ }, 1000 * 60 * 30);
143
+ const currentPath = `${event.path.replace(/\.{2,}/, '')}${/\/$/.test(event.path) ? 'index.html' : ''}`;
144
+ const fileName = path.resolve(event.rootPath, `.${currentPath}`);
145
+ if (['GET', 'HEAD'].includes(event.httpMethod) && fs.existsSync(fileName)) {
146
+ // TODO: range request
147
+ const bodyBuffer = fs.readFileSync(fileName);
148
+ const stats = fs.statSync(fileName);
149
+ const extension = path.extname(fileName);
150
+ const contentType = getContentType(extension);
151
+ const currentEtag = etag(bodyBuffer);
152
+ const charset = getCharset(bodyBuffer, fileName);
153
+ const lastModified = new Date(stats.mtime);
154
+ let isModified = true;
155
+ if (event.headers['if-none-match'] === currentEtag) {
156
+ isModified = false;
157
+ }
158
+ else if (event.headers['if-modified-since']) {
159
+ const ifModifiedSince = new Date(event.headers['if-modified-since']);
160
+ if (ifModifiedSince.toUTCString() === lastModified.toUTCString()) {
161
+ isModified = false;
162
+ }
163
+ }
164
+ const response = {
165
+ statusCode: isModified ? 200 : 304,
166
+ headers: {
167
+ 'Content-Type': `${contentType}${charset ? `; charset=${charset}` : ''}`,
168
+ 'Cache-Control': 'public, max-age=0',
169
+ 'Content-Length': String(bodyBuffer.byteLength),
170
+ 'ETag': currentEtag,
171
+ ...(stats.mtime && { 'Last-Modified': lastModified.toUTCString() }),
172
+ },
173
+ body: isModified ? bodyBuffer.toString('base64') : '',
174
+ isBase64Encoded: true,
175
+ };
176
+ {
177
+ callback(response);
178
+ }
179
+ }
180
+ else {
181
+ callback({
182
+ statusCode: 404,
183
+ headers: {
184
+ 'Content-Type': 'text/plain',
185
+ 'Cache-Control': 'public, max-age=0',
186
+ },
187
+ body: `${fileName} does not exist`,
188
+ isBase64Encoded: false,
189
+ });
190
+ }
191
+ };
192
+
193
+ module.exports = staticWorker;
194
+ //# sourceMappingURL=staticWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticWorker.js","sources":["../src/staticWorker.ts"],"sourcesContent":[null],"names":["execSync"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type RequestEvent = {
2
+ httpMethod: string;
3
+ protocol: string;
4
+ path: string;
5
+ pathFragments: string[];
6
+ queryStringParameters: {
7
+ [key: string]: string;
8
+ };
9
+ headers: {
10
+ [key: string]: string;
11
+ };
12
+ remoteAddress: string;
13
+ body: string;
14
+ rootPath: string;
15
+ closed?: boolean;
16
+ frame?: string;
17
+ };
18
+ export type WorkerInputEvent = {
19
+ type: string;
20
+ requestId: string;
21
+ event?: RequestEvent;
22
+ };
23
+ export type WorkerOutputEvent = {
24
+ type: string;
25
+ requestId: string;
26
+ event?: ResponseEvent | WSFrameEvent;
27
+ };
28
+ export type ResponseEvent = {
29
+ statusCode: number;
30
+ headers?: {
31
+ [key: string]: string;
32
+ };
33
+ isBase64Encoded?: boolean;
34
+ emit?: boolean;
35
+ body?: string;
36
+ };
37
+ export type WSFrameEvent = {
38
+ sendWsMessage: boolean;
39
+ frame: string;
40
+ };
41
+ export type InvokableWorker = (event: RequestEvent, callback: (e: ResponseEvent) => void) => void;
@@ -0,0 +1,3 @@
1
+ /// <reference types="node" />
2
+ declare const constructWsMessage: (text: string) => Buffer;
3
+ export default constructWsMessage;
@@ -0,0 +1,3 @@
1
+ import { Request } from 'express';
2
+ declare const getClientIp: (request: Request) => string | string[];
3
+ export default getClientIp;
@@ -0,0 +1,3 @@
1
+ import { Request } from 'express';
2
+ declare const isWebSocket: (request: Request) => boolean;
3
+ export default isWebSocket;
@@ -0,0 +1,3 @@
1
+ /// <reference types="node" />
2
+ declare const parseWsMessage: (data: Buffer) => string;
3
+ export default parseWsMessage;
@@ -0,0 +1,19 @@
1
+ declare class WorkerPool {
2
+ protected readonly overallLimit: number;
3
+ protected readonly idleCheckTimeout: number;
4
+ protected readonly onExit: (code: number, workerPath: string, id: string) => void;
5
+ protected readonly workers: {};
6
+ private _creating;
7
+ constructor({ overallLimit, idleCheckTimeout, onExit }: {
8
+ overallLimit?: number;
9
+ idleCheckTimeout?: number;
10
+ onExit?: () => void;
11
+ });
12
+ onClose(): void;
13
+ getNonBusyId(workerPath: any): string;
14
+ getWorkerCountForPath(p: any): number;
15
+ getWorkerCount(): number;
16
+ isBeyondLimit(workerPath: any, limit: any): boolean;
17
+ getWorker(workerPath: any, options?: {}, limit?: number): any;
18
+ }
19
+ export default WorkerPool;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-aad82b3f.js');
4
+
5
+ /** @namespace Middleware */
6
+ /** @type {InvokableWorker} worker */
7
+ const worker = require(process.argv[2]);
8
+ /** @type {WorkerInputEvent} message */
9
+ function messageListener(message) {
10
+ if (message.type === index.WORKER_EVENT.REQUEST) {
11
+ process.send({
12
+ type: index.WORKER_EVENT.REQUEST_ACKNOWLEDGE,
13
+ requestId: message.requestId,
14
+ });
15
+ const callback = responseEvent => {
16
+ /** @type {WorkerOutputEvent} e */
17
+ const e = {
18
+ type: index.WORKER_EVENT.RESPONSE,
19
+ requestId: message.requestId,
20
+ event: responseEvent,
21
+ };
22
+ if (responseEvent.sendWsMessage)
23
+ e.type = index.WORKER_EVENT.WS_MESSAGE_SEND;
24
+ if (responseEvent.emit)
25
+ e.type = index.WORKER_EVENT.RESPONSE_EMIT;
26
+ process.send(e);
27
+ };
28
+ worker(message.event, callback);
29
+ }
30
+ if (message.type === index.WORKER_EVENT.WS_MESSAGE_RECEIVE) {
31
+ const callback = responseEvent => {
32
+ /** @type {WorkerOutputEvent} e */
33
+ const e = {
34
+ type: index.WORKER_EVENT.WS_MESSAGE_SEND,
35
+ requestId: message.requestId,
36
+ event: responseEvent,
37
+ };
38
+ process.send(e);
39
+ };
40
+ worker(message.event, callback);
41
+ }
42
+ if (message.type === index.WORKER_EVENT.WS_CONNECTION_CLOSE) {
43
+ /** @type {ResponseEvent} responseEvent */
44
+ worker({ ...message.event, closed: true }, responseEvent => {
45
+ process.send({
46
+ type: index.WORKER_EVENT.WS_CONNECTION_CLOSE_ACKNOWLEDGE,
47
+ requestId: message.requestId,
48
+ event: responseEvent,
49
+ });
50
+ });
51
+ }
52
+ }
53
+ process.on('message', messageListener);
54
+ //# sourceMappingURL=workerInvoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerInvoke.js","sources":["../src/workerInvoke.ts"],"sourcesContent":[null],"names":["WORKER_EVENT"],"mappings":";;;;AAEA;AAEA;AACA,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAExC;AACA,SAAS,eAAe,CAAC,OAAO,EAAA;AAC9B,IAAA,IAAI,OAAO,CAAC,IAAI,KAAKA,kBAAY,CAAC,OAAO,EAAG;QAC1C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAEA,kBAAY,CAAC,mBAAmB;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS;AAC7B,SAAA,CAAC,CAAC;AACH,QAAA,MAAM,QAAQ,GAAG,aAAa,IAAG;;AAE/B,YAAA,MAAM,CAAC,GAAG;gBACR,IAAI,EAAEA,kBAAY,CAAC,QAAQ;gBAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;AAC5B,gBAAA,KAAK,EAAE,aAAa;aACrB,CAAC;YACF,IAAI,aAAa,CAAC,aAAa;AAAE,gBAAA,CAAC,CAAC,IAAI,GAAGA,kBAAY,CAAC,eAAe,CAAC;YACvE,IAAI,aAAa,CAAC,IAAI;AAAE,gBAAA,CAAC,CAAC,IAAI,GAAGA,kBAAY,CAAC,aAAa,CAAC;AAC5D,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,SAAC,CAAC;AACF,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACjC,KAAA;AAED,IAAA,IAAI,OAAO,CAAC,IAAI,KAAKA,kBAAY,CAAC,kBAAkB,EAAE;AACpD,QAAA,MAAM,QAAQ,GAAG,aAAa,IAAG;;AAE/B,YAAA,MAAM,CAAC,GAAG;gBACR,IAAI,EAAEA,kBAAY,CAAC,eAAe;gBAClC,SAAS,EAAE,OAAO,CAAC,SAAS;AAC5B,gBAAA,KAAK,EAAE,aAAa;aACrB,CAAA;AACD,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,SAAC,CAAC;AACF,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACjC,KAAA;AAED,IAAA,IAAI,OAAO,CAAC,IAAI,KAAKA,kBAAY,CAAC,mBAAmB,EAAE;;AAErD,QAAA,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,aAAa,IAAG;YACzD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAEA,kBAAY,CAAC,+BAA+B;gBAClD,SAAS,EAAE,OAAO,CAAC,SAAS;AAC5B,gBAAA,KAAK,EAAE,aAAa;AACrB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AACJ,KAAA;AACH,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;;"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@koeroesi86/node-worker-express",
3
- "version": "v22.03.12-fd2e588",
3
+ "version": "v23.03.4361459321-main",
4
4
  "description": "",
5
- "main": "index.js",
5
+ "main": "dist/build",
6
6
  "author": {
7
7
  "name": "Krisztian Korosi",
8
8
  "url": "https://github.com/Koeroesi86"
@@ -12,6 +12,7 @@
12
12
  "access": "public"
13
13
  },
14
14
  "scripts": {
15
+ "build": "rm -rf ./dist && rollup -c rollup.config.js",
15
16
  "test": "echo \"Error: no test specified\" && exit 1",
16
17
  "start": "nodemon examples/server.js",
17
18
  "generate-version": "node scripts/version.js"
@@ -22,9 +23,13 @@
22
23
  "uuid": "^8.3.2"
23
24
  },
24
25
  "devDependencies": {
26
+ "@rollup/plugin-typescript": "^11.0.0",
25
27
  "@types/express": "^4.17.13",
26
28
  "@types/node": "^17.0.21",
27
29
  "express": "^4.17.3",
28
- "nodemon": "^2.0.15"
30
+ "nodemon": "^2.0.15",
31
+ "rollup": "^3.18.0",
32
+ "tslib": "^2.5.0",
33
+ "typescript": "^4.9.5"
29
34
  }
30
35
  }
@@ -0,0 +1,12 @@
1
+ const typescript = require('@rollup/plugin-typescript');
2
+
3
+ /** @type {import('rollup').RollupOptions} */
4
+ module.exports = {
5
+ input: ['./src/index.ts', './src/workerInvoke.ts', './src/staticWorker.ts'],
6
+ output: {
7
+ dir: './dist',
8
+ format: 'cjs',
9
+ sourcemap: true,
10
+ },
11
+ plugins: [typescript()]
12
+ };
package/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- language: node_js
2
- node_js:
3
- - "12"
4
- cache:
5
- yarn: true
6
- directories:
7
- - node_modules
8
- script:
9
- - export NODE_ENV=production
10
- - export TRAVIS_TAG="$(git rev-parse --short ${TRAVIS_COMMIT})"
11
- - yarn generate-version
12
- deploy:
13
- branch: master
14
- provider: npm
15
- skip_cleanup: true
16
- email: $NPM_EMAIL
17
- api_key: $NPM_TOKEN
@@ -1,12 +0,0 @@
1
- const WORKER_EVENT = {
2
- REQUEST: 'WORKER_REQUEST',
3
- REQUEST_ACKNOWLEDGE: 'WORKER_REQUEST_ACK',
4
- RESPONSE: 'WORKER_RESPONSE',
5
- RESPONSE_EMIT: 'WORKER_RESPONSE_EMIT',
6
- RESPONSE_ACKNOWLEDGE: 'WORKER_RESPONSE_ACK',
7
- WS_MESSAGE_RECEIVE: 'WS_MESSAGE_RECEIVE',
8
- WS_MESSAGE_SEND: 'WS_MESSAGE_SEND',
9
- WS_CONNECTION_CLOSE: 'WS_CONNECTION_CLOSE',
10
- WS_CONNECTION_CLOSE_ACKNOWLEDGE: 'WS_CONNECTION_CLOSE_ACK',
11
- };
12
- module.exports.WORKER_EVENT = WORKER_EVENT;
Binary file
@@ -1,60 +0,0 @@
1
- const { createHash } = require('crypto');
2
- const { STATUS_CODES } = require('http');
3
-
4
- const GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
5
- const timers = {};
6
-
7
- const createDigest = key => createHash('sha1')
8
- .update(key + GUID)
9
- .digest('base64');
10
-
11
- module.exports = (event, callback) => {
12
- if (event.protocol === 'WS' && event.frame === undefined) {
13
- const key = (event.headers['sec-websocket-key'] || '').trim();
14
- const digest = createDigest(key);
15
-
16
- if (key) {
17
- if (event.closed) {
18
- clearInterval(timers[key]);
19
- timers[key] = null;
20
- delete timers[key];
21
- return;
22
- }
23
- const body = STATUS_CODES[101];
24
- callback({
25
- statusCode: 101,
26
- headers: {
27
- Upgrade: 'websocket',
28
- Connection: 'Upgrade',
29
- 'Sec-WebSocket-Accept': `${digest}`,
30
- },
31
- body
32
- });
33
-
34
- timers[key] = setInterval(() => {
35
- const frame = JSON.stringify({ now: Date.now() })
36
- console.log('outgoing message:', frame);
37
- callback({
38
- sendWsMessage: true,
39
- frame,
40
- });
41
- }, 1000);
42
- return;
43
- }
44
- }
45
-
46
- if (event.protocol === 'WS' && event.frame !== undefined) {
47
- console.log('incoming message:', event.frame);
48
- return;
49
- }
50
-
51
- callback({
52
- statusCode: 400,
53
- headers: {
54
- 'Content-Type': 'text/html',
55
- 'Cache-Control': 'public, max-age=0',
56
- },
57
- body: '',
58
- isBase64Encoded: false,
59
- });
60
- };
@@ -1,42 +0,0 @@
1
- module.exports = (event, callback = () => {}) => {
2
- console.log(event);
3
- callback({
4
- statusCode: 200,
5
- headers: {
6
- 'Content-Type': 'text/html',
7
- 'Cache-Control': 'public, max-age=0',
8
- },
9
- body: `
10
- <!DOCTYPE html>
11
- <html lang="en">
12
- <head>
13
- <title>It ${process.env.EXAMPLE}!</title>
14
- </head>
15
- <body>
16
- <h1>It ${process.env.EXAMPLE}!</h1>
17
- <p id="time"></p>
18
- <script type="text/javascript">
19
- (function() {
20
- var timeHolder = document.getElementById('time');
21
- function connect() {
22
- var w = new WebSocket('ws://' + window.location.host + '/websocket');
23
- w.addEventListener('message', e => {
24
- var d = JSON.parse(e.data);
25
- var now = new Date(d.now);
26
- timeHolder.innerHTML = "Server time is " + now.toLocaleTimeString();
27
- w.send(JSON.stringify({ received: true }));
28
- });
29
- w.addEventListener('close', function () {
30
- setTimeout(function() {
31
- location.reload();
32
- }, 5000);
33
- });
34
- }
35
- connect();
36
- })();
37
- </script>
38
- </body>
39
- </html>`,
40
- isBase64Encoded: false,
41
- });
42
- };
@@ -1,29 +0,0 @@
1
- const middleware = require('../middleware');
2
- const express = require('express');
3
- const path = require('path');
4
-
5
- const app = express();
6
- const port = 8000;
7
- const host = 'localhost';
8
-
9
- app.use(middleware({
10
- root: path.resolve(__dirname, '../examples/public'),
11
- limit: 3,
12
- index: [
13
- 'worker.js'
14
- ],
15
- env: {
16
- EXAMPLE: 'works',
17
- },
18
- onStdout: (data) => {
19
- console.log(`[${new Date().toLocaleTimeString()}] ${data.toString().trim()}`);
20
- },
21
- onStderr: (data) => {
22
- console.error(`[${new Date().toLocaleTimeString()}] ${data.toString().trim()}`);
23
- },
24
- }));
25
-
26
- app.listen(port, host, () => {
27
- console.log(`Server running on http://${host}:${port}`);
28
- });
29
-