@koeroesi86/node-lambda-invoke 1.0.20-d1fa702 → 26.10.36900076505-master

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 (64) hide show
  1. package/README.md +4 -4
  2. package/dist/classes/FileStorage.d.ts +18 -0
  3. package/dist/classes/FileStorage.js +62 -0
  4. package/dist/classes/FileStorage.js.map +1 -0
  5. package/dist/classes/IPCStorage.d.ts +26 -0
  6. package/dist/classes/IPCStorage.js +208 -0
  7. package/dist/classes/IPCStorage.js.map +1 -0
  8. package/dist/classes/Lambda.d.ts +30 -0
  9. package/dist/classes/Lambda.js +100 -0
  10. package/dist/classes/Lambda.js.map +1 -0
  11. package/dist/classes/LambdaPool.d.ts +19 -0
  12. package/dist/classes/LambdaPool.js +74 -0
  13. package/dist/classes/LambdaPool.js.map +1 -0
  14. package/dist/classes/RequestEvent.d.ts +13 -0
  15. package/dist/classes/RequestEvent.js +6 -0
  16. package/dist/classes/RequestEvent.js.map +1 -0
  17. package/dist/classes/ResponseEvent.d.ts +8 -0
  18. package/dist/classes/ResponseEvent.js +6 -0
  19. package/dist/classes/ResponseEvent.js.map +1 -0
  20. package/dist/classes/Worker.d.ts +20 -0
  21. package/dist/classes/Worker.js +77 -0
  22. package/dist/classes/Worker.js.map +1 -0
  23. package/dist/constants/index.d.ts +5 -0
  24. package/dist/constants/index.js +10 -0
  25. package/dist/constants/index.js.map +1 -0
  26. package/dist/index.d.ts +10 -0
  27. package/dist/index.js +17 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/middlewares/http.d.ts +5 -0
  30. package/dist/middlewares/http.js +75 -0
  31. package/dist/middlewares/http.js.map +1 -0
  32. package/dist/middlewares/invoke.d.ts +1 -0
  33. package/dist/middlewares/invoke.js +48 -0
  34. package/dist/middlewares/invoke.js.map +1 -0
  35. package/dist/middlewares/stdoutListener.d.ts +4 -0
  36. package/dist/middlewares/stdoutListener.js +27 -0
  37. package/dist/middlewares/stdoutListener.js.map +1 -0
  38. package/dist/registry/communication.json +12 -0
  39. package/dist/registry/index.d.ts +2 -0
  40. package/dist/registry/index.js +19 -0
  41. package/dist/registry/index.js.map +1 -0
  42. package/dist/types.d.ts +36 -0
  43. package/dist/types.js +3 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/utils/sendToParent.d.ts +3 -0
  46. package/dist/utils/sendToParent.js +10 -0
  47. package/dist/utils/sendToParent.js.map +1 -0
  48. package/example/example.js +1 -1
  49. package/package.json +28 -11
  50. package/.travis.yml +0 -16
  51. package/classes/FileStorage.js +0 -114
  52. package/classes/IPCStorage.js +0 -216
  53. package/classes/Lambda.js +0 -124
  54. package/classes/LambdaPool.js +0 -78
  55. package/classes/RequestEvent.js +0 -15
  56. package/classes/ResponseEvent.js +0 -12
  57. package/classes/Worker.js +0 -93
  58. package/constants/index.js +0 -8
  59. package/index.js +0 -9
  60. package/middlewares/http.js +0 -111
  61. package/middlewares/invoke.js +0 -50
  62. package/middlewares/stdoutListener.js +0 -27
  63. package/registry/communication.json +0 -12
  64. package/scripts/version.js +0 -10
package/README.md CHANGED
@@ -1,16 +1,16 @@
1
- # Node Lambda invoke [![Build status](https://api.travis-ci.org/Koeroesi86/node-lambda-invoke.svg?branch=master)](https://travis-ci.org/Koeroesi86/node-lambda-invoke)
1
+ # Node Lambda invoke
2
2
 
3
3
  A library that can be easily used for AWS lambda functions locally
4
4
 
5
5
  ## Dependencies
6
6
 
7
7
  * [Node](https://nodejs.org/en/)
8
- * [Yarn](https://yarnpkg.com/lang/en/) (optional)
8
+ * [pnpm](https://pnpm.io/) (for development in this workspace)
9
9
 
10
10
  ## Usage
11
11
 
12
12
  ```bash
13
- yarn add @koeroesi86/node-lambda-invoke
13
+ pnpm add @koeroesi86/node-lambda-invoke
14
14
  ```
15
15
 
16
16
  Or with npm
@@ -53,7 +53,7 @@ http
53
53
  ## Running locally
54
54
 
55
55
  ```bash
56
- yarn start
56
+ pnpm start
57
57
  ```
58
58
 
59
59
  ## Configuration
@@ -0,0 +1,18 @@
1
+ import type RequestEvent from './RequestEvent';
2
+ import type ResponseEvent from './ResponseEvent';
3
+ /** loaded by file path, so it has to stay a CommonJS `module.exports` */
4
+ declare class FileStorage {
5
+ readonly id: string;
6
+ static requestBase: string;
7
+ static responseBase: string;
8
+ static start(): void;
9
+ constructor(id: string);
10
+ get requestPath(): string;
11
+ get responsePath(): string;
12
+ setResponse(response: ResponseEvent): Promise<void>;
13
+ getResponse(): Promise<ResponseEvent>;
14
+ setRequest(request: RequestEvent): Promise<void>;
15
+ getRequest(): Promise<RequestEvent>;
16
+ destroy(): Promise<[void, void]>;
17
+ }
18
+ export = FileStorage;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const path_1 = require("path");
6
+ const fs_1 = require("fs");
7
+ const rimraf_1 = __importDefault(require("rimraf"));
8
+ const constants_1 = require("../constants");
9
+ const serializer = {
10
+ serialize: (data) => JSON.stringify(data),
11
+ deserialize: (data) => JSON.parse(data),
12
+ };
13
+ const Driver = {
14
+ save: (path, data) => new Promise((res, rej) => (0, fs_1.writeFile)(path, data, 'utf8', (err) => (err ? rej(err) : res()))),
15
+ restore: (path) => new Promise((res, rej) => (0, fs_1.readFile)(path, 'utf8', (err, data) => (err ? rej(err) : res(data)))),
16
+ destroy: (path) => new Promise((res, rej) => ((0, fs_1.existsSync)(path) ? (0, fs_1.unlink)(path, (err) => (err ? rej(err) : res())) : setTimeout(res, 0))),
17
+ };
18
+ /** loaded by file path, so it has to stay a CommonJS `module.exports` */
19
+ class FileStorage {
20
+ id;
21
+ static requestBase = (0, path_1.resolve)(constants_1.PACKAGE_ROOT, 'requests/');
22
+ static responseBase = (0, path_1.resolve)(constants_1.PACKAGE_ROOT, 'responses/');
23
+ static start() {
24
+ rimraf_1.default.sync((0, path_1.resolve)(FileStorage.requestBase, './*'));
25
+ rimraf_1.default.sync((0, path_1.resolve)(FileStorage.responseBase, './*'));
26
+ if (!(0, fs_1.existsSync)(FileStorage.requestBase))
27
+ (0, fs_1.mkdirSync)(FileStorage.requestBase, { recursive: true });
28
+ if (!(0, fs_1.existsSync)(FileStorage.responseBase))
29
+ (0, fs_1.mkdirSync)(FileStorage.responseBase, { recursive: true });
30
+ }
31
+ constructor(id) {
32
+ this.id = id;
33
+ this.setResponse = this.setResponse.bind(this);
34
+ this.getResponse = this.getResponse.bind(this);
35
+ this.setRequest = this.setRequest.bind(this);
36
+ this.getRequest = this.getRequest.bind(this);
37
+ this.destroy = this.destroy.bind(this);
38
+ }
39
+ get requestPath() {
40
+ return (0, path_1.resolve)(FileStorage.requestBase, `./${this.id}`);
41
+ }
42
+ get responsePath() {
43
+ return (0, path_1.resolve)(FileStorage.responseBase, `./${this.id}`);
44
+ }
45
+ setResponse(response) {
46
+ return Driver.save(this.responsePath, serializer.serialize(response));
47
+ }
48
+ getResponse() {
49
+ return Driver.restore(this.responsePath).then((data) => serializer.deserialize(data));
50
+ }
51
+ setRequest(request) {
52
+ return Driver.save(this.requestPath, serializer.serialize(request));
53
+ }
54
+ getRequest() {
55
+ return Driver.restore(this.requestPath).then((data) => serializer.deserialize(data));
56
+ }
57
+ destroy() {
58
+ return Promise.all([Driver.destroy(this.responsePath), Driver.destroy(this.requestPath)]);
59
+ }
60
+ }
61
+ module.exports = FileStorage;
62
+ //# sourceMappingURL=FileStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileStorage.js","sourceRoot":"","sources":["../../src/classes/FileStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import Lambda from './Lambda';
2
+ import Worker from './Worker';
3
+ import type RequestEvent from './RequestEvent';
4
+ import type ResponseEvent from './ResponseEvent';
5
+ import type { StorageInstance } from '../types';
6
+ /** loaded by file path, so it has to stay a CommonJS `module.exports` */
7
+ declare class IPCStorage {
8
+ readonly id: string;
9
+ readonly instance: StorageInstance;
10
+ static start(): void;
11
+ constructor(id: string, instance: StorageInstance);
12
+ /** the message endpoint of a worker or process, a lambda is not able to exchange messages this way */
13
+ private get endpoint();
14
+ invoker(lambda: Lambda): void;
15
+ invokerMessageListener(message: unknown): void;
16
+ executor(instance: Worker | NodeJS.Process): void;
17
+ executorMessageListener(message: unknown): void;
18
+ get requestKey(): string;
19
+ get responseKey(): string;
20
+ setResponse(response: ResponseEvent): Promise<void>;
21
+ getResponse(): Promise<ResponseEvent>;
22
+ setRequest(request: RequestEvent): Promise<void>;
23
+ getRequest(): Promise<RequestEvent>;
24
+ destroy(): Promise<void>;
25
+ }
26
+ export = IPCStorage;
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const Lambda_1 = __importDefault(require("./Lambda"));
6
+ const Worker_1 = __importDefault(require("./Worker"));
7
+ const sendToParent_1 = __importDefault(require("../utils/sendToParent"));
8
+ const MESSAGES = {
9
+ GET_RESONSE: 'GW_GET_RESONSE',
10
+ SET_RESONSE: 'GW_SET_RESONSE',
11
+ SET_RESONSE_FINISHED: 'GW_SET_RESONSE_FINISHED',
12
+ GET_REQUEST: 'GW_GET_REQUEST',
13
+ SET_REQUEST: 'GW_SET_REQUEST',
14
+ SET_REQUEST_FINISHED: 'GW_SET_REQUEST_FINISHED',
15
+ DESTROY: 'GW_DESTROY',
16
+ };
17
+ let requests = {};
18
+ let responses = {};
19
+ const getRequestKey = (id) => `request-${id}`;
20
+ const getResponseKey = (id) => `response-${id}`;
21
+ const isIpcMessage = (message) => typeof message === 'object' && message !== null && 'type' in message && 'id' in message;
22
+ const toEndpoint = (instance) => {
23
+ if (instance instanceof Worker_1.default) {
24
+ return {
25
+ on: (listener) => instance.on('message', listener),
26
+ off: (listener) => instance.off('message', listener),
27
+ send: (message) => instance.send(message),
28
+ };
29
+ }
30
+ return {
31
+ on: (listener) => instance.on('message', listener),
32
+ off: (listener) => instance.off('message', listener),
33
+ send: (message) => {
34
+ if (!instance.send)
35
+ throw new Error('There is no IPC channel to the parent process.');
36
+ instance.send(message);
37
+ },
38
+ };
39
+ };
40
+ process.on('message', (message) => {
41
+ if (!isIpcMessage(message))
42
+ return;
43
+ if (message.type === MESSAGES.SET_REQUEST) {
44
+ requests[getRequestKey(message.id)] = message.payload;
45
+ (0, sendToParent_1.default)({ type: MESSAGES.SET_REQUEST_FINISHED, id: message.id });
46
+ }
47
+ if (message.type === MESSAGES.SET_RESONSE) {
48
+ responses[getResponseKey(message.id)] = message.payload;
49
+ (0, sendToParent_1.default)({ type: MESSAGES.SET_RESONSE_FINISHED, id: message.id });
50
+ }
51
+ // if (message.type === MESSAGES.DESTROY) {
52
+ // const requestId = getResponseKey(message.id);
53
+ // delete storage[requestId];
54
+ // const responseId = getResponseKey(message.id);
55
+ // delete storage[responseId];
56
+ // }
57
+ });
58
+ /** loaded by file path, so it has to stay a CommonJS `module.exports` */
59
+ class IPCStorage {
60
+ id;
61
+ instance;
62
+ static start() {
63
+ requests = {};
64
+ responses = {};
65
+ }
66
+ constructor(id, instance) {
67
+ this.id = id;
68
+ this.instance = instance;
69
+ this.setResponse = this.setResponse.bind(this);
70
+ this.getResponse = this.getResponse.bind(this);
71
+ this.setRequest = this.setRequest.bind(this);
72
+ this.getRequest = this.getRequest.bind(this);
73
+ this.destroy = this.destroy.bind(this);
74
+ this.invoker = this.invoker.bind(this);
75
+ this.executor = this.executor.bind(this);
76
+ this.invokerMessageListener = this.invokerMessageListener.bind(this);
77
+ this.executorMessageListener = this.executorMessageListener.bind(this);
78
+ if (this.instance instanceof Lambda_1.default) {
79
+ this.invoker(this.instance);
80
+ }
81
+ else {
82
+ this.executor(this.instance);
83
+ }
84
+ }
85
+ /** the message endpoint of a worker or process, a lambda is not able to exchange messages this way */
86
+ get endpoint() {
87
+ if (this.instance instanceof Lambda_1.default) {
88
+ throw new Error('A storage attached to a lambda can only be destroyed.');
89
+ }
90
+ return toEndpoint(this.instance);
91
+ }
92
+ invoker(lambda) {
93
+ lambda.addEventListener('message', this.invokerMessageListener);
94
+ }
95
+ invokerMessageListener(message) {
96
+ if (!isIpcMessage(message) || !(this.instance instanceof Lambda_1.default))
97
+ return;
98
+ if (message.type === MESSAGES.GET_REQUEST) {
99
+ const item = requests[getRequestKey(message.id)];
100
+ if (item) {
101
+ this.instance.postMessage({ type: MESSAGES.SET_REQUEST, id: message.id, payload: item });
102
+ }
103
+ }
104
+ if (message.type === MESSAGES.SET_RESONSE) {
105
+ responses[getResponseKey(message.id)] = message.payload;
106
+ this.instance.postMessage({ type: MESSAGES.SET_RESONSE_FINISHED, id: message.id });
107
+ }
108
+ }
109
+ executor(instance) {
110
+ toEndpoint(instance).on(this.executorMessageListener);
111
+ }
112
+ executorMessageListener(message) {
113
+ if (!isIpcMessage(message))
114
+ return;
115
+ if (message.type === MESSAGES.SET_REQUEST) {
116
+ requests[getRequestKey(message.id)] = message.payload;
117
+ (0, sendToParent_1.default)({ type: MESSAGES.SET_REQUEST_FINISHED, id: message.id });
118
+ }
119
+ if (message.type === MESSAGES.GET_RESONSE) {
120
+ const item = responses[getResponseKey(message.id)];
121
+ if (item) {
122
+ (0, sendToParent_1.default)({ type: MESSAGES.SET_RESONSE, id: message.id, payload: item });
123
+ }
124
+ }
125
+ }
126
+ get requestKey() {
127
+ return getRequestKey(this.id);
128
+ }
129
+ get responseKey() {
130
+ return getResponseKey(this.id);
131
+ }
132
+ setResponse(response) {
133
+ responses[this.responseKey] = response;
134
+ return new Promise((resolve) => {
135
+ const { endpoint } = this;
136
+ const finishListener = (message) => {
137
+ if (isIpcMessage(message) && message.type === MESSAGES.SET_RESONSE_FINISHED && message.id === this.id) {
138
+ resolve();
139
+ endpoint.off(finishListener);
140
+ }
141
+ };
142
+ endpoint.on(finishListener);
143
+ endpoint.send({ type: MESSAGES.SET_RESONSE, id: this.id, payload: response });
144
+ });
145
+ }
146
+ getResponse() {
147
+ return new Promise((resolve) => {
148
+ const stored = responses[this.responseKey];
149
+ if (stored)
150
+ return resolve(stored);
151
+ const { endpoint } = this;
152
+ const finishListener = (message) => {
153
+ if (isIpcMessage(message) && message.type === MESSAGES.SET_RESONSE && message.id === this.id) {
154
+ responses[this.responseKey] = message.payload;
155
+ resolve(message.payload);
156
+ endpoint.off(finishListener);
157
+ }
158
+ };
159
+ endpoint.on(finishListener);
160
+ endpoint.send({ type: MESSAGES.GET_RESONSE, id: this.id });
161
+ });
162
+ }
163
+ setRequest(request) {
164
+ requests[this.requestKey] = request;
165
+ return new Promise((resolve) => {
166
+ const { endpoint } = this;
167
+ const finishListener = (message) => {
168
+ if (isIpcMessage(message) && message.type === MESSAGES.SET_REQUEST_FINISHED && message.id === this.id) {
169
+ resolve();
170
+ endpoint.off(finishListener);
171
+ }
172
+ };
173
+ endpoint.on(finishListener);
174
+ endpoint.send({ type: MESSAGES.SET_REQUEST, id: this.id, payload: request });
175
+ });
176
+ }
177
+ getRequest() {
178
+ return new Promise((resolve) => {
179
+ const stored = requests[this.requestKey];
180
+ if (stored)
181
+ return resolve(stored);
182
+ const { endpoint } = this;
183
+ const finishListener = (message) => {
184
+ if (isIpcMessage(message) && message.type === MESSAGES.SET_REQUEST && message.id === this.id) {
185
+ requests[this.requestKey] = message.payload;
186
+ resolve(message.payload);
187
+ endpoint.off(finishListener);
188
+ // this.instance.send({ type: MESSAGES.SET_REQUEST_FINISHED, id: message.id })
189
+ }
190
+ };
191
+ endpoint.on(finishListener);
192
+ endpoint.send({ type: MESSAGES.GET_REQUEST, id: this.id });
193
+ });
194
+ }
195
+ destroy() {
196
+ delete requests[this.requestKey];
197
+ delete responses[this.responseKey];
198
+ if (this.instance instanceof Lambda_1.default) {
199
+ this.instance.removeEventListener('message', this.invokerMessageListener);
200
+ }
201
+ else {
202
+ toEndpoint(this.instance).off(this.executorMessageListener);
203
+ }
204
+ return Promise.resolve();
205
+ }
206
+ }
207
+ module.exports = IPCStorage;
208
+ //# sourceMappingURL=IPCStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPCStorage.js","sourceRoot":"","sources":["../../src/classes/IPCStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import Worker from './Worker';
2
+ import type RequestEvent from './RequestEvent';
3
+ import type ResponseEvent from './ResponseEvent';
4
+ import type { Communication, LambdaEvent, Listener, Logger, StorageDriverConstructor } from '../types';
5
+ declare class Lambda {
6
+ private readonly _path;
7
+ private readonly _handler;
8
+ private readonly _logger;
9
+ private readonly _storagePath;
10
+ private readonly _communication;
11
+ private _storage?;
12
+ private _requestId?;
13
+ private _callback;
14
+ readonly StorageDriver: StorageDriverConstructor;
15
+ instance: Worker | null;
16
+ busy: boolean;
17
+ createdAt?: number;
18
+ constructor(path: string, handler: string, logger: Logger | undefined, communication: Communication);
19
+ get stdout(): import("stream").Readable | null | undefined;
20
+ get stderr(): import("stream").Readable | null | undefined;
21
+ createInstance(): Worker;
22
+ invoke(requestId: string, requestEvent: RequestEvent, callback?: (response: ResponseEvent) => void): void;
23
+ /** @private */
24
+ _onFinished(event: LambdaEvent): void;
25
+ addEventListener(event: string, listener: Listener): void;
26
+ addEventListenerOnce(event: string, listener: Listener): void;
27
+ removeEventListener(event: string, listener: Listener): void;
28
+ postMessage(message: Parameters<Worker['postMessage']>[0], cb?: Parameters<Worker['postMessage']>[1]): void;
29
+ }
30
+ export default Lambda;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = require("path");
7
+ const Worker_1 = __importDefault(require("./Worker"));
8
+ const constants_1 = require("../constants");
9
+ const registry_1 = require("../registry");
10
+ class Lambda {
11
+ _path;
12
+ _handler;
13
+ _logger;
14
+ _storagePath;
15
+ _communication;
16
+ _storage;
17
+ _requestId;
18
+ _callback = () => { };
19
+ StorageDriver;
20
+ instance;
21
+ busy;
22
+ createdAt;
23
+ constructor(path, handler, logger = () => { }, communication) {
24
+ this._path = path;
25
+ this._handler = handler;
26
+ this._logger = logger;
27
+ this._storagePath = (0, registry_1.getRegisteredPath)(communication.type);
28
+ this._communication = communication;
29
+ this.StorageDriver = require(this._storagePath);
30
+ const instance = this.createInstance();
31
+ this.instance = instance;
32
+ this.busy = false;
33
+ const killTimer = setTimeout(() => {
34
+ this._logger('Shutting down lambda.');
35
+ if (this.instance) {
36
+ this.instance.terminate();
37
+ this.instance = null;
38
+ }
39
+ }, 15 * 60 * 1000);
40
+ instance.addEventListenerOnce('close', () => {
41
+ this.instance = null;
42
+ clearTimeout(killTimer);
43
+ });
44
+ this._onFinished = this._onFinished.bind(this);
45
+ }
46
+ get stdout() {
47
+ return this.instance?.stdout;
48
+ }
49
+ get stderr() {
50
+ return this.instance?.stderr;
51
+ }
52
+ createInstance() {
53
+ return new Worker_1.default((0, path_1.resolve)(__dirname, '../middlewares/invoke.js'), {
54
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
55
+ env: {
56
+ LAMBDA: this._path,
57
+ HANDLER: this._handler,
58
+ COMMUNICATION: JSON.stringify(this._communication),
59
+ },
60
+ });
61
+ }
62
+ invoke(requestId, requestEvent, callback = () => { }) {
63
+ if (!this.instance)
64
+ this.instance = this.createInstance();
65
+ const { instance } = this;
66
+ const storage = new this.StorageDriver(requestId, instance);
67
+ this._storage = storage;
68
+ Promise.resolve()
69
+ .then(() => storage.setRequest(requestEvent))
70
+ .then(() => {
71
+ this.busy = true;
72
+ this._requestId = requestId;
73
+ this._callback = callback;
74
+ instance.addEventListener('message', this._onFinished);
75
+ instance.postMessage({ type: constants_1.EVENT_REQUEST, id: requestId });
76
+ });
77
+ }
78
+ /** @private */
79
+ _onFinished(event) {
80
+ if (event.type === constants_1.EVENT_RESPONSE && event.id === this._requestId) {
81
+ this.busy = false;
82
+ this.instance?.removeEventListener('message', this._onFinished);
83
+ this._storage?.getResponse().then((responseEvent) => this._callback(responseEvent));
84
+ }
85
+ }
86
+ addEventListener(event, listener) {
87
+ this.instance?.addEventListener(event, listener);
88
+ }
89
+ addEventListenerOnce(event, listener) {
90
+ this.instance?.addEventListenerOnce(event, listener);
91
+ }
92
+ removeEventListener(event, listener) {
93
+ this.instance?.removeEventListener(event, listener);
94
+ }
95
+ postMessage(message, cb = () => { }) {
96
+ this.instance?.postMessage(message, cb);
97
+ }
98
+ }
99
+ exports.default = Lambda;
100
+ //# sourceMappingURL=Lambda.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lambda.js","sourceRoot":"","sources":["../../src/classes/Lambda.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import Lambda from './Lambda';
2
+ import type { Communication, Logger } from '../types';
3
+ interface LambdaPoolOptions {
4
+ overallLimit?: number;
5
+ logger?: Logger;
6
+ communication: Communication;
7
+ }
8
+ declare class LambdaPool {
9
+ readonly communication: Communication;
10
+ readonly overallLimit?: number;
11
+ readonly logger: Logger;
12
+ constructor({ overallLimit, logger, communication }: LambdaPoolOptions);
13
+ createLambda(lambdaToInvoke: string, handlerKey: string): Promise<{
14
+ id: string;
15
+ instance: Lambda;
16
+ }>;
17
+ getLambda(lambdaToInvoke: string, handlerKey: string): Promise<Lambda>;
18
+ }
19
+ export default LambdaPool;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const uuid_1 = __importDefault(require("uuid"));
7
+ const Lambda_1 = __importDefault(require("./Lambda"));
8
+ const stdoutListener_1 = __importDefault(require("../middlewares/stdoutListener"));
9
+ const constants_1 = require("../constants");
10
+ const lambdaInstances = {};
11
+ function getOverallCount() {
12
+ return Object.keys(lambdaInstances).reduce((result, current) => Object.keys(lambdaInstances[current]).length + result, 0);
13
+ }
14
+ function getNonBusyId(lambdaToInvoke) {
15
+ const timeLimit = Date.now() - 15 * 60 * 1000 + 5000; // lifespan of lambda, to give enough time to respond before killed
16
+ return Object.keys(lambdaInstances[lambdaToInvoke] || {}).find((id) => {
17
+ const instance = lambdaInstances[lambdaToInvoke][id];
18
+ return !instance.busy && instance.createdAt !== undefined && instance.createdAt >= timeLimit;
19
+ });
20
+ }
21
+ class LambdaPool {
22
+ communication;
23
+ overallLimit;
24
+ logger;
25
+ constructor({ overallLimit, logger = () => { }, communication }) {
26
+ this.communication = communication;
27
+ this.overallLimit = overallLimit;
28
+ this.logger = logger;
29
+ this.getLambda = this.getLambda.bind(this);
30
+ this.createLambda = this.createLambda.bind(this);
31
+ }
32
+ createLambda(lambdaToInvoke, handlerKey) {
33
+ return new Promise((resolve) => {
34
+ const currentId = uuid_1.default.v4();
35
+ const currentLambdaInstance = new Lambda_1.default(lambdaToInvoke, handlerKey, this.logger, this.communication);
36
+ const lambdaStartListener = (message) => {
37
+ if (message.type === constants_1.EVENT_STARTED) {
38
+ this.logger(`[${currentId}] started`);
39
+ currentLambdaInstance.removeEventListener('message', lambdaStartListener);
40
+ resolve({ id: currentId, instance: currentLambdaInstance });
41
+ }
42
+ };
43
+ currentLambdaInstance.addEventListener('message', lambdaStartListener);
44
+ currentLambdaInstance.addEventListenerOnce('close', (code) => {
45
+ if (code)
46
+ this.logger(`[${currentId}] Lambda exited with code ${code}`);
47
+ });
48
+ (0, stdoutListener_1.default)(currentLambdaInstance, this.logger);
49
+ });
50
+ }
51
+ getLambda(lambdaToInvoke, handlerKey) {
52
+ const nonBusyId = getNonBusyId(lambdaToInvoke);
53
+ if (this.overallLimit !== undefined && getOverallCount() >= this.overallLimit) {
54
+ return Promise.resolve()
55
+ .then(() => new Promise((r) => setTimeout(r, 100)))
56
+ .then(() => this.getLambda(lambdaToInvoke, handlerKey));
57
+ }
58
+ if (!lambdaInstances[lambdaToInvoke] || !nonBusyId) {
59
+ return Promise.resolve()
60
+ .then(() => this.createLambda(lambdaToInvoke, handlerKey))
61
+ .then(({ id, instance }) => {
62
+ instance.createdAt = Date.now();
63
+ lambdaInstances[lambdaToInvoke] = {
64
+ ...lambdaInstances[lambdaToInvoke],
65
+ [id]: instance,
66
+ };
67
+ return instance;
68
+ });
69
+ }
70
+ return Promise.resolve(lambdaInstances[lambdaToInvoke][nonBusyId]);
71
+ }
72
+ }
73
+ exports.default = LambdaPool;
74
+ //# sourceMappingURL=LambdaPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LambdaPool.js","sourceRoot":"","sources":["../../src/classes/LambdaPool.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,sDAA8B;AAC9B,mFAA2D;AAC3D,4CAA6C;AAS7C,MAAM,eAAe,GAA2C,EAAE,CAAC;AAEnE,SAAS,eAAe;IACtB,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5H,CAAC;AAED,SAAS,YAAY,CAAC,cAAsB;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,mEAAmE;IACzH,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QACpE,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU;IACL,aAAa,CAAgB;IAC7B,YAAY,CAAU;IACtB,MAAM,CAAS;IAExB,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,aAAa,EAAqB;QAC/E,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,YAAY,CAAC,cAAsB,EAAE,UAAkB;QACrD,OAAO,IAAI,OAAO,CAAmC,CAAC,OAAO,EAAE,EAAE;YAC/D,MAAM,SAAS,GAAG,cAAI,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,qBAAqB,GAAG,IAAI,gBAAM,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAEtG,MAAM,mBAAmB,GAAG,CAAC,OAAoB,EAAE,EAAE;gBACnD,IAAI,OAAO,CAAC,IAAI,KAAK,yBAAa,EAAE,CAAC;oBACnC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,WAAW,CAAC,CAAC;oBACtC,qBAAqB,CAAC,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;oBAC1E,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC,CAAC;YACF,qBAAqB,CAAC,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YAEvE,qBAAqB,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;gBAC1E,IAAI,IAAI;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,6BAA6B,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,IAAA,wBAAc,EAAC,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,cAAsB,EAAE,UAAkB;QAClD,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,eAAe,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9E,OAAO,OAAO,CAAC,OAAO,EAAE;iBACrB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;iBAClD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACnD,OAAO,OAAO,CAAC,OAAO,EAAE;iBACrB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBACzD,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACzB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,eAAe,CAAC,cAAc,CAAC,GAAG;oBAChC,GAAG,eAAe,CAAC,cAAc,CAAC;oBAClC,CAAC,EAAE,CAAC,EAAE,QAAQ;iBACf,CAAC;gBAEF,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,CAAC;CACF;AAED,kBAAe,UAAU,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { IncomingHttpHeaders } from 'http';
2
+ import type { ParsedUrlQuery } from 'querystring';
3
+ declare class RequestEvent {
4
+ path: string;
5
+ headers: IncomingHttpHeaders;
6
+ pathParameters?: Record<string, string>;
7
+ requestContext?: object;
8
+ resource?: string;
9
+ httpMethod: string;
10
+ queryStringParameters: ParsedUrlQuery;
11
+ stageVariables?: Record<string, string>;
12
+ }
13
+ export default RequestEvent;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class RequestEvent {
4
+ }
5
+ exports.default = RequestEvent;
6
+ //# sourceMappingURL=RequestEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestEvent.js","sourceRoot":"","sources":["../../src/classes/RequestEvent.ts"],"names":[],"mappings":";;AAGA,MAAM,YAAY;CASjB;AAED,kBAAe,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { OutgoingHttpHeaders } from 'http';
2
+ declare class ResponseEvent {
3
+ statusCode?: number;
4
+ headers?: OutgoingHttpHeaders;
5
+ body?: string;
6
+ isBase64Encoded?: boolean;
7
+ }
8
+ export default ResponseEvent;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class ResponseEvent {
4
+ }
5
+ exports.default = ResponseEvent;
6
+ //# sourceMappingURL=ResponseEvent.js.map