@pikku/lambda 0.12.10 → 0.12.11

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/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ ## 0.12.11
2
+
3
+ ### Patch Changes
4
+
5
+ - 4c7a1b5: Run the monorepo's own scripts through bun instead of yarn. What moves is the
6
+ package manager each package's `prepublishOnly` and build scripts invoke, plus
7
+ the two manifest fixes bun needs to resolve the tree: `uWebSockets.js` is
8
+ declared with an explicit `github:` specifier, and `@pikku/uws-handler` marks
9
+ its `uWebSockets.js` peer optional so a bun install of a consumer that brings
10
+ its own uWS app does not try to fetch it from the registry.
11
+
12
+ Three published behaviours change, all of them cases where an isolated
13
+ `node_modules` or bun as the runtime had been papered over by yarn's hoisting:
14
+
15
+ - `@pikku/migrator-sql` turns foreign keys on when it opens a sqlite database
16
+ through bun. `node:sqlite` enforces them by default and `bun:sqlite` does not,
17
+ which silently turned every `ON DELETE CASCADE` into a no-op under
18
+ `bunx --bun pikku`.
19
+ - `@pikku/cli` resolves a deploy provider against the project being deployed
20
+ rather than against wherever the CLI itself is installed, which is what its
21
+ own "is not installed" error asks the user to arrange.
22
+ - `@pikku/cli` treats a specifier a runtime hands straight back — bun does this
23
+ for the modules it implements itself — as not resolved from the project, so
24
+ it falls back rather than loading the runtime's own copy.
25
+
26
+ - Updated dependencies [4c7a1b5]
27
+ - @pikku/core@0.12.108
28
+
1
29
  ## 0.12.10
2
30
 
3
31
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"lambda-deployment-service.js","sourceRoot":"","sources":["../src/lambda-deployment-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lambda-deployment-service.js","sourceRoot":"","sources":["../src/lambda-deployment-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqs-queue-service.js","sourceRoot":"","sources":["../src/sqs-queue-service.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAInE,MAAM,OAAO,eAAe;IAIN;IAHX,eAAe,GAAG,KAAK,CAAA;IACxB,MAAM,CAAW;IAEzB,YAAoB,WAAoC;QAApC,gBAAW,GAAX,WAAW,CAAyB;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,GAAG,CACP,SAAiB,EACjB,IAAO,EACP,OAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;QAErC,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,SAAS;YACb,SAAS;YACT,IAAI;YACJ,WAAW,EAAE,OAAO,EAAE,WAAW;SAClC,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,IAAI,kBAAkB,CAAC;YACrB,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACpC,YAAY,EAAE,OAAO,EAAE,KAAK;gBAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;gBAChD,CAAC,CAAC,SAAS;SACd,CAAC,CACH,CAAA;QAED,OAAO,MAAM,CAAC,SAAS,IAAI,SAAS,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,MAAc;QAEd,MAAM,IAAI,KAAK,CACb,6CAA6C;YAC3C,0BAA0B;YAC1B,uDAAuD,CAC1D,CAAA;IACH,CAAC;IASO,eAAe,CAAC,SAAiB;QACvC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAA;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,KAAK;gBAClD,4BAA4B,MAAM,sCAAsC,CAC3E,CAAA;QACH,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,WAAW,EAAE,CAAA;AAClB,CAAC"}
1
+ {"version":3,"file":"sqs-queue-service.js","sourceRoot":"","sources":["../src/sqs-queue-service.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAInE,MAAM,OAAO,eAAe;IAIN,WAAW;IAHtB,eAAe,GAAG,KAAK,CAAA;IACxB,MAAM,CAAW;IAEzB,YAAoB,WAAoC;2BAApC,WAAW;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,GAAG,CACP,SAAiB,EACjB,IAAO,EACP,OAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;QAErC,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,SAAS;YACb,SAAS;YACT,IAAI;YACJ,WAAW,EAAE,OAAO,EAAE,WAAW;SAClC,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,IAAI,kBAAkB,CAAC;YACrB,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACpC,YAAY,EAAE,OAAO,EAAE,KAAK;gBAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;gBAChD,CAAC,CAAC,SAAS;SACd,CAAC,CACH,CAAA;QAED,OAAO,MAAM,CAAC,SAAS,IAAI,SAAS,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,MAAc;QAEd,MAAM,IAAI,KAAK,CACb,6CAA6C;YAC3C,0BAA0B;YAC1B,uDAAuD,CAC1D,CAAA;IACH,CAAC;IASO,eAAe,CAAC,SAAiB;QACvC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAA;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,KAAK;gBAClD,4BAA4B,MAAM,sCAAsC,CAC3E,CAAA;QACH,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,WAAW,EAAE,CAAA;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"lambda-channel-handler.js","sourceRoot":"","sources":["../../src/websocket/lambda-channel-handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAIxC,MAAM,oBAIJ,SAAQ,2BAA6C;IAE3C;IACA;IAFV,YACU,MAAc,EACd,WAA0C,EAClD,SAAiB,EACjB,WAAmB,EACnB,WAAwB;QAExB,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;QANlC,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAA+B;IAMpD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,OAAY,EAAE,QAAkB;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACxE,CAAC;IAEM,UAAU,CAAC,KAAiB;QACjC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACvE,CAAC;CACF;AAED,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,MAAc,EACd,YAA0B,EAC1B,WAA0C,EAC1C,EAAE;IACF,MAAM,OAAO,GAA+B,CAC1C,SAAS,EACT,WAAW,EACX,WAAW,EACX,EAAE,CACF,IAAI,oBAAoB,CACtB,MAAM,EACN,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,CACZ,CAAA;IACH,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"lambda-channel-handler.js","sourceRoot":"","sources":["../../src/websocket/lambda-channel-handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAIxC,MAAM,oBAIJ,SAAQ,2BAA6C;IAE3C,MAAM;IACN,WAAW;IAFrB,YACU,MAAc,EACd,WAA0C,EAClD,SAAiB,EACjB,WAAmB,EACnB,WAAwB;QAExB,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;sBANlC,MAAM;2BACN,WAAW;IAMrB,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,OAAY,EAAE,QAAkB;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACxE,CAAC;IAEM,UAAU,CAAC,KAAiB;QACjC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACvE,CAAC;CACF;AAED,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,MAAc,EACd,YAA0B,EAC1B,WAA0C,EAC1C,EAAE;IACF,MAAM,OAAO,GAA+B,CAC1C,SAAS,EACT,WAAW,EACX,WAAW,EACX,EAAE,CACF,IAAI,oBAAoB,CACtB,MAAM,EACN,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,CACZ,CAAA;IACH,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"lambda-eventhub-service.js","sourceRoot":"","sources":["../../src/websocket/lambda-eventhub-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gCAAgC,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI3E,MAAM,OAAO,qBAAqB;IAMtB;IAEA;IACA;IANF,WAAW,CAA+B;IAElD,YACU,MAAc,EACtB,KAAsB,EACd,YAA0B,EAC1B,aAAyC;QAHzC,WAAM,GAAN,MAAM,CAAQ;QAEd,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAA4B;QAEjD,IAAI,CAAC,WAAW,GAAG,gCAAgC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,SAAS,CACb,KAAQ,EACR,SAAiB;QAEjB,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,WAAW,CACf,KAAQ,EACR,SAAiB;QAEjB,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAQ,EACR,SAAwB,EACxB,IAAoB,EACpB,QAAkB;QAElB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAC/D,KAAe,CAChB,CAAA;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,UAAoB,EACpB,aAAqB,EACrB,IAAoC,EACpC,QAAkB;QAElB,MAAM,YAAY,CAChB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,WAAW,EAChB,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,CACT,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"lambda-eventhub-service.js","sourceRoot":"","sources":["../../src/websocket/lambda-eventhub-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gCAAgC,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI3E,MAAM,OAAO,qBAAqB;IAMtB,MAAM;IAEN,YAAY;IACZ,aAAa;IANf,WAAW,CAA+B;IAElD,YACU,MAAc,EACtB,KAAsB,EACd,YAA0B,EAC1B,aAAyC;sBAHzC,MAAM;4BAEN,YAAY;6BACZ,aAAa;QAErB,IAAI,CAAC,WAAW,GAAG,gCAAgC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,SAAS,CACb,KAAQ,EACR,SAAiB;QAEjB,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,WAAW,CACf,KAAQ,EACR,SAAiB;QAEjB,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAQ,EACR,SAAwB,EACxB,IAAoB,EACpB,QAAkB;QAElB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAC/D,KAAe,CAChB,CAAA;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,UAAoB,EACpB,aAAqB,EACrB,IAAoC,EACpC,QAAkB;QAElB,MAAM,YAAY,CAChB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,WAAW,EAChB,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,CACT,CAAA;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@pikku/lambda",
3
- "version": "0.12.10",
3
+ "version": "0.12.11",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/pikkujs/pikku.git",
7
+ "directory": "packages/runtimes/aws-lambda"
8
+ },
4
9
  "description": "AWS Lambda runtime for Pikku — HTTP, WebSocket, SQS queue and scheduled handlers",
5
10
  "license": "MIT",
6
11
  "author": "yasser.fadl@gmail.com",
@@ -15,7 +20,7 @@
15
20
  "test": "bash run-tests.sh",
16
21
  "test:watch": "bash run-tests.sh --watch",
17
22
  "test:coverage": "bash run-tests.sh --coverage",
18
- "prepublishOnly": "yarn build"
23
+ "prepublishOnly": "bun run build"
19
24
  },
20
25
  "exports": {
21
26
  ".": "./dist/index.js",
@@ -28,17 +33,16 @@
28
33
  "@aws-sdk/client-apigatewaymanagementapi": "^3.713.0",
29
34
  "@aws-sdk/client-lambda": "^3.713.0",
30
35
  "@aws-sdk/client-sqs": "^3.713.0",
31
- "@pikku/core": "^0.12.87",
36
+ "@pikku/core": "^0.12.108",
32
37
  "@types/aws-lambda": "^8.10.161"
33
38
  },
34
39
  "devDependencies": {
35
40
  "@aws-sdk/client-apigatewaymanagementapi": "^3.1111.0",
36
41
  "@aws-sdk/client-lambda": "^3.1111.0",
37
42
  "@aws-sdk/client-sqs": "^3.1111.0",
38
- "@types/aws-lambda": "^8.10.162",
39
- "typescript": "^6.0.3"
43
+ "@types/aws-lambda": "^8.10.162"
40
44
  },
41
45
  "engines": {
42
46
  "node": ">=24"
43
47
  }
44
- }
48
+ }
package/run-tests.sh CHANGED
@@ -34,20 +34,35 @@ files=($(find src -type f -name "*.test.ts"))
34
34
  # Check if any files matched the pattern
35
35
  if [ ${#files[@]} -eq 0 ]; then
36
36
  echo "No test files found matching pattern: $pattern"
37
+ if [ "${STRICT_TEST_DISCOVERY}" = "1" ]; then
38
+ exit 1
39
+ fi
37
40
  exit 0
38
41
  fi
39
42
 
40
- # Construct the node command
41
- node_cmd=(node --import tsx --test)
43
+ # Construct the bun command
44
+ #
45
+ # --parallel gives every test file its own worker process, which is what node's
46
+ # `--test` did. Several suites keep module-level caches (a TypeScript program, a
47
+ # temp fixture directory) that a shared process would leak between files.
48
+ #
49
+ # --timeout because bun caps a test at 5s by default where node had no cap, and
50
+ # the suites that build real TypeScript programs run well past that.
51
+ bun_cmd=(bun test --parallel --timeout 120000)
42
52
 
43
53
  # Append options based on flags
44
54
  if [ "$watch_mode" = true ]; then
45
- node_cmd+=(--watch)
55
+ # --watch reruns in one process; parallel workers have nothing to watch.
56
+ bun_cmd=(bun test --watch --timeout 120000)
46
57
  fi
47
58
 
48
59
  if [ "$coverage_mode" = true ]; then
49
- node_cmd+=(--test-coverage-include="src/**/*.{ts,js}" --test-coverage-exclude="**/dist/**" --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=lcov.info)
60
+ # --coverage-dir=. keeps lcov.info at the package root: CI merges every
61
+ # package's report by prefixing its SF paths with the file's own directory,
62
+ # so a nested coverage/ directory would re-root them one level too deep.
63
+ bun_cmd+=(--coverage --coverage-reporter=lcov --coverage-reporter=text --coverage-dir=.)
64
+ export PIKKU_TEST_COVERAGE=1
50
65
  fi
51
66
 
52
- # Execute the node command with the expanded list of files
53
- "${node_cmd[@]}" "${files[@]}"
67
+ # Execute the bun command with the expanded list of files
68
+ "${bun_cmd[@]}" "${files[@]}"
@@ -1,164 +0,0 @@
1
- /**
2
- * Lambda handler factories — mirrors Cloudflare's handler-factories.ts.
3
- *
4
- * Creates combined Lambda handlers based on which handler types a unit needs
5
- * (fetch, queue, scheduled). Services are cached across warm invocations.
6
- */
7
-
8
- import { LocalVariablesService, LocalSecretService } from '@pikku/core/services'
9
- import type { CoreSingletonServices } from '@pikku/core/types'
10
- import type { ChannelStore } from '@pikku/core/channel'
11
- import { runFetchV2 } from './http/run-fetch-v2.js'
12
- import { runSQSQueueWorker } from './queue/sqs-worker.js'
13
- import { runLambdaScheduled } from './scheduled/run-scheduled.js'
14
- import type {
15
- APIGatewayEvent,
16
- APIGatewayProxyEventV2,
17
- SQSEvent,
18
- ScheduledEvent,
19
- } from 'aws-lambda'
20
-
21
- export interface LambdaServiceFactories {
22
- createConfig: (
23
- variables: LocalVariablesService,
24
- ...args: unknown[]
25
- ) => Promise<unknown>
26
- createSingletonServices: (
27
- config: unknown,
28
- existingServices?: Partial<Record<string, unknown>>
29
- ) => Promise<CoreSingletonServices>
30
- /**
31
- * Optional callback to create platform services from environment.
32
- * Returns services to merge into existingServices.
33
- * Generated by the deploy codegen based on unit capabilities.
34
- */
35
- createPlatformServices?: () =>
36
- Record<string, unknown> | Promise<Record<string, unknown>>
37
- }
38
-
39
- let cachedServices: CoreSingletonServices | null = null
40
-
41
- async function setupServices(
42
- factories: LambdaServiceFactories
43
- ): Promise<CoreSingletonServices> {
44
- if (cachedServices) return cachedServices
45
- const variables = new LocalVariablesService(
46
- process.env as Record<string, string | undefined>
47
- )
48
- const config = await factories.createConfig(variables)
49
- const secrets = new LocalSecretService(variables)
50
-
51
- const platformServices = factories.createPlatformServices
52
- ? await factories.createPlatformServices()
53
- : {}
54
-
55
- cachedServices = await factories.createSingletonServices(config, {
56
- variables,
57
- secrets,
58
- ...platformServices,
59
- })
60
- return cachedServices
61
- }
62
-
63
- /**
64
- * Creates a combined Lambda handler based on which handler types the unit needs.
65
- *
66
- * Returns an object with named exports that serverless.yml references:
67
- * - `handler` for HTTP (API Gateway)
68
- * - `queue` for SQS
69
- * - `scheduled` for EventBridge
70
- */
71
- export function createLambdaHandler(
72
- factories: LambdaServiceFactories,
73
- handlerTypes: string[]
74
- ) {
75
- const result: Record<string, unknown> = {}
76
-
77
- if (handlerTypes.includes('fetch')) {
78
- result.handler = async (event: APIGatewayProxyEventV2) => {
79
- await setupServices(factories)
80
- return runFetchV2(event)
81
- }
82
- }
83
-
84
- if (handlerTypes.includes('queue')) {
85
- result.queue = async (event: SQSEvent) => {
86
- const services = await setupServices(factories)
87
- return runSQSQueueWorker(services.logger, event)
88
- }
89
- }
90
-
91
- if (handlerTypes.includes('scheduled')) {
92
- result.scheduled = async (event: ScheduledEvent) => {
93
- await setupServices(factories)
94
- return runLambdaScheduled(event)
95
- }
96
- }
97
-
98
- // If no fetch handler was requested, add a health check
99
- if (!handlerTypes.includes('fetch')) {
100
- const activeHandlers = handlerTypes.join(', ')
101
- result.handler = async () => ({
102
- statusCode: 200,
103
- body: `Lambda active (handlers: ${activeHandlers})`,
104
- })
105
- }
106
-
107
- return result
108
- }
109
-
110
- /**
111
- * Creates a Lambda handler with a fetch() entrypoint for HTTP, agent, RPC,
112
- * and workflow-orchestrator units.
113
- */
114
- export function createLambdaWorkerHandler(factories: LambdaServiceFactories) {
115
- return {
116
- async handler(event: APIGatewayProxyEventV2) {
117
- await setupServices(factories)
118
- return runFetchV2(event)
119
- },
120
- }
121
- }
122
-
123
- /**
124
- * Creates a Lambda handler for WebSocket channel units.
125
- * Exports separate handlers for $connect, $disconnect, and $default routes.
126
- */
127
- export function createLambdaWebSocketHandler(
128
- factories: LambdaServiceFactories
129
- ) {
130
- // Import dynamically to avoid pulling in websocket deps for non-channel units
131
- const getChannelStore = () => {
132
- if (!cachedServices) {
133
- throw new Error('Services not initialized for WebSocket handler')
134
- }
135
- const channelStore = (cachedServices as unknown as Record<string, unknown>)
136
- .channelStore as ChannelStore | undefined
137
- if (!channelStore) {
138
- throw new Error(
139
- 'channelStore not found in singleton services. Ensure it is configured for channel units.'
140
- )
141
- }
142
- return channelStore
143
- }
144
-
145
- return {
146
- async connect(event: APIGatewayEvent) {
147
- await setupServices(factories)
148
- const { connectWebsocket } = await import('./websocket/index.js')
149
- return connectWebsocket(event, { channelStore: getChannelStore() })
150
- },
151
- async disconnect(event: APIGatewayEvent) {
152
- await setupServices(factories)
153
- const { disconnectWebsocket } = await import('./websocket/index.js')
154
- return disconnectWebsocket(event, { channelStore: getChannelStore() })
155
- },
156
- async default(event: APIGatewayEvent) {
157
- await setupServices(factories)
158
- const { processWebsocketMessage } = await import('./websocket/index.js')
159
- return processWebsocketMessage(event, {
160
- channelStore: getChannelStore(),
161
- })
162
- },
163
- }
164
- }
package/src/http/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './run-fetch.js'
2
- export * from './run-fetch-v2.js'
@@ -1,36 +0,0 @@
1
- import type { APIGatewayProxyEventV2 } from 'aws-lambda'
2
-
3
- export const lambdaV2EventToRequest = (
4
- event: APIGatewayProxyEventV2
5
- ): Request => {
6
- const host =
7
- event.headers?.host ?? event.requestContext?.domainName ?? 'localhost'
8
- const url = new URL(event.rawPath, `https://${host}`)
9
-
10
- if (event.rawQueryString) {
11
- // rawQueryString is already encoded, append directly
12
- url.search = `?${event.rawQueryString}`
13
- }
14
-
15
- const body =
16
- event.body && event.isBase64Encoded
17
- ? Buffer.from(event.body, 'base64')
18
- : event.body || undefined
19
-
20
- const method = event.requestContext?.http?.method || 'GET'
21
-
22
- const headers: Record<string, string> = {}
23
- if (event.headers) {
24
- for (const [key, value] of Object.entries(event.headers)) {
25
- if (value != null) {
26
- headers[key] = value
27
- }
28
- }
29
- }
30
-
31
- return new Request(url.toString(), {
32
- method,
33
- headers,
34
- body: ['GET', 'HEAD'].includes(method.toUpperCase()) ? undefined : body,
35
- })
36
- }
@@ -1,40 +0,0 @@
1
- import type { APIGatewayProxyStructuredResultV2 } from 'aws-lambda'
2
-
3
- export const responseToLambdaV2Result = async (
4
- response: Response
5
- ): Promise<APIGatewayProxyStructuredResultV2> => {
6
- // Extract Set-Cookie headers as cookies array (v2 format)
7
- const cookies: string[] = response.headers.getSetCookie
8
- ? response.headers.getSetCookie()
9
- : []
10
-
11
- const headers: Record<string, string> = {}
12
- response.headers.forEach((value, key) => {
13
- if (key.toLowerCase() === 'set-cookie' && cookies.length > 0) return
14
- headers[key.toLowerCase()] = value
15
- })
16
-
17
- let body: string
18
- let isBase64Encoded = false
19
-
20
- const contentType = response.headers.get('content-type') || ''
21
- const isBinary = !/^text\/|application\/(json|javascript|xml)/.test(
22
- contentType
23
- )
24
-
25
- const buffer = Buffer.from(await response.arrayBuffer())
26
- if (isBinary) {
27
- body = buffer.toString('base64')
28
- isBase64Encoded = true
29
- } else {
30
- body = buffer.toString('utf-8')
31
- }
32
-
33
- return {
34
- statusCode: response.status,
35
- headers,
36
- body,
37
- isBase64Encoded,
38
- ...(cookies.length > 0 ? { cookies } : {}),
39
- }
40
- }
@@ -1,42 +0,0 @@
1
- import { PikkuFetchHTTPResponse, fetchData } from '@pikku/core/http'
2
- import type {
3
- APIGatewayProxyEventV2,
4
- APIGatewayProxyStructuredResultV2,
5
- } from 'aws-lambda'
6
- import { responseToLambdaV2Result } from './response-converter-v2.js'
7
- import { lambdaV2EventToRequest } from './request-converter-v2.js'
8
-
9
- export const runFetchV2 = async (
10
- event: APIGatewayProxyEventV2
11
- ): Promise<APIGatewayProxyStructuredResultV2> => {
12
- const request = lambdaV2EventToRequest(event)
13
- const response = new PikkuFetchHTTPResponse()
14
-
15
- if (request.method === 'OPTIONS') {
16
- response.header(
17
- 'Access-Control-Allow-Origin',
18
- request.headers.get('origin') || '*'
19
- )
20
- response.header(
21
- 'Access-Control-Allow-Headers',
22
- 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'
23
- )
24
- response.header(
25
- 'Access-Control-Allow-Methods',
26
- 'OPTIONS,DELETE,GET,HEAD,PATCH,POST,PUT'
27
- )
28
- response.status(200)
29
- return responseToLambdaV2Result(response.toResponse())
30
- }
31
-
32
- try {
33
- await fetchData(request, response)
34
- } catch (err) {
35
- console.error('fetchData error:', err)
36
- response.status(500)
37
- response.header('content-type', 'application/json')
38
- response.json({ error: 'Internal Server Error' })
39
- }
40
-
41
- return responseToLambdaV2Result(response.toResponse())
42
- }
@@ -1,32 +0,0 @@
1
- import { PikkuFetchHTTPResponse, fetchData } from '@pikku/core/http'
2
- import type { APIGatewayEvent, APIGatewayProxyResult } from 'aws-lambda'
3
- import { responseToLambdaResult } from '../response-converter.js'
4
- import { lambdaEventToRequest } from '../request-converter.js'
5
-
6
- export const runFetch = async (
7
- event: APIGatewayEvent
8
- ): Promise<APIGatewayProxyResult> => {
9
- const request = lambdaEventToRequest(event)
10
- const response = new PikkuFetchHTTPResponse()
11
-
12
- if (request.method === 'OPTIONS') {
13
- response.header(
14
- 'Access-Control-Allow-Headers',
15
- 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'
16
- )
17
- response.header(
18
- 'Access-Control-Allow-Methods',
19
- 'OPTIONS,DELETE,GET,HEAD,PATCH,POST,PUT'
20
- )
21
- response.status(200)
22
- return responseToLambdaResult(response.toResponse())
23
- }
24
-
25
- try {
26
- await fetchData(request, response)
27
- } catch {
28
- // Error should have already been handled by fetch
29
- }
30
-
31
- return responseToLambdaResult(response.toResponse())
32
- }
package/src/index.test.ts DELETED
@@ -1,13 +0,0 @@
1
- import assert from 'node:assert/strict'
2
- import { describe, test } from 'node:test'
3
-
4
- import * as lambdaRuntime from './index.js'
5
-
6
- describe('@pikku/lambda', () => {
7
- test('exports the lambda runtime API', () => {
8
- assert.equal(typeof lambdaRuntime.createLambdaHandler, 'function')
9
- assert.equal(typeof lambdaRuntime.LambdaDeploymentService, 'function')
10
- assert.equal(typeof lambdaRuntime.SQSQueueService, 'function')
11
- assert.equal(typeof lambdaRuntime.runFetch, 'function')
12
- })
13
- })
package/src/index.ts DELETED
@@ -1,11 +0,0 @@
1
- export * from './http/index.js'
2
- export * from './websocket/index.js'
3
- export * from './queue/index.js'
4
- export * from './scheduled/index.js'
5
- export {
6
- createLambdaHandler,
7
- createLambdaWorkerHandler,
8
- createLambdaWebSocketHandler,
9
- } from './handler-factories.js'
10
- export { SQSQueueService } from './sqs-queue-service.js'
11
- export { LambdaDeploymentService } from './lambda-deployment-service.js'
@@ -1,115 +0,0 @@
1
- /**
2
- * Lambda deployment service — routes remote() calls via Lambda Invoke.
3
- *
4
- * When a gateway (agent, MCP, channel, workflow orchestrator) calls
5
- * remote('funcName'), this service dispatches to the function's Lambda
6
- * via the AWS SDK InvokeCommand. Equivalent to Cloudflare's service bindings.
7
- *
8
- * Session propagation uses the existing pikkuRemoteAuthMiddleware:
9
- * JWT signed with PIKKU_REMOTE_SECRET, session encrypted in payload.
10
- */
11
-
12
- import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'
13
- import type { DeploymentService, DeploymentConfig } from '@pikku/core/services'
14
- import type { JWTService } from '@pikku/core/services'
15
- import type { SecretService } from '@pikku/core/services'
16
- import { buildRemoteHeaders } from '@pikku/core/remote'
17
-
18
- export class LambdaDeploymentService implements DeploymentService {
19
- private client: LambdaClient
20
- private bindings: Map<string, string>
21
-
22
- constructor(
23
- private jwt: JWTService | undefined,
24
- private secrets: SecretService,
25
- functionBindings: Record<string, string>
26
- ) {
27
- this.client = new LambdaClient({})
28
- this.bindings = new Map(Object.entries(functionBindings))
29
- }
30
-
31
- async init(): Promise<void> {}
32
- async start(_config: DeploymentConfig): Promise<void> {}
33
- async stop(): Promise<void> {}
34
-
35
- async invoke(
36
- funcName: string,
37
- data: unknown,
38
- session?: unknown,
39
- traceId?: string
40
- ): Promise<unknown> {
41
- const lambdaFunctionName = this.bindings.get(funcName)
42
- if (!lambdaFunctionName) {
43
- throw new Error(
44
- `No Lambda binding for function '${funcName}'. ` +
45
- `Available bindings: ${[...this.bindings.keys()].join(', ')}`
46
- )
47
- }
48
-
49
- const headers = await buildRemoteHeaders(
50
- this.jwt,
51
- this.secrets,
52
- funcName,
53
- session,
54
- traceId
55
- )
56
-
57
- // Build an API Gateway v2 event for the target Lambda
58
- const rpcPath = `/remote/rpc/${encodeURIComponent(funcName)}`
59
- const apiGatewayEvent = {
60
- httpMethod: 'POST',
61
- path: rpcPath,
62
- headers,
63
- body: JSON.stringify({ data }),
64
- isBase64Encoded: false,
65
- queryStringParameters: null,
66
- pathParameters: null,
67
- stageVariables: null,
68
- requestContext: {
69
- httpMethod: 'POST',
70
- path: rpcPath,
71
- stage: 'prod',
72
- requestId: crypto.randomUUID(),
73
- identity: {},
74
- },
75
- resource: rpcPath,
76
- }
77
-
78
- const response = await this.client.send(
79
- new InvokeCommand({
80
- FunctionName: lambdaFunctionName,
81
- Payload: JSON.stringify(apiGatewayEvent),
82
- })
83
- )
84
-
85
- if (response.FunctionError) {
86
- const errorPayload = response.Payload
87
- ? new TextDecoder().decode(response.Payload)
88
- : 'Unknown error'
89
- throw new Error(
90
- `Remote RPC call to '${funcName}' failed: Lambda error: ${errorPayload}`
91
- )
92
- }
93
-
94
- if (!response.Payload) {
95
- throw new Error(`Remote RPC call to '${funcName}' returned no payload`)
96
- }
97
-
98
- // The Lambda returns an API Gateway response shape
99
- const lambdaResult = JSON.parse(new TextDecoder().decode(response.Payload))
100
-
101
- if (lambdaResult.statusCode && lambdaResult.statusCode >= 400) {
102
- throw new Error(
103
- `Remote RPC call to '${funcName}' failed: ${lambdaResult.statusCode} ${lambdaResult.body}`
104
- )
105
- }
106
-
107
- // Parse the body from the API Gateway response
108
- const body = lambdaResult.body
109
- try {
110
- return JSON.parse(body)
111
- } catch {
112
- return body
113
- }
114
- }
115
- }
@@ -1 +0,0 @@
1
- export { runSQSQueueWorker } from './sqs-worker.js'
@@ -1,101 +0,0 @@
1
- import type { SQSBatchResponse, SQSEvent, SQSRecord } from 'aws-lambda'
2
- import { runQueueJob } from '@pikku/core/queue'
3
- import { QueueJobFailedError, QueueJobDiscardedError } from '@pikku/core/queue'
4
- import type { Logger } from '@pikku/core/services'
5
- import type { QueueJob, QueueJobStatus } from '@pikku/core/queue'
6
-
7
- /**
8
- * Enhanced version with additional SQS-specific features
9
- */
10
- export function mapSQSRecordToQueueJob(
11
- record: SQSRecord,
12
- maxAttempts?: number
13
- ): QueueJob {
14
- let data: any
15
-
16
- try {
17
- data = JSON.parse(record.body)
18
- } catch {
19
- data = record.body
20
- }
21
-
22
- if (!record.eventSourceARN) {
23
- throw new Error('SQS record does not have eventSourceARN')
24
- }
25
-
26
- const queueName = record.eventSourceARN.split(':').pop()!
27
-
28
- const job: QueueJob = {
29
- queueName,
30
- data,
31
- id: record.messageId,
32
- status: async () => 'active' as QueueJobStatus,
33
- metadata: () => ({
34
- processedAt: new Date(),
35
- attemptsMade: parseInt(record.attributes.ApproximateReceiveCount) - 1,
36
- maxAttempts,
37
- result: undefined,
38
- progress: 0,
39
- createdAt: new Date(parseInt(record.attributes.SentTimestamp)),
40
- completedAt: undefined,
41
- failedAt: undefined,
42
- error: undefined,
43
- }),
44
- waitForCompletion: async () => {
45
- throw new Error(
46
- 'SQS does not support waitForCompletion - jobs are fire-and-forget'
47
- )
48
- },
49
- }
50
- return job
51
- }
52
-
53
- /**
54
- * Create an SQS handler that processes queue jobs using Pikku
55
- */
56
- export const runSQSQueueWorker = async (
57
- logger: Logger,
58
- event: SQSEvent
59
- ): Promise<SQSBatchResponse> => {
60
- logger.info(`Processing ${event.Records.length} SQS messages`)
61
- const jobs = event.Records.map(mapSQSRecordToQueueJob)
62
-
63
- // Process all jobs in parallel
64
- const results = await Promise.allSettled(
65
- jobs.map(async (job) => {
66
- try {
67
- return await runQueueJob({ job })
68
- } catch (error: unknown) {
69
- if (error instanceof QueueJobFailedError) {
70
- // Let SQS handle this as a failed job (will go to retry or DLQ)
71
- throw error
72
- } else if (error instanceof QueueJobDiscardedError) {
73
- // For SQS, discarding means completing successfully (no retry)
74
- logger.info(`SQS job ${job.id} discarded: ${error.message}`)
75
- return
76
- }
77
- throw error
78
- }
79
- })
80
- )
81
-
82
- // Log any failures but don't throw (SQS will handle retries)
83
- results.forEach((result, index) => {
84
- if (result.status === 'rejected') {
85
- logger.error(
86
- `Failed to process SQS message ${jobs[index]!.id}:`,
87
- result.reason
88
- )
89
- }
90
- })
91
-
92
- return {
93
- batchItemFailures: results
94
- .map((result, index) => ({
95
- result,
96
- itemIdentifier: jobs[index]!.id || `message-${index}`,
97
- }))
98
- .filter(({ result }) => result.status === 'rejected')
99
- .map(({ itemIdentifier }) => ({ itemIdentifier })),
100
- }
101
- }
@@ -1,24 +0,0 @@
1
- import type { APIGatewayProxyEvent } from 'aws-lambda'
2
-
3
- export const lambdaEventToRequest = (event: APIGatewayProxyEvent): Request => {
4
- const url = new URL(event.path, `https://${event.headers.host}`)
5
-
6
- if (event.queryStringParameters) {
7
- for (const [key, value] of Object.entries(event.queryStringParameters)) {
8
- if (value !== undefined) url.searchParams.set(key, value)
9
- }
10
- }
11
-
12
- const body =
13
- event.body && event.isBase64Encoded
14
- ? Buffer.from(event.body, 'base64')
15
- : event.body || undefined
16
-
17
- const method = event.httpMethod || 'GET'
18
-
19
- return new Request(url.toString(), {
20
- method,
21
- headers: event.headers as HeadersInit,
22
- body: ['GET', 'HEAD'].includes(method.toUpperCase()) ? undefined : body,
23
- })
24
- }
@@ -1,33 +0,0 @@
1
- import type { APIGatewayProxyResult } from 'aws-lambda'
2
-
3
- export const responseToLambdaResult = async (
4
- response: Response
5
- ): Promise<APIGatewayProxyResult> => {
6
- const headers: Record<string, string> = {}
7
- response.headers.forEach((value, key) => {
8
- headers[key.toLowerCase()] = value
9
- })
10
-
11
- let body: string
12
- let isBase64Encoded = false
13
-
14
- const contentType = response.headers.get('content-type') || ''
15
- const isBinary = !/^text\/|application\/(json|javascript|xml)/.test(
16
- contentType
17
- )
18
-
19
- const buffer = Buffer.from(await response.arrayBuffer())
20
- if (isBinary) {
21
- body = buffer.toString('base64')
22
- isBase64Encoded = true
23
- } else {
24
- body = buffer.toString('utf-8')
25
- }
26
-
27
- return {
28
- statusCode: response.status,
29
- headers,
30
- body,
31
- isBase64Encoded,
32
- }
33
- }
@@ -1 +0,0 @@
1
- export { runLambdaScheduled } from './run-scheduled.js'
@@ -1,31 +0,0 @@
1
- /**
2
- * Lambda handler for EventBridge scheduled events.
3
- *
4
- * Since each Lambda corresponds to a single unit, and each unit has
5
- * specific scheduled tasks registered, we run all tasks in this unit
6
- * when the schedule fires.
7
- */
8
-
9
- import type { ScheduledEvent } from 'aws-lambda'
10
- import { runScheduledTask } from '@pikku/core/scheduler'
11
- import { getScheduledTasks } from '@pikku/core/scheduler'
12
-
13
- export const runLambdaScheduled = async (
14
- _event: ScheduledEvent
15
- ): Promise<void> => {
16
- const scheduledTasks = getScheduledTasks()
17
-
18
- // Run all scheduled tasks registered in this unit.
19
- // Typically one task per unit, but iterate all to be safe.
20
- for (const [name] of scheduledTasks) {
21
- const traceId = `cron-${crypto.randomUUID()}`
22
- try {
23
- await runScheduledTask({ name, traceId })
24
- } catch (err) {
25
- console.error(
26
- `Scheduled task '${name}' (traceId: ${traceId}) failed:`,
27
- err
28
- )
29
- }
30
- }
31
- }
@@ -1,92 +0,0 @@
1
- /**
2
- * SQS implementation of QueueService (producer side).
3
- *
4
- * Sends messages to SQS queues. Queue URLs are resolved from environment
5
- * variables following the convention: SQS_QUEUE_URL_<SCREAMING_SNAKE_NAME>.
6
- *
7
- * The consumer side is handled by sqs-worker.ts (runSQSQueueWorker).
8
- */
9
-
10
- import { SQSClient, SendMessageCommand } from '@aws-sdk/client-sqs'
11
- import type { QueueService, QueueJob } from '@pikku/core/queue'
12
- import type { JobOptions } from '@pikku/core/queue'
13
-
14
- export class SQSQueueService implements QueueService {
15
- readonly supportsResults = false
16
- private client: SQSClient
17
-
18
- constructor(private queueUrlMap?: Record<string, string>) {
19
- this.client = new SQSClient({})
20
- }
21
-
22
- async add<T>(
23
- queueName: string,
24
- data: T,
25
- options?: JobOptions
26
- ): Promise<string> {
27
- const queueUrl = this.resolveQueueUrl(queueName)
28
- const messageId = crypto.randomUUID()
29
-
30
- const message = {
31
- id: messageId,
32
- queueName,
33
- data,
34
- pikkuUserId: options?.pikkuUserId,
35
- }
36
-
37
- const result = await this.client.send(
38
- new SendMessageCommand({
39
- QueueUrl: queueUrl,
40
- MessageBody: JSON.stringify(message),
41
- DelaySeconds: options?.delay
42
- ? Math.min(Math.ceil(options.delay / 1000), 900)
43
- : undefined,
44
- })
45
- )
46
-
47
- return result.MessageId ?? messageId
48
- }
49
-
50
- async getJob<T, R>(
51
- _queueName: string,
52
- _jobId: string
53
- ): Promise<QueueJob<T, R> | null> {
54
- throw new Error(
55
- 'SQSQueueService does not support getJob(). ' +
56
- 'SQS is fire-and-forget. ' +
57
- 'Use BullMQ or PgBoss if you need job result tracking.'
58
- )
59
- }
60
-
61
- /**
62
- * Resolves the SQS queue URL for a given queue name.
63
- *
64
- * Checks in order:
65
- * 1. Explicit queueUrlMap passed in constructor
66
- * 2. Environment variable SQS_QUEUE_URL_<SCREAMING_SNAKE>
67
- */
68
- private resolveQueueUrl(queueName: string): string {
69
- if (this.queueUrlMap?.[queueName]) {
70
- return this.queueUrlMap[queueName]
71
- }
72
-
73
- const envKey = `SQS_QUEUE_URL_${toScreamingSnake(queueName)}`
74
- const url = process.env[envKey]
75
-
76
- if (!url) {
77
- throw new Error(
78
- `SQS queue URL not found for queue "${queueName}". ` +
79
- `Set environment variable ${envKey} or pass queueUrlMap to constructor.`
80
- )
81
- }
82
-
83
- return url
84
- }
85
- }
86
-
87
- function toScreamingSnake(name: string): string {
88
- return name
89
- .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
90
- .replace(/-/g, '_')
91
- .toUpperCase()
92
- }
@@ -1,4 +0,0 @@
1
- export * from './websocket-message.js'
2
- export * from './websocket-connect.js'
3
- export * from './websocket-disconnect.js'
4
- export * from './lambda-eventhub-service.js'
@@ -1,58 +0,0 @@
1
- import type { CoreUserSession } from '@pikku/core/types'
2
- import type { ChannelStore } from '@pikku/core/channel'
3
- import type {
4
- BinaryData,
5
- PikkuChannelHandlerFactory,
6
- } from '@pikku/core/channel'
7
- import { PikkuAbstractChannelHandler } from '@pikku/core/channel'
8
- import { sendMessage } from './utils.js'
9
- import type { ApiGatewayManagementApiClient } from '@aws-sdk/client-apigatewaymanagementapi'
10
- import type { Logger } from '@pikku/core/services'
11
-
12
- class LambdaChannelHandler<
13
- UserSession extends CoreUserSession = CoreUserSession,
14
- OpeningData = unknown,
15
- Out = unknown,
16
- > extends PikkuAbstractChannelHandler<OpeningData, Out> {
17
- constructor(
18
- private logger: Logger,
19
- private callbackAPI: ApiGatewayManagementApiClient,
20
- channelId: string,
21
- channelName: string,
22
- openingData: OpeningData
23
- ) {
24
- super(channelId, channelName, openingData)
25
- }
26
-
27
- public async send(message: Out, isBinary?: boolean) {
28
- if (isBinary) {
29
- throw new Error('Binary data is not supported on serverless lambdas')
30
- }
31
- const data = JSON.stringify(message)
32
- await sendMessage(this.logger, this.callbackAPI, this.channelId, data)
33
- }
34
-
35
- public sendBinary(_data: BinaryData): void {
36
- throw new Error('Binary data is not supported on serverless lambdas')
37
- }
38
- }
39
-
40
- export const createLambdaChannelHandlerFactory = (
41
- logger: Logger,
42
- channelStore: ChannelStore,
43
- callbackAPI: ApiGatewayManagementApiClient
44
- ) => {
45
- const factory: PikkuChannelHandlerFactory = (
46
- channelId,
47
- channelName,
48
- openingData
49
- ) =>
50
- new LambdaChannelHandler(
51
- logger,
52
- callbackAPI,
53
- channelId,
54
- channelName,
55
- openingData
56
- )
57
- return factory
58
- }
@@ -1,66 +0,0 @@
1
- import type { ApiGatewayManagementApiClient } from '@aws-sdk/client-apigatewaymanagementapi'
2
- import type { ChannelStore, EventHubService } from '@pikku/core/channel'
3
- import type { EventHubStore } from '@pikku/core/channel'
4
- import { getApiGatewayManagementApiClient, sendMessages } from './utils.js'
5
- import type { Logger } from '@pikku/core/services'
6
- import type { APIGatewayEvent } from 'aws-lambda'
7
-
8
- export class LambdaEventHubService<
9
- EventTopics extends Record<string, any> = {},
10
- > implements EventHubService<EventTopics> {
11
- private callbackAPI: ApiGatewayManagementApiClient
12
-
13
- constructor(
14
- private logger: Logger,
15
- event: APIGatewayEvent,
16
- private channelStore: ChannelStore,
17
- private eventHubStore: EventHubStore<EventTopics>
18
- ) {
19
- this.callbackAPI = getApiGatewayManagementApiClient(logger, event)
20
- }
21
-
22
- async subscribe<T extends keyof EventTopics>(
23
- topic: T,
24
- channelId: string
25
- ): Promise<void> {
26
- await this.eventHubStore.subscribe(topic, channelId)
27
- }
28
-
29
- async unsubscribe<T extends keyof EventTopics>(
30
- topic: T,
31
- channelId: string
32
- ): Promise<void> {
33
- await this.eventHubStore.unsubscribe(topic, channelId)
34
- }
35
-
36
- async publish<T extends keyof EventTopics>(
37
- topic: T,
38
- channelId: string | null,
39
- data: EventTopics[T],
40
- isBinary?: boolean
41
- ): Promise<void> {
42
- const channelIds = await this.eventHubStore.getChannelIdsForTopic(
43
- topic as string
44
- )
45
- if (channelId) {
46
- await this.sendMessages(channelIds, channelId, data, isBinary)
47
- }
48
- }
49
-
50
- private async sendMessages(
51
- channelIds: string[],
52
- fromChannelId: string,
53
- data: EventTopics[keyof EventTopics],
54
- isBinary?: boolean
55
- ): Promise<void> {
56
- await sendMessages(
57
- this.logger,
58
- this.channelStore,
59
- this.callbackAPI,
60
- fromChannelId,
61
- channelIds,
62
- data,
63
- isBinary
64
- )
65
- }
66
- }
@@ -1,96 +0,0 @@
1
- import {
2
- ApiGatewayManagementApiClient,
3
- PostToConnectionCommand,
4
- } from '@aws-sdk/client-apigatewaymanagementapi'
5
- import type { Logger } from '@pikku/core/services'
6
- import { getSingletonServices } from '@pikku/core/state'
7
- import type { APIGatewayEvent } from 'aws-lambda'
8
- import { createLambdaChannelHandlerFactory } from './lambda-channel-handler.js'
9
- import type { ChannelStore } from '@pikku/core/channel'
10
-
11
- export const sendMessage = async (
12
- logger: Logger,
13
- callbackAPI: ApiGatewayManagementApiClient,
14
- ConnectionId: string,
15
- Data: string
16
- ): Promise<boolean> => {
17
- try {
18
- await callbackAPI.send(new PostToConnectionCommand({ ConnectionId, Data }))
19
- return true
20
- } catch (e: any) {
21
- // TODO: We need to check if it's a 410 and remove the connection if it is
22
- // Otherwise we need to log the error
23
- logger.error(e.message)
24
- return false
25
- }
26
- }
27
-
28
- export const sendMessages = async (
29
- logger: Logger,
30
- channelStore: ChannelStore,
31
- callbackAPI: ApiGatewayManagementApiClient,
32
- fromChannelId: string,
33
- channelIds: string[],
34
- data: unknown,
35
- isBinary?: boolean
36
- ): Promise<void> => {
37
- if (isBinary) {
38
- throw new Error('Binary data is not supported on serverless lambdas')
39
- }
40
- const staleWebsockets: string[] = []
41
- const Data = JSON.stringify(data)
42
- await Promise.all(
43
- channelIds.map(async (channelId) => {
44
- if (channelId !== fromChannelId) {
45
- const success = await sendMessage(logger, callbackAPI, channelId, Data)
46
- if (!success) {
47
- staleWebsockets.push(channelId)
48
- }
49
- }
50
- })
51
- )
52
- if (staleWebsockets.length > 0) {
53
- await channelStore.removeChannels(staleWebsockets)
54
- }
55
- }
56
-
57
- export const getApiGatewayManagementApiClient = (
58
- logger: Logger,
59
- event: APIGatewayEvent
60
- ) => {
61
- let endpoint: string
62
- if (process.env.IS_OFFLINE) {
63
- logger.info('Assuming serverless offline mode due to IS_OFFLINE')
64
- endpoint = `http://localhost:3001`
65
- } else if (event.requestContext.domainName?.includes('amazonaws.com')) {
66
- logger.info(
67
- 'Assuming we are using the default endpoint mode due to amazonaws.com domain'
68
- )
69
- endpoint = `https://${event.requestContext.domainName}/${event.requestContext.stage}`
70
- } else {
71
- logger.info('Assuming we are using a custom domain mode')
72
- endpoint = `https://${event.requestContext.domainName}`
73
- }
74
- return new ApiGatewayManagementApiClient({
75
- apiVersion: '2018-11-29',
76
- endpoint,
77
- })
78
- }
79
-
80
- export const getServerlessDependencies = (
81
- channelStore: ChannelStore,
82
- event: APIGatewayEvent
83
- ) => {
84
- const { logger } = getSingletonServices()
85
- const channelId = event.requestContext.connectionId
86
- if (!channelId) {
87
- throw new Error('No connectionId found in requestContext')
88
- }
89
- const callbackAPI = getApiGatewayManagementApiClient(logger, event)
90
- const channelHandlerFactory = createLambdaChannelHandlerFactory(
91
- logger,
92
- channelStore,
93
- callbackAPI
94
- )
95
- return { channelId, callbackAPI, channelHandlerFactory, channelStore }
96
- }
@@ -1,23 +0,0 @@
1
- import { PikkuFetchHTTPRequest, PikkuFetchHTTPResponse } from '@pikku/core/http'
2
- import type { APIGatewayEvent, APIGatewayProxyResult } from 'aws-lambda'
3
- import { responseToLambdaResult } from '../response-converter.js'
4
- import { runChannelConnect } from '@pikku/core/channel/serverless'
5
- import { getServerlessDependencies } from './utils.js'
6
- import type { WebsocketParams } from './websocket-types.js'
7
- import { lambdaEventToRequest } from '../request-converter.js'
8
-
9
- export const connectWebsocket = async (
10
- event: APIGatewayEvent,
11
- { channelStore }: WebsocketParams
12
- ): Promise<APIGatewayProxyResult> => {
13
- const runnerParams = getServerlessDependencies(channelStore, event)
14
- const request = new PikkuFetchHTTPRequest(lambdaEventToRequest(event))
15
- const response = new PikkuFetchHTTPResponse()
16
- await runChannelConnect({
17
- ...runnerParams,
18
- request,
19
- response,
20
- route: event.path || '/',
21
- })
22
- return responseToLambdaResult(response.toResponse())
23
- }
@@ -1,14 +0,0 @@
1
- import { runChannelDisconnect } from '@pikku/core/channel/serverless'
2
- import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'
3
-
4
- import { getServerlessDependencies } from './utils.js'
5
- import type { WebsocketParams } from './websocket-types.js'
6
-
7
- export const disconnectWebsocket = async (
8
- event: APIGatewayProxyEvent,
9
- { channelStore }: WebsocketParams
10
- ): Promise<APIGatewayProxyResult> => {
11
- const runnerParams = getServerlessDependencies(channelStore, event)
12
- await runChannelDisconnect(runnerParams)
13
- return { statusCode: 200, body: '' }
14
- }
@@ -1,23 +0,0 @@
1
- import { PikkuFetchHTTPResponse } from '@pikku/core/http'
2
- import { runChannelMessage } from '@pikku/core/channel/serverless'
3
- import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'
4
- import { getServerlessDependencies } from './utils.js'
5
- import type { WebsocketParams } from './websocket-types.js'
6
- import { responseToLambdaResult } from '../response-converter.js'
7
-
8
- export const processWebsocketMessage = async (
9
- event: APIGatewayProxyEvent,
10
- { channelStore }: WebsocketParams
11
- ): Promise<APIGatewayProxyResult> => {
12
- const runnerParams = getServerlessDependencies(channelStore, event)
13
- const response = new PikkuFetchHTTPResponse()
14
- try {
15
- const result = await runChannelMessage(runnerParams, event.body)
16
- if (result) {
17
- response.json(result as any)
18
- }
19
- } catch (e) {
20
- console.error(e)
21
- }
22
- return responseToLambdaResult(response.toResponse())
23
- }
@@ -1,5 +0,0 @@
1
- import type { ChannelStore } from '@pikku/core/channel'
2
-
3
- export type WebsocketParams = {
4
- channelStore: ChannelStore
5
- }
package/tsconfig.json DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "extends": "../../../tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": "./src",
5
- "module": "Node18",
6
- "outDir": "dist",
7
- "target": "esnext",
8
- "declaration": true
9
- },
10
- "include": ["bin/**/*.ts", "src/**/*.ts"],
11
- "exclude": ["**/*.test.ts", "node_modules", "bin/dist"],
12
- "references": [
13
- {
14
- "path": "../../core/tsconfig.json"
15
- }
16
- ]
17
- }
@@ -1 +0,0 @@
1
- {"root":["./src/handler-factories.ts","./src/index.ts","./src/lambda-deployment-service.ts","./src/request-converter.ts","./src/response-converter.ts","./src/sqs-queue-service.ts","./src/http/index.ts","./src/http/request-converter-v2.ts","./src/http/response-converter-v2.ts","./src/http/run-fetch-v2.ts","./src/http/run-fetch.ts","./src/queue/index.ts","./src/queue/sqs-worker.ts","./src/scheduled/index.ts","./src/scheduled/run-scheduled.ts","./src/websocket/index.ts","./src/websocket/lambda-channel-handler.ts","./src/websocket/lambda-eventhub-service.ts","./src/websocket/utils.ts","./src/websocket/websocket-connect.ts","./src/websocket/websocket-disconnect.ts","./src/websocket/websocket-message.ts","./src/websocket/websocket-types.ts"],"version":"6.0.3"}