Skip to content

Commit 2fe4d1d

Browse files
committed
execa for raw handler
1 parent 58848ea commit 2fe4d1d

File tree

7 files changed

+159
-34
lines changed

7 files changed

+159
-34
lines changed

dist/495.main.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/495.main.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/main.js

100755100644
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
"license": "MIT",
88
"main": "dist/main.js",
99
"files": [
10-
"dist/main.js",
11-
"dist/main.js.map"
10+
"dist/**/*"
1211
],
1312
"bin": {
1413
"bootstrap": "dist/main.js"
@@ -26,21 +25,21 @@
2625
"aws",
2726
"lambda"
2827
],
29-
"dependencies": {
28+
"dependencies": {},
29+
"devDependencies": {
3030
"@types/aws-lambda": "^8.10.138",
3131
"@types/node": "18",
3232
"@types/which": "^3.0.3",
3333
"aws-lambda": "^1.0.7",
3434
"axios": "^1.7.2",
35-
"typescript": "5",
36-
"which": "^4.0.0"
37-
},
38-
"devDependencies": {
35+
"execa": "^9.1.0",
3936
"source-map": "^0.7.4",
4037
"ts-loader": "^9.5.1",
4138
"ts-node": "^10.9.2",
4239
"tsconfig-paths": "^4.2.0",
40+
"typescript": "5",
4341
"webpack": "^5.91.0",
44-
"webpack-cli": "^5.1.4"
42+
"webpack-cli": "^5.1.4",
43+
"which": "^4.0.0"
4544
}
4645
}

src/bootstrap.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,39 @@ export const bootstrap = async (): Promise<void> => {
1212
throw new Error("No handler specified");
1313
}
1414

15-
const handler = new URL(_HANDLER);
15+
let handler: URL | undefined = undefined;
16+
let bin: string;
17+
let endpoint: string | undefined = undefined;
18+
19+
// handler is in the format of
20+
// - `{some-bin}:http://localhost:{the-bins-port} (will start some-bin, and forward requests to the http server)
21+
// - `http://localhost:{some-port}` (will forward the request to the http server)
22+
// - `{some-bin}` (will forward the event to the bin)
23+
24+
try {
25+
handler = new URL(_HANDLER);
26+
bin = handler.protocol.slice(0, -1);
27+
endpoint = handler.toString();
28+
} catch (e) {
29+
bin = _HANDLER;
30+
}
1631

17-
let app: string = handler.protocol.slice(0, -1);
18-
let endpoint = handler.toString();
1932
let childProcess: ChildProcess | undefined = undefined;
2033

21-
if (app !== "http" && app !== "https") {
34+
if (handler && bin !== "http" && bin !== "https") {
2235
endpoint = handler.pathname;
23-
try {
24-
await which(app);
25-
} catch (error) {
26-
throw new Error(
27-
`Could not find \`${app}\` in system path ${process.env.PATH}`
28-
);
29-
}
3036

3137
const subcommand = IS_OFFLINE === "true" ? "dev" : "start";
3238

33-
childProcess = spawn(app, [subcommand], {
39+
childProcess = spawn(bin, [subcommand], {
3440
detached: true,
3541
stdio: "inherit",
3642
});
3743
}
3844

3945
try {
40-
await routeEvents(AWS_LAMBDA_RUNTIME_API, endpoint);
46+
await which(bin);
47+
await routeEvents(AWS_LAMBDA_RUNTIME_API, bin, endpoint);
4148
} catch (e) {
4249
if (childProcess) {
4350
childProcess.kill();

src/routing.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { APIGatewayProxyEventV2 } from "aws-lambda";
1+
import { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from "aws-lambda";
22
import axios from "axios";
33
import { EndpointRequest } from "./types";
44
import { endpointProxy } from "./proxy";
55

66
export const routeEvents = async (
77
runtimeApi: string,
8-
endpoint: string
8+
bin: string,
9+
endpoint?: string
910
): Promise<void> => {
1011
const { headers, data } = await axios.get(
1112
`http://${runtimeApi}/2018-06-01/runtime/invocation/next`,
@@ -23,16 +24,28 @@ export const routeEvents = async (
2324
headers["Lambda-Runtime-Deadline-Ms"]
2425
);
2526

27+
// TODO handle V1 payloads
2628
const event = JSON.parse(data) as APIGatewayProxyEventV2;
27-
28-
const request: EndpointRequest = {
29-
requestId,
30-
endpoint,
31-
event,
32-
initialDeadline,
33-
};
34-
35-
const { payload } = await endpointProxy(request);
29+
let payload: APIGatewayProxyResultV2 | undefined = undefined;
30+
31+
if (!endpoint) {
32+
const { execa } = await import("execa");
33+
// no endpoint, just exec the bin
34+
const { stdout } = await execa({
35+
stderr: ["inherit"],
36+
})`${bin} ${JSON.stringify(event)}`;
37+
38+
payload = JSON.parse(stdout) as APIGatewayProxyResultV2;
39+
} else {
40+
const request: EndpointRequest = {
41+
requestId,
42+
endpoint,
43+
event,
44+
initialDeadline,
45+
};
46+
47+
payload = (await endpointProxy(request)).payload;
48+
}
3649

3750
await axios.post(
3851
`http://${runtimeApi}/2018-06-01/runtime/invocation/${requestId}/response`,
@@ -43,5 +56,5 @@ export const routeEvents = async (
4356
requestId,
4457
});
4558

46-
return routeEvents(runtimeApi, endpoint);
59+
return routeEvents(runtimeApi, bin, endpoint);
4760
};

yarn.lock

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@
6262
"@jridgewell/resolve-uri" "^3.1.0"
6363
"@jridgewell/sourcemap-codec" "^1.4.14"
6464

65+
"@sec-ant/readable-stream@^0.4.1":
66+
version "0.4.1"
67+
resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c"
68+
integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==
69+
70+
"@sindresorhus/merge-streams@^4.0.0":
71+
version "4.0.0"
72+
resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339"
73+
integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==
74+
6575
"@tsconfig/node10@^1.0.7":
6676
version "1.0.11"
6777
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
@@ -600,6 +610,24 @@ events@^3.2.0:
600610
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
601611
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
602612

613+
execa@^9.1.0:
614+
version "9.1.0"
615+
resolved "https://registry.yarnpkg.com/execa/-/execa-9.1.0.tgz#c42845d2b079642b8e07d9de81db13cdb91e7a9b"
616+
integrity sha512-lSgHc4Elo2m6bUDhc3Hl/VxvUDJdQWI40RZ4KMY9bKRc+hgMOT7II/JjbNDhI8VnMtrCb7U/fhpJIkLORZozWw==
617+
dependencies:
618+
"@sindresorhus/merge-streams" "^4.0.0"
619+
cross-spawn "^7.0.3"
620+
figures "^6.1.0"
621+
get-stream "^9.0.0"
622+
human-signals "^7.0.0"
623+
is-plain-obj "^4.1.0"
624+
is-stream "^4.0.1"
625+
npm-run-path "^5.2.0"
626+
pretty-ms "^9.0.0"
627+
signal-exit "^4.1.0"
628+
strip-final-newline "^4.0.0"
629+
yoctocolors "^2.0.0"
630+
603631
fast-deep-equal@^3.1.1:
604632
version "3.1.3"
605633
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -615,6 +643,13 @@ fastest-levenshtein@^1.0.12:
615643
resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
616644
integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
617645

646+
figures@^6.1.0:
647+
version "6.1.0"
648+
resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a"
649+
integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==
650+
dependencies:
651+
is-unicode-supported "^2.0.0"
652+
618653
fill-range@^7.1.1:
619654
version "7.1.1"
620655
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
@@ -672,6 +707,14 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
672707
has-symbols "^1.0.3"
673708
hasown "^2.0.0"
674709

710+
get-stream@^9.0.0:
711+
version "9.0.1"
712+
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27"
713+
integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==
714+
dependencies:
715+
"@sec-ant/readable-stream" "^0.4.1"
716+
is-stream "^4.0.1"
717+
675718
glob-to-regexp@^0.4.1:
676719
version "0.4.1"
677720
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -725,6 +768,11 @@ hasown@^2.0.0:
725768
dependencies:
726769
function-bind "^1.1.2"
727770

771+
human-signals@^7.0.0:
772+
version "7.0.0"
773+
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-7.0.0.tgz#93e58e0c19cfec1dded4af10cd4969f5ab75f6c8"
774+
integrity sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==
775+
728776
729777
version "1.1.13"
730778
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
@@ -785,20 +833,35 @@ is-number@^7.0.0:
785833
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
786834
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
787835

836+
is-plain-obj@^4.1.0:
837+
version "4.1.0"
838+
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
839+
integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
840+
788841
is-plain-object@^2.0.4:
789842
version "2.0.4"
790843
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
791844
integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
792845
dependencies:
793846
isobject "^3.0.1"
794847

848+
is-stream@^4.0.1:
849+
version "4.0.1"
850+
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b"
851+
integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==
852+
795853
is-typed-array@^1.1.3:
796854
version "1.1.13"
797855
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
798856
integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
799857
dependencies:
800858
which-typed-array "^1.1.14"
801859

860+
is-unicode-supported@^2.0.0:
861+
version "2.0.0"
862+
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz#fdf32df9ae98ff6ab2cedc155a5a6e895701c451"
863+
integrity sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==
864+
802865
isarray@^1.0.0:
803866
version "1.0.0"
804867
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -918,6 +981,13 @@ node-releases@^2.0.14:
918981
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
919982
integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
920983

984+
npm-run-path@^5.2.0:
985+
version "5.3.0"
986+
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f"
987+
integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==
988+
dependencies:
989+
path-key "^4.0.0"
990+
921991
p-limit@^2.2.0:
922992
version "2.3.0"
923993
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -937,6 +1007,11 @@ p-try@^2.0.0:
9371007
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
9381008
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
9391009

1010+
parse-ms@^4.0.0:
1011+
version "4.0.0"
1012+
resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4"
1013+
integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==
1014+
9401015
path-exists@^4.0.0:
9411016
version "4.0.0"
9421017
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
@@ -947,6 +1022,11 @@ path-key@^3.1.0:
9471022
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
9481023
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
9491024

1025+
path-key@^4.0.0:
1026+
version "4.0.0"
1027+
resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
1028+
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
1029+
9501030
path-parse@^1.0.7:
9511031
version "1.0.7"
9521032
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
@@ -974,6 +1054,13 @@ possible-typed-array-names@^1.0.0:
9741054
resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
9751055
integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
9761056

1057+
pretty-ms@^9.0.0:
1058+
version "9.0.0"
1059+
resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.0.0.tgz#53c57f81171c53be7ce3fd20bdd4265422bc5929"
1060+
integrity sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==
1061+
dependencies:
1062+
parse-ms "^4.0.0"
1063+
9771064
proxy-from-env@^1.1.0:
9781065
version "1.1.0"
9791066
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@@ -1096,6 +1183,11 @@ shebang-regex@^3.0.0:
10961183
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
10971184
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
10981185

1186+
signal-exit@^4.1.0:
1187+
version "4.1.0"
1188+
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
1189+
integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
1190+
10991191
source-map-support@~0.5.20:
11001192
version "0.5.21"
11011193
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
@@ -1124,6 +1216,11 @@ strip-bom@^3.0.0:
11241216
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
11251217
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
11261218

1219+
strip-final-newline@^4.0.0:
1220+
version "4.0.0"
1221+
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c"
1222+
integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==
1223+
11271224
supports-color@^7.1.0:
11281225
version "7.2.0"
11291226
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
@@ -1387,3 +1484,8 @@ [email protected]:
13871484
version "3.1.1"
13881485
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
13891486
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
1487+
1488+
yoctocolors@^2.0.0:
1489+
version "2.0.2"
1490+
resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.0.2.tgz#8e871e30d7eabb1976776e07a9fe2fe9a8c46fba"
1491+
integrity sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==

0 commit comments

Comments
 (0)