@koeroesi86/node-lambda-invoke 26.10.36916718511-master → 26.10.37633705232-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.
package/README.md CHANGED
@@ -30,7 +30,7 @@ const port = 8080;
30
30
  const lambdaPath = './pathOfLambda.js';
31
31
  const handlerKey = 'handler';
32
32
  const logger = console.log;
33
- const limit = 100; // overall limit ox running lambdas
33
+ const limit = 100; // overall limit of running lambdas, defaults to the number of CPU cores, 0 for no limit
34
34
 
35
35
  http
36
36
  .createServer(httpMiddleware({
@@ -1,6 +1,6 @@
1
1
  import Worker from './Worker';
2
2
  import type RequestEvent from './RequestEvent';
3
- import type ResponseEvent from './ResponseEvent';
3
+ import ResponseEvent from './ResponseEvent';
4
4
  import type { Communication, LambdaEvent, Listener, Logger, StorageDriverConstructor } from '../types';
5
5
  declare class Lambda {
6
6
  private readonly _path;
@@ -7,6 +7,7 @@ const path_1 = require("path");
7
7
  const Worker_1 = __importDefault(require("./Worker"));
8
8
  const constants_1 = require("../constants");
9
9
  const registry_1 = require("../registry");
10
+ const ResponseEvent_1 = __importDefault(require("./ResponseEvent"));
10
11
  class Lambda {
11
12
  _path;
12
13
  _handler;
@@ -53,6 +54,7 @@ class Lambda {
53
54
  return new Worker_1.default((0, path_1.resolve)(__dirname, '../middlewares/invoke.js'), {
54
55
  stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
55
56
  env: {
57
+ ...process.env,
56
58
  LAMBDA: this._path,
57
59
  HANDLER: this._handler,
58
60
  COMMUNICATION: JSON.stringify(this._communication),
@@ -73,14 +75,28 @@ class Lambda {
73
75
  this._callback = callback;
74
76
  instance.addEventListener('message', this._onFinished);
75
77
  instance.postMessage({ type: constants_1.EVENT_REQUEST, id: requestId });
78
+ })
79
+ .catch((error) => {
80
+ // the lambda was not given the request, so it is free again and the request is answered with the failure
81
+ this.busy = false;
82
+ this._logger(error);
83
+ callback(Object.assign(new ResponseEvent_1.default(), { statusCode: 500, body: 'Something went wrong.' }));
76
84
  });
77
85
  }
78
86
  /** @private */
79
87
  _onFinished(event) {
80
88
  if (event.type === constants_1.EVENT_RESPONSE && event.id === this._requestId) {
81
- this.busy = false;
89
+ // the next request replaces these as soon as the lambda is free
90
+ const { _storage: storage, _callback: callback } = this;
82
91
  this.instance?.removeEventListener('message', this._onFinished);
83
- this._storage?.getResponse().then((responseEvent) => this._callback(responseEvent));
92
+ storage
93
+ ?.getResponse()
94
+ .then((responseEvent) => callback(responseEvent))
95
+ // the storage listens to the messages of the lambda until it is destroyed
96
+ .finally(() => storage.destroy())
97
+ .finally(() => {
98
+ this.busy = false;
99
+ });
84
100
  }
85
101
  }
86
102
  addEventListener(event, listener) {
@@ -1 +1 @@
1
- {"version":3,"file":"Lambda.js","sourceRoot":"","sources":["../../src/classes/Lambda.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Lambda.js","sourceRoot":"","sources":["../../src/classes/Lambda.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,44 @@
1
1
  import Lambda from './Lambda';
2
2
  import type { Communication, Logger } from '../types';
3
3
  interface LambdaPoolOptions {
4
+ /** how many lambdas may run in total, 0 or nothing for no limit */
4
5
  overallLimit?: number;
6
+ /** how long a request may wait for a lambda when the limit is reached, in milliseconds */
7
+ acquireTimeout?: number;
5
8
  logger?: Logger;
6
9
  communication: Communication;
7
10
  }
11
+ /** the limit is reached and no lambda became free in time */
12
+ export declare class LambdaUnavailableError extends Error {
13
+ }
14
+ /** what the lambdas are doing right now, for metrics */
15
+ export declare function getLambdaStats(): {
16
+ lambdas: number;
17
+ /** lambdas that were asked for and have not announced themselves yet */
18
+ starting: number;
19
+ busy: number;
20
+ files: {
21
+ [k: string]: {
22
+ lambdas: number;
23
+ busy: number;
24
+ };
25
+ };
26
+ };
8
27
  declare class LambdaPool {
9
28
  readonly communication: Communication;
10
- readonly overallLimit?: number;
29
+ readonly overallLimit: number;
30
+ readonly acquireTimeout: number;
11
31
  readonly logger: Logger;
12
- constructor({ overallLimit, logger, communication }: LambdaPoolOptions);
32
+ constructor({ overallLimit, acquireTimeout, logger, communication }: LambdaPoolOptions);
13
33
  createLambda(lambdaToInvoke: string, handlerKey: string): Promise<{
14
34
  id: string;
15
35
  instance: Lambda;
16
36
  }>;
37
+ private startLambda;
38
+ /**
39
+ * Hands out a lambda for the file: a free one, otherwise a new one while the limit allows, otherwise the request waits for one to become free.
40
+ * Rejects with a LambdaUnavailableError when that takes longer than the acquire timeout.
41
+ */
17
42
  getLambda(lambdaToInvoke: string, handlerKey: string): Promise<Lambda>;
18
43
  }
19
44
  export default LambdaPool;
@@ -3,36 +3,80 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LambdaUnavailableError = void 0;
7
+ exports.getLambdaStats = getLambdaStats;
6
8
  const uuid_1 = __importDefault(require("uuid"));
7
9
  const Lambda_1 = __importDefault(require("./Lambda"));
8
10
  const stdoutListener_1 = __importDefault(require("../middlewares/stdoutListener"));
9
11
  const constants_1 = require("../constants");
10
- const lambdaInstances = {};
12
+ /** the limit is reached and no lambda became free in time */
13
+ class LambdaUnavailableError extends Error {
14
+ }
15
+ exports.LambdaUnavailableError = LambdaUnavailableError;
16
+ const pollInterval = 5;
17
+ const lambdaInstances = new Map();
18
+ /** lambdas that were asked for but have not announced themselves yet, they count against the limit as well */
19
+ const starting = new Map();
20
+ const getCount = (lambdaToInvoke) => (lambdaInstances.get(lambdaToInvoke)?.size ?? 0) + (starting.get(lambdaToInvoke) ?? 0);
11
21
  function getOverallCount() {
12
- return Object.keys(lambdaInstances).reduce((result, current) => Object.keys(lambdaInstances[current]).length + result, 0);
22
+ return Array.from(new Set([...lambdaInstances.keys(), ...starting.keys()])).reduce((result, current) => getCount(current) + result, 0);
23
+ }
24
+ /** what the lambdas are doing right now, for metrics */
25
+ function getLambdaStats() {
26
+ return {
27
+ lambdas: getOverallCount(),
28
+ /** lambdas that were asked for and have not announced themselves yet */
29
+ starting: Array.from(starting.values()).reduce((result, current) => result + current, 0),
30
+ busy: Array.from(lambdaInstances.values()).reduce((result, instances) => result + Array.from(instances.values()).filter(({ busy }) => busy).length, 0),
31
+ files: Object.fromEntries(Array.from(lambdaInstances.entries()).map(([file, instances]) => [
32
+ file,
33
+ { lambdas: instances.size, busy: Array.from(instances.values()).filter(({ busy }) => busy).length },
34
+ ])),
35
+ };
13
36
  }
14
37
  function getNonBusyId(lambdaToInvoke) {
15
38
  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
- });
39
+ return Array.from(lambdaInstances.get(lambdaToInvoke)?.entries() ?? []).find(([, instance]) => !instance.busy && instance.createdAt !== undefined && instance.createdAt >= timeLimit)?.[0];
40
+ }
41
+ /**
42
+ * Makes room under the limit for the first lambda of a file, by stopping an idle lambda of the file that has the most.
43
+ * Files are never left without a lambda this way, so one busy file cannot starve the others.
44
+ */
45
+ function evictIdleLambda(excluded) {
46
+ const victim = Array.from(lambdaInstances.entries())
47
+ .filter(([lambdaToInvoke, instances]) => lambdaToInvoke !== excluded && instances.size > 1)
48
+ .sort(([, a], [, b]) => b.size - a.size)
49
+ .flatMap(([, instances]) => Array.from(instances.entries())
50
+ .filter(([, instance]) => !instance.busy)
51
+ .slice(0, 1)
52
+ .map(([id, instance]) => ({ instances, id, instance })))[0];
53
+ if (victim === undefined) {
54
+ return false;
55
+ }
56
+ // the close event is asynchronous, so the registry is updated right away to free the slot
57
+ victim.instances.delete(victim.id);
58
+ victim.instance.instance?.terminate();
59
+ return true;
20
60
  }
21
61
  class LambdaPool {
22
62
  communication;
23
63
  overallLimit;
64
+ acquireTimeout;
24
65
  logger;
25
- constructor({ overallLimit, logger = () => { }, communication }) {
66
+ constructor({ overallLimit = 0, acquireTimeout = 10000, logger = () => { }, communication }) {
26
67
  this.communication = communication;
27
68
  this.overallLimit = overallLimit;
69
+ this.acquireTimeout = acquireTimeout;
28
70
  this.logger = logger;
29
71
  this.getLambda = this.getLambda.bind(this);
30
72
  this.createLambda = this.createLambda.bind(this);
31
73
  }
32
74
  createLambda(lambdaToInvoke, handlerKey) {
33
- return new Promise((resolve) => {
75
+ return new Promise((resolve, reject) => {
34
76
  const currentId = uuid_1.default.v4();
35
77
  const currentLambdaInstance = new Lambda_1.default(lambdaToInvoke, handlerKey, this.logger, this.communication);
78
+ // a lambda that cannot start answers nobody, so the request waiting for it has to fail instead of waiting forever
79
+ const failedToStart = (reason) => reject(new Error(`Lambda ${lambdaToInvoke} did not start: ${reason}`));
36
80
  const lambdaStartListener = (message) => {
37
81
  if (message.type === constants_1.EVENT_STARTED) {
38
82
  this.logger(`[${currentId}] started`);
@@ -41,33 +85,56 @@ class LambdaPool {
41
85
  }
42
86
  };
43
87
  currentLambdaInstance.addEventListener('message', lambdaStartListener);
88
+ currentLambdaInstance.addEventListenerOnce('error', failedToStart);
44
89
  currentLambdaInstance.addEventListenerOnce('close', (code) => {
45
90
  if (code)
46
91
  this.logger(`[${currentId}] Lambda exited with code ${code}`);
92
+ failedToStart(`it exited with code ${code}`);
93
+ // a lambda that is gone must not be handed out, nor count against the limit
94
+ lambdaInstances.get(lambdaToInvoke)?.delete(currentId);
47
95
  });
48
96
  (0, stdoutListener_1.default)(currentLambdaInstance, this.logger);
49
97
  });
50
98
  }
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));
99
+ async startLambda(lambdaToInvoke, handlerKey) {
100
+ starting.set(lambdaToInvoke, (starting.get(lambdaToInvoke) ?? 0) + 1);
101
+ try {
102
+ const { id, instance } = await this.createLambda(lambdaToInvoke, handlerKey);
103
+ // taken by the request that asked for it, before anything else can pick it from the registry
104
+ instance.busy = true;
105
+ instance.createdAt = Date.now();
106
+ const instances = lambdaInstances.get(lambdaToInvoke) ?? new Map();
107
+ instances.set(id, instance);
108
+ lambdaInstances.set(lambdaToInvoke, instances);
109
+ return instance;
57
110
  }
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
- });
111
+ finally {
112
+ starting.set(lambdaToInvoke, (starting.get(lambdaToInvoke) ?? 1) - 1);
113
+ }
114
+ }
115
+ /**
116
+ * Hands out a lambda for the file: a free one, otherwise a new one while the limit allows, otherwise the request waits for one to become free.
117
+ * Rejects with a LambdaUnavailableError when that takes longer than the acquire timeout.
118
+ */
119
+ async getLambda(lambdaToInvoke, handlerKey) {
120
+ const deadline = Date.now() + this.acquireTimeout;
121
+ for (;;) {
122
+ const nonBusyId = getNonBusyId(lambdaToInvoke);
123
+ const lambdaInstance = nonBusyId === undefined ? undefined : lambdaInstances.get(lambdaToInvoke)?.get(nonBusyId);
124
+ if (lambdaInstance !== undefined) {
125
+ // marked right away: the invocation starts later, and requests in between must not get the same lambda, as it answers one at a time
126
+ lambdaInstance.busy = true;
127
+ return lambdaInstance;
128
+ }
129
+ const hasRoom = this.overallLimit <= 0 || getOverallCount() < this.overallLimit;
130
+ if (hasRoom || (getCount(lambdaToInvoke) === 0 && evictIdleLambda(lambdaToInvoke))) {
131
+ return this.startLambda(lambdaToInvoke, handlerKey);
132
+ }
133
+ if (Date.now() >= deadline) {
134
+ throw new LambdaUnavailableError(`No lambda became available for ${lambdaToInvoke} within ${this.acquireTimeout}ms.`);
135
+ }
136
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
69
137
  }
70
- return Promise.resolve(lambdaInstances[lambdaToInvoke][nonBusyId]);
71
138
  }
72
139
  }
73
140
  exports.default = LambdaPool;
@@ -1 +1 @@
1
- {"version":3,"file":"LambdaPool.js","sourceRoot":"","sources":["../../src/classes/LambdaPool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LambdaPool.js","sourceRoot":"","sources":["../../src/classes/LambdaPool.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,14 @@ class Worker {
7
7
  instance;
8
8
  constructor(workerPath, options = {}) {
9
9
  this.workerPath = workerPath;
10
- const instance = (0, child_process_1.spawn)('node', [...this.workerPath.split(' ')], {
10
+ // the running node, as the environment of the worker may not have it on its PATH
11
+ const instance = (0, child_process_1.spawn)(process.execPath, [...this.workerPath.split(' ')], {
11
12
  stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
12
13
  ...options,
13
14
  });
14
15
  this.instance = instance;
16
+ // an unhandled error event would take the whole process down, for example when the process could not be spawned
17
+ instance.on('error', (error) => console.error(error));
15
18
  if (instance.stdout) {
16
19
  const messageListener = (data) => {
17
20
  console.info(data.toString().trim());
@@ -1 +1 @@
1
- {"version":3,"file":"Worker.js","sourceRoot":"","sources":["../../src/classes/Worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Worker.js","sourceRoot":"","sources":["../../src/classes/Worker.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,8 @@ import Lambda from './classes/Lambda';
3
3
  import FileStorage from './classes/FileStorage';
4
4
  import IPCStorage from './classes/IPCStorage';
5
5
  import Worker from './classes/Worker';
6
- export { httpMiddleware, Lambda, FileStorage, IPCStorage, Worker };
6
+ import { getLambdaStats } from './classes/LambdaPool';
7
+ export { httpMiddleware, Lambda, FileStorage, IPCStorage, Worker, getLambdaStats };
7
8
  export type { HttpMiddleware } from './middlewares/http';
8
9
  export type { Communication, HttpMiddlewareOptions, Logger, Storage, StorageDriverConstructor, StorageInstance } from './types';
9
10
  export type { default as RequestEvent } from './classes/RequestEvent';
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Worker = exports.IPCStorage = exports.FileStorage = exports.Lambda = exports.httpMiddleware = void 0;
6
+ exports.getLambdaStats = exports.Worker = exports.IPCStorage = exports.FileStorage = exports.Lambda = exports.httpMiddleware = void 0;
7
7
  const http_1 = __importDefault(require("./middlewares/http"));
8
8
  exports.httpMiddleware = http_1.default;
9
9
  const Lambda_1 = __importDefault(require("./classes/Lambda"));
@@ -14,4 +14,6 @@ const IPCStorage_1 = __importDefault(require("./classes/IPCStorage"));
14
14
  exports.IPCStorage = IPCStorage_1.default;
15
15
  const Worker_1 = __importDefault(require("./classes/Worker"));
16
16
  exports.Worker = Worker_1.default;
17
+ const LambdaPool_1 = require("./classes/LambdaPool");
18
+ Object.defineProperty(exports, "getLambdaStats", { enumerable: true, get: function () { return LambdaPool_1.getLambdaStats; } });
17
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAgD;AAMvC,yBANF,cAAc,CAME;AALvB,8DAAsC;AAKb,iBALlB,gBAAM,CAKkB;AAJ/B,wEAAgD;AAIf,sBAJ1B,qBAAW,CAI0B;AAH5C,sEAA8C;AAGA,qBAHvC,oBAAU,CAGuC;AAFxD,8DAAsC;AAEoB,iBAFnD,gBAAM,CAEmD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAgD;AAOvC,yBAPF,cAAc,CAOE;AANvB,8DAAsC;AAMb,iBANlB,gBAAM,CAMkB;AAL/B,wEAAgD;AAKf,sBAL1B,qBAAW,CAK0B;AAJ5C,sEAA8C;AAIA,qBAJvC,oBAAU,CAIuC;AAHxD,8DAAsC;AAGoB,iBAHnD,gBAAM,CAGmD;AAFhE,qDAAsD;AAEY,+FAFzD,2BAAc,OAEyD"}
@@ -1,14 +1,47 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
39
  const uuid_1 = __importDefault(require("uuid"));
7
40
  const url_1 = __importDefault(require("url"));
8
- const LambdaPool_1 = __importDefault(require("../classes/LambdaPool"));
41
+ const os_1 = require("os");
42
+ const LambdaPool_1 = __importStar(require("../classes/LambdaPool"));
9
43
  const RequestEvent_1 = __importDefault(require("../classes/RequestEvent"));
10
44
  const registry_1 = require("../registry");
11
- let overallLimit = 3000;
12
45
  const writeResponse = (response, responseEvent) => {
13
46
  if (!responseEvent.statusCode)
14
47
  return;
@@ -21,7 +54,7 @@ const writeResponse = (response, responseEvent) => {
21
54
  response.end(Buffer.from(responseEvent.body, bufferEncoding));
22
55
  };
23
56
  function createHttpMiddleware(options) {
24
- const { lambdaPath, handlerKey = 'handler', logger = () => { }, limit = overallLimit, communication = {} } = options;
57
+ const { lambdaPath, handlerKey = 'handler', logger = () => { }, limit = (0, os_1.availableParallelism)(), acquireTimeout, communication = {} } = options;
25
58
  const currentCommunication = !communication.type ? { type: 'ipc' } : { ...communication };
26
59
  const storagePath = (0, registry_1.isRegistered)(currentCommunication.type ?? '') ? (0, registry_1.getRegisteredPath)(currentCommunication.type) : currentCommunication.path;
27
60
  // TODO: tmp folders
@@ -30,13 +63,10 @@ function createHttpMiddleware(options) {
30
63
  next?.();
31
64
  };
32
65
  }
33
- if (limit) {
34
- overallLimit = limit;
35
- }
36
66
  const StorageDriver = require(storagePath);
37
67
  if (StorageDriver.start)
38
68
  StorageDriver.start();
39
- const lambdaPool = new LambdaPool_1.default({ logger, communication: currentCommunication });
69
+ const lambdaPool = new LambdaPool_1.default({ overallLimit: limit, acquireTimeout, logger, communication: currentCommunication });
40
70
  return (request, response) => {
41
71
  const { query: queryStringParameters, pathname: path } = url_1.default.parse(request.url ?? '', true);
42
72
  const requestEvent = new RequestEvent_1.default();
@@ -48,6 +78,9 @@ function createHttpMiddleware(options) {
48
78
  let storage;
49
79
  logger('Invoking lambda', `${lambdaPath}#${handlerKey}`);
50
80
  const closeListener = () => {
81
+ // the lambda exited without answering
82
+ if (!response.headersSent)
83
+ response.writeHead(502);
51
84
  if (!response.writableEnded)
52
85
  response.end();
53
86
  if (storage)
@@ -65,8 +98,9 @@ function createHttpMiddleware(options) {
65
98
  };
66
99
  handleRequest().catch((err) => {
67
100
  logger(err);
68
- response.writeHead(500);
69
- response.write('Something went wrong.');
101
+ // the lambdas that may run are all busy
102
+ response.writeHead(err instanceof LambdaPool_1.LambdaUnavailableError ? 503 : 500);
103
+ response.write(err instanceof LambdaPool_1.LambdaUnavailableError ? 'No lambda available.' : 'Something went wrong.');
70
104
  response.end();
71
105
  });
72
106
  };
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/middlewares/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/middlewares/http.ts"],"names":[],"mappings":"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"}
@@ -44,5 +44,7 @@ process.on('message', (event) => {
44
44
  messageListener(event);
45
45
  }
46
46
  });
47
+ // the parent can disappear without running its exit handlers, for example when it is terminated by a signal
48
+ process.on('disconnect', () => process.exit(0));
47
49
  (0, sendToParent_1.default)({ type: constants_1.EVENT_STARTED });
48
50
  //# sourceMappingURL=invoke.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/middlewares/invoke.ts"],"names":[],"mappings":";;;;;AAAA,6EAAqD;AACrD,4CAA4E;AAC5E,0CAAgD;AAChD,yEAAiD;AAMjD,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,OAAO,GAAG,SAAS,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAE9F,MAAM,YAAY,GAAkC,OAAO,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAC5C,MAAM,aAAa,GAAkB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC/D,MAAM,OAAO,GAA6B,OAAO,CAAC,IAAA,4BAAiB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAEzF,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,2DAA2D;AAE/E,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;AAEvJ,SAAS,eAAe,CAAC,KAAkB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAa,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO;IAEnE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAEzC,OAAO,CAAC,OAAO,EAAE;SACd,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;SAChC,IAAI,CACH,CAAC,YAAY,EAAE,EAAE,CACf,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QACrC,aAAa,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,uBAAa,EAAE,EAAE,EAAE;YACxE,MAAM,aAAa,GAAG,IAAI,uBAAa,EAAE,CAAC;YAE1C,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,UAAU,GAAG,GAAG,CAAC;gBAC/B,aAAa,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACzC,CAAC;YAED,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CACL;SACA,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,sBAAY,EAAC,EAAE,IAAI,EAAE,0BAAc,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAA,sBAAY,EAAC,EAAE,IAAI,EAAE,yBAAa,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/middlewares/invoke.ts"],"names":[],"mappings":";;;;;AAAA,6EAAqD;AACrD,4CAA4E;AAC5E,0CAAgD;AAChD,yEAAiD;AAMjD,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,OAAO,GAAG,SAAS,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAE9F,MAAM,YAAY,GAAkC,OAAO,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAC5C,MAAM,aAAa,GAAkB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC/D,MAAM,OAAO,GAA6B,OAAO,CAAC,IAAA,4BAAiB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAEzF,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,2DAA2D;AAE/E,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;AAEvJ,SAAS,eAAe,CAAC,KAAkB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAa,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO;IAEnE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAEzC,OAAO,CAAC,OAAO,EAAE;SACd,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;SAChC,IAAI,CACH,CAAC,YAAY,EAAE,EAAE,CACf,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QACrC,aAAa,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,uBAAa,EAAE,EAAE,EAAE;YACxE,MAAM,aAAa,GAAG,IAAI,uBAAa,EAAE,CAAC;YAE1C,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,UAAU,GAAG,GAAG,CAAC;gBAC/B,aAAa,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACzC,CAAC;YAED,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CACL;SACA,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,sBAAY,EAAC,EAAE,IAAI,EAAE,0BAAc,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,4GAA4G;AAC5G,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,IAAA,sBAAY,EAAC,EAAE,IAAI,EAAE,yBAAa,EAAE,CAAC,CAAC"}
package/dist/types.d.ts CHANGED
@@ -13,7 +13,10 @@ export interface HttpMiddlewareOptions {
13
13
  lambdaPath: string;
14
14
  handlerKey?: string;
15
15
  logger?: Logger;
16
+ /** how many lambdas may run in total, they are shared by all requests: a lambda answers one request at a time. Defaults to the number of CPU cores, 0 means no limit. */
16
17
  limit?: number;
18
+ /** how long a request waits for a lambda when the limit is reached before it is answered with 503, in milliseconds. Defaults to 10000. */
19
+ acquireTimeout?: number;
17
20
  communication?: Communication;
18
21
  }
19
22
  /** an event emitted by a lambda worker */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koeroesi86/node-lambda-invoke",
3
- "version": "26.10.36916718511-master",
3
+ "version": "26.10.37633705232-master",
4
4
  "description": "A local Lambda implementation",
5
5
  "main": "dist/index.js",
6
6
  "author": {
@@ -22,11 +22,14 @@
22
22
  "uuid": "^3.3.2"
23
23
  },
24
24
  "devDependencies": {
25
+ "@types/jest": "^29.5.14",
25
26
  "@types/node": "^24.0.0",
26
27
  "@types/rimraf": "^2.0.5",
27
28
  "@types/uuid": "^3.4.13",
28
29
  "dotenv": "^6.2.0",
30
+ "jest": "^29.7.0",
29
31
  "nodemon": "^2.0.15",
32
+ "ts-jest": "^29.4.14",
30
33
  "typescript": "^5.9.3"
31
34
  },
32
35
  "typings": "dist/index.d.ts",
@@ -37,9 +40,10 @@
37
40
  "requests/.gitkeep",
38
41
  "responses/.gitkeep"
39
42
  ],
40
- "gitHead": "5761ac838f626fb2b35390b63d4130a9cd2d6197",
43
+ "gitHead": "df44146d25ab202ad04461024c6f67930c0e7026",
41
44
  "scripts": {
42
- "build": "rimraf dist && tsc -p tsconfig.json",
43
- "start": "nodemon --watch src --ext ts --exec \"npm run build --silent && node example/example.js\""
45
+ "build": "rimraf dist && tsc -p tsconfig.build.json",
46
+ "start": "nodemon --watch src --ext ts --exec \"npm run build --silent && node example/example.js\"",
47
+ "test": "jest"
44
48
  }
45
49
  }