serverless-ircd 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/.github/workflows/ci.yml +96 -2
  2. package/.github/workflows/deploy-aws.yml +129 -0
  3. package/.github/workflows/deploy-cf.yml +0 -2
  4. package/.gitmodules +3 -0
  5. package/CHANGELOG.md +436 -0
  6. package/README.md +127 -84
  7. package/apps/aws-stack/README.md +73 -0
  8. package/apps/aws-stack/bin/aws.ts +49 -0
  9. package/apps/aws-stack/cdk.json +10 -0
  10. package/apps/aws-stack/package.json +41 -0
  11. package/apps/aws-stack/scripts/smoke-helpers.d.mts +22 -0
  12. package/apps/aws-stack/scripts/smoke-helpers.mjs +89 -0
  13. package/apps/aws-stack/scripts/smoke.mjs +142 -0
  14. package/apps/aws-stack/src/aws-stack.ts +263 -0
  15. package/apps/aws-stack/src/tables.ts +10 -0
  16. package/apps/aws-stack/tests/localstack.test.ts +46 -0
  17. package/apps/aws-stack/tests/smoke-helpers.test.ts +98 -0
  18. package/apps/aws-stack/tests/stack.test.ts +464 -0
  19. package/apps/aws-stack/tsconfig.build.json +11 -0
  20. package/apps/aws-stack/tsconfig.test.json +8 -0
  21. package/apps/aws-stack/vitest.config.ts +20 -0
  22. package/apps/cf-worker/package.json +1 -1
  23. package/apps/cf-worker/scripts/smoke.mjs +0 -0
  24. package/apps/cf-worker/src/worker.ts +8 -2
  25. package/apps/cf-worker/tests/smoke.test.ts +1 -0
  26. package/apps/cf-worker/wrangler.test.toml +5 -1
  27. package/apps/cf-worker/wrangler.toml +66 -17
  28. package/apps/local-cli/package.json +1 -1
  29. package/apps/local-cli/src/config-loader.ts +57 -0
  30. package/apps/local-cli/src/main.ts +1 -1
  31. package/apps/local-cli/src/server.ts +267 -32
  32. package/apps/local-cli/tests/config-loader.test.ts +107 -0
  33. package/apps/local-cli/tests/e2e.test.ts +126 -0
  34. package/apps/local-cli/tests/security-e2e.test.ts +239 -0
  35. package/biome.json +3 -1
  36. package/docs/ADR-001-pure-reducers-and-effect-system.md +74 -0
  37. package/docs/ADR-002-location-of-authority.md +82 -0
  38. package/docs/ADR-003-durable-object-sharding.md +93 -0
  39. package/docs/ADR-004-dynamodb-schema.md +96 -0
  40. package/docs/ADR-005-wss-only-transport-v1.md +83 -0
  41. package/docs/ADR-006-sasl-mechanism-scope.md +86 -0
  42. package/docs/ADR-007-deterministic-ports.md +82 -0
  43. package/docs/ADR-008-monorepo-tooling.md +60 -0
  44. package/docs/AWS-Adapter-Architecture.md +496 -0
  45. package/docs/AWS-Deployment.md +1186 -0
  46. package/docs/Cloudflare-Deployment-Guide.md +660 -0
  47. package/docs/Home.md +11 -0
  48. package/docs/Observability.md +87 -0
  49. package/docs/PlanIRCv3Websocket.md +489 -0
  50. package/docs/PlanWebClient.md +451 -0
  51. package/docs/Release-Process.md +443 -0
  52. package/package.json +19 -14
  53. package/packages/aws-adapter/README.md +35 -0
  54. package/packages/aws-adapter/package.json +52 -0
  55. package/packages/aws-adapter/src/account-store.ts +121 -0
  56. package/packages/aws-adapter/src/aws-runtime.ts +871 -0
  57. package/packages/aws-adapter/src/cdk-table-defs.ts +73 -0
  58. package/packages/aws-adapter/src/config-loader.ts +126 -0
  59. package/packages/aws-adapter/src/dynamo-account-store.ts +156 -0
  60. package/packages/aws-adapter/src/dynamo.ts +61 -0
  61. package/packages/aws-adapter/src/handlers/connect.ts +44 -0
  62. package/packages/aws-adapter/src/handlers/default.ts +330 -0
  63. package/packages/aws-adapter/src/handlers/disconnect.ts +48 -0
  64. package/packages/aws-adapter/src/handlers/index.ts +293 -0
  65. package/packages/aws-adapter/src/handlers/ping-checker.ts +217 -0
  66. package/packages/aws-adapter/src/handlers/state.ts +13 -0
  67. package/packages/aws-adapter/src/handlers/sweeper.ts +84 -0
  68. package/packages/aws-adapter/src/index.ts +74 -0
  69. package/packages/aws-adapter/src/message-store.ts +34 -0
  70. package/packages/aws-adapter/src/serialize.ts +283 -0
  71. package/packages/aws-adapter/src/tables.ts +53 -0
  72. package/packages/aws-adapter/tests/account-store-dynamo.test.ts +171 -0
  73. package/packages/aws-adapter/tests/account-store.test.ts +280 -0
  74. package/packages/aws-adapter/tests/aws-harness.ts +408 -0
  75. package/packages/aws-adapter/tests/aws-integration.test.ts +17 -0
  76. package/packages/aws-adapter/tests/aws-runtime.test.ts +654 -0
  77. package/packages/aws-adapter/tests/config-loader.test.ts +213 -0
  78. package/packages/aws-adapter/tests/disconnect-fanout.test.ts +336 -0
  79. package/packages/aws-adapter/tests/dynamo.test.ts +57 -0
  80. package/packages/aws-adapter/tests/global-setup.ts +301 -0
  81. package/packages/aws-adapter/tests/gone-exception.test.ts +271 -0
  82. package/packages/aws-adapter/tests/handlers.test.ts +473 -0
  83. package/packages/aws-adapter/tests/message-store.test.ts +55 -0
  84. package/packages/aws-adapter/tests/ping-checker.test.ts +571 -0
  85. package/packages/aws-adapter/tests/serialize.test.ts +249 -0
  86. package/packages/aws-adapter/tests/smoke.test.ts +48 -0
  87. package/packages/aws-adapter/tests/sweeper.test.ts +420 -0
  88. package/packages/aws-adapter/tests/tables.test.ts +74 -0
  89. package/packages/aws-adapter/tests/transactions.test.ts +446 -0
  90. package/packages/aws-adapter/tsconfig.build.json +16 -0
  91. package/packages/aws-adapter/tsconfig.test.json +14 -0
  92. package/packages/aws-adapter/vitest.config.ts +23 -0
  93. package/packages/cf-adapter/package.json +2 -1
  94. package/packages/cf-adapter/src/cf-runtime.ts +42 -22
  95. package/packages/cf-adapter/src/channel-do.ts +40 -1
  96. package/packages/cf-adapter/src/channel-registry-do.ts +58 -0
  97. package/packages/cf-adapter/src/config-loader.ts +135 -0
  98. package/packages/cf-adapter/src/connection-do.ts +119 -0
  99. package/packages/cf-adapter/src/env.ts +27 -1
  100. package/packages/cf-adapter/src/index.ts +2 -1
  101. package/packages/cf-adapter/tests/cf-harness.ts +2 -2
  102. package/packages/cf-adapter/tests/cf-integration.test.ts +2 -2
  103. package/packages/cf-adapter/tests/cf-runtime.test.ts +91 -0
  104. package/packages/cf-adapter/tests/config-loader.test.ts +149 -0
  105. package/packages/cf-adapter/tests/connection-do.test.ts +82 -0
  106. package/packages/cf-adapter/tests/worker/main.ts +2 -1
  107. package/packages/cf-adapter/tests/worker/stubs/channel-stub.ts +7 -1
  108. package/packages/cf-adapter/wrangler.test.toml +10 -1
  109. package/packages/in-memory-runtime/package.json +1 -1
  110. package/packages/in-memory-runtime/src/in-memory-runtime.ts +107 -16
  111. package/packages/in-memory-runtime/src/index.ts +1 -1
  112. package/packages/in-memory-runtime/tests/in-memory-runtime.test.ts +134 -0
  113. package/packages/irc-core/package.json +13 -2
  114. package/packages/irc-core/src/admission.ts +216 -0
  115. package/packages/irc-core/src/caps/capabilities.ts +1 -0
  116. package/packages/irc-core/src/case-fold.ts +64 -0
  117. package/packages/irc-core/src/cloak.ts +81 -0
  118. package/packages/irc-core/src/commands/cap.ts +1 -2
  119. package/packages/irc-core/src/commands/chathistory.ts +305 -0
  120. package/packages/irc-core/src/commands/index.ts +9 -0
  121. package/packages/irc-core/src/commands/invite.ts +6 -9
  122. package/packages/irc-core/src/commands/isupport.ts +1 -1
  123. package/packages/irc-core/src/commands/join.ts +63 -10
  124. package/packages/irc-core/src/commands/kick.ts +4 -11
  125. package/packages/irc-core/src/commands/list.ts +5 -4
  126. package/packages/irc-core/src/commands/mode.ts +5 -9
  127. package/packages/irc-core/src/commands/motd-lines.ts +127 -0
  128. package/packages/irc-core/src/commands/motd.ts +6 -110
  129. package/packages/irc-core/src/commands/oper.ts +151 -0
  130. package/packages/irc-core/src/commands/privmsg.ts +24 -0
  131. package/packages/irc-core/src/commands/registration.ts +79 -21
  132. package/packages/irc-core/src/commands/sasl.ts +251 -0
  133. package/packages/irc-core/src/commands/tagmsg.ts +205 -0
  134. package/packages/irc-core/src/config.ts +270 -0
  135. package/packages/irc-core/src/flood-control.ts +175 -0
  136. package/packages/irc-core/src/index.ts +7 -0
  137. package/packages/irc-core/src/ports.ts +719 -0
  138. package/packages/irc-core/src/protocol/base64.ts +16 -0
  139. package/packages/irc-core/src/protocol/index.ts +2 -1
  140. package/packages/irc-core/src/protocol/numerics.ts +11 -0
  141. package/packages/irc-core/src/protocol/parser.ts +27 -2
  142. package/packages/irc-core/src/state/connection.ts +41 -0
  143. package/packages/irc-core/src/types.ts +88 -2
  144. package/packages/irc-core/stryker.commands.conf.json +41 -0
  145. package/packages/irc-core/stryker.protocol.conf.json +26 -0
  146. package/packages/irc-core/tests/account-store.test.ts +88 -0
  147. package/packages/irc-core/tests/admission.test.ts +229 -0
  148. package/packages/irc-core/tests/caps/capabilities.test.ts +22 -0
  149. package/packages/irc-core/tests/case-fold.test.ts +80 -0
  150. package/packages/irc-core/tests/cloak.test.ts +78 -0
  151. package/packages/irc-core/tests/commands/chathistory.test.ts +996 -0
  152. package/packages/irc-core/tests/commands/join.test.ts +246 -2
  153. package/packages/irc-core/tests/commands/kick.test.ts +15 -0
  154. package/packages/irc-core/tests/commands/oper.test.ts +257 -0
  155. package/packages/irc-core/tests/commands/privmsg.test.ts +146 -2
  156. package/packages/irc-core/tests/commands/registration.test.ts +380 -20
  157. package/packages/irc-core/tests/commands/sasl.test.ts +536 -0
  158. package/packages/irc-core/tests/commands/tagmsg.test.ts +688 -0
  159. package/packages/irc-core/tests/commands/who.test.ts +22 -4
  160. package/packages/irc-core/tests/commands/whois.test.ts +8 -1
  161. package/packages/irc-core/tests/config.test.ts +721 -0
  162. package/packages/irc-core/tests/flood-control.test.ts +394 -0
  163. package/packages/irc-core/tests/message-store.test.ts +530 -0
  164. package/packages/irc-core/tests/parser.test.ts +44 -1
  165. package/packages/irc-core/tests/ports.test.ts +263 -0
  166. package/packages/irc-server/package.json +1 -1
  167. package/packages/irc-server/src/actor.ts +186 -44
  168. package/packages/irc-server/src/dispatch.ts +89 -5
  169. package/packages/irc-server/src/index.ts +2 -0
  170. package/packages/irc-server/src/routing.ts +160 -0
  171. package/packages/irc-server/tests/actor.test.ts +690 -15
  172. package/packages/irc-server/tests/dispatch.test.ts +84 -0
  173. package/packages/irc-server/tests/routing.test.ts +204 -0
  174. package/packages/irc-test-support/README.md +32 -0
  175. package/packages/irc-test-support/package.json +37 -0
  176. package/packages/{cf-adapter/tests/integration → irc-test-support/src}/in-memory-harness.ts +6 -5
  177. package/packages/irc-test-support/src/index.ts +24 -0
  178. package/packages/{cf-adapter/tests/integration/harness.test.ts → irc-test-support/tests/in-memory-harness.test.ts} +1 -1
  179. package/packages/{cf-adapter/tests/integration/scenarios.test.ts → irc-test-support/tests/in-memory-scenarios.test.ts} +1 -2
  180. package/packages/irc-test-support/tests/smoke.test.ts +11 -0
  181. package/packages/irc-test-support/tsconfig.build.json +16 -0
  182. package/packages/irc-test-support/tsconfig.test.json +14 -0
  183. package/packages/irc-test-support/vitest.config.ts +20 -0
  184. package/pnpm-workspace.yaml +1 -0
  185. package/tools/ci-hardening/package.json +30 -0
  186. package/tools/ci-hardening/src/index.ts +6 -0
  187. package/tools/ci-hardening/src/validate.ts +103 -0
  188. package/tools/ci-hardening/tests/__no_thresholds__.txt +11 -0
  189. package/tools/ci-hardening/tests/__partial_thresholds__.txt +16 -0
  190. package/tools/ci-hardening/tests/__stryker_bad__.json +4 -0
  191. package/tools/ci-hardening/tests/validate.test.ts +177 -0
  192. package/tools/ci-hardening/tsconfig.build.json +12 -0
  193. package/tools/ci-hardening/tsconfig.test.json +10 -0
  194. package/tools/ci-hardening/vitest.config.ts +21 -0
  195. package/tools/seed-aws-accounts.ts +80 -0
  196. package/tools/tcp-ws-forwarder/package.json +1 -1
  197. package/tools/tcp-ws-forwarder/src/forwarder.ts +34 -23
  198. package/tools/tcp-ws-forwarder/src/logger.ts +155 -0
  199. package/tools/tcp-ws-forwarder/src/main.ts +33 -14
  200. package/tools/tcp-ws-forwarder/tests/forwarder.test.ts +86 -0
  201. package/tools/tcp-ws-forwarder/tests/logger.test.ts +136 -0
  202. package/packages/cf-adapter/tests/integration/index.ts +0 -17
  203. /package/packages/{cf-adapter/tests/integration → irc-test-support/src}/harness.ts +0 -0
  204. /package/packages/{cf-adapter/tests/integration → irc-test-support/src}/scenarios.ts +0 -0
@@ -1,5 +1,24 @@
1
1
  name: CI
2
2
 
3
+ # Cross-cutting verification pipeline (coverage gate + contract suite
4
+ # on every PR + mutation-testing spot-check on irc-core).
5
+ #
6
+ # Failure modes (any of these blocks the merge):
7
+ # - biome lint
8
+ # - tsc strict typecheck across the workspace
9
+ # - any package unit/integration test
10
+ # - vitest per-package coverage threshold regression
11
+ # (100% on irc-core/irc-server/in-memory-runtime, >=90% elsewhere)
12
+ # - integration contract suite (packages/cf-adapter/tests/integration)
13
+ # - Stryker mutation score < 80% on irc-core/protocol or
14
+ # irc-core/commands
15
+ #
16
+ # The coverage gate is split into its own named step so the GitHub
17
+ # Actions UI surfaces "Coverage gate" as the failing step instead of
18
+ # the generic "Test with coverage" name. The mutation job runs in
19
+ # parallel because Stryker is the slowest single task in the pipeline
20
+ # and is independent of the typecheck/lint/coverage chain.
21
+
3
22
  on:
4
23
  push:
5
24
  branches: [main]
@@ -16,8 +35,6 @@ jobs:
16
35
 
17
36
  - name: Setup pnpm
18
37
  uses: pnpm/action-setup@v4
19
- with:
20
- version: 9
21
38
 
22
39
  - name: Setup Node
23
40
  uses: actions/setup-node@v4
@@ -37,6 +54,40 @@ jobs:
37
54
  - name: Test with coverage
38
55
  run: pnpm coverage
39
56
 
57
+ - name: Coverage gate (coverage-thresholds enforced per package)
58
+ # Vitest enforces 100% line/function/branch/statement coverage
59
+ # on irc-core/irc-server/in-memory-runtime and >=90% on
60
+ # cf-adapter/local-cli/tcp-ws-forwarder via the `thresholds`
61
+ # block in each package's vitest.config.ts. The previous step
62
+ # exits non-zero on any regression; this named no-op marker
63
+ # makes the gate explicit in the Actions UI and reserves a
64
+ # place to plug in a future aggregate-coverage check.
65
+ if: success()
66
+ run: |
67
+ echo "coverage-thresholds: PASSED"
68
+ echo " irc-core: 100% (lines/functions/branches/statements)"
69
+ echo " irc-server: 100% (lines/functions/branches/statements)"
70
+ echo " in-memory-runtime: 100% (lines/functions/branches/statements)"
71
+ echo " cf-adapter: >=90% (lines/functions/branches/statements)"
72
+ echo " local-cli: >=90% (lines/functions/branches/statements)"
73
+
74
+ - name: Contract tests (parametrized integration suite)
75
+ # The parametrized integration contract suite
76
+ # (packages/cf-adapter/tests/integration) runs the same IRC
77
+ # scenarios against every runtime via a runtime factory, so
78
+ # any contract regression in irc-core surfaces here even when
79
+ # unit coverage is 100%. Invoked explicitly here so the step
80
+ # name shows up in the Actions UI; the underlying test files
81
+ # are also exercised by `pnpm coverage` above.
82
+ run: pnpm --filter @serverless-ircd/cf-adapter test
83
+
84
+ - name: CI hardening config self-check
85
+ # Validates that the coverage gate and mutation-testing
86
+ # configs exist and meet the documented thresholds. Catches
87
+ # drift (someone lowering a threshold or dropping a Stryker
88
+ # config) before it reaches main.
89
+ run: pnpm --filter @serverless-ircd/ci-hardening test
90
+
40
91
  - name: Upload coverage
41
92
  if: always()
42
93
  uses: actions/upload-artifact@v4
@@ -45,3 +96,46 @@ jobs:
45
96
  path: |
46
97
  packages/*/coverage
47
98
  apps/*/coverage
99
+
100
+ mutation:
101
+ name: mutation spot-check (irc-core)
102
+ runs-on: ubuntu-latest
103
+ # Stryker is the slowest single task; it is independent of the
104
+ # typecheck/lint/coverage chain and runs in parallel.
105
+ steps:
106
+ - name: Checkout
107
+ uses: actions/checkout@v4
108
+
109
+ - name: Setup pnpm
110
+ uses: pnpm/action-setup@v4
111
+
112
+ - name: Setup Node
113
+ uses: actions/setup-node@v4
114
+ with:
115
+ node-version: 20
116
+ cache: pnpm
117
+
118
+ - name: Install dependencies
119
+ run: pnpm install --frozen-lockfile
120
+
121
+ - name: Build workspace (irc-core mutation targets)
122
+ run: pnpm build
123
+
124
+ - name: Stryker spot-check on irc-core/protocol
125
+ # Mutation score threshold >=80% is enforced by the
126
+ # stryker.protocol.conf.json `thresholds.break` field. The
127
+ # job fails if the score drops below the gate.
128
+ run: pnpm mutation:protocol
129
+
130
+ - name: Stryker spot-check on irc-core/commands
131
+ # Mutation score threshold >=80% is enforced by the
132
+ # stryker.commands.conf.json `thresholds.break` field. The
133
+ # job fails if the score drops below the gate.
134
+ run: pnpm mutation:commands
135
+
136
+ - name: Upload mutation report
137
+ if: always()
138
+ uses: actions/upload-artifact@v4
139
+ with:
140
+ name: mutation-report
141
+ path: packages/irc-core/reports/mutation
@@ -0,0 +1,129 @@
1
+ name: deploy-aws
2
+
3
+ # AWS CDK deploy pipeline.
4
+ #
5
+ # On every push to `main`:
6
+ # 1. Install deps (frozen lockfile).
7
+ # 2. Build the aws-adapter + irc-core/irc-server so the CDK stack
8
+ # typechecks against real workspace packages.
9
+ # 3. `cdk deploy --all` the `apps/aws-stack` stack (API Gateway v2
10
+ # WebSocket API, Lambda, DynamoDB tables) to the staging AWS
11
+ # account/region.
12
+ # 4. Replay the smoke e2e (`scripts/smoke.mjs`) against the deployed
13
+ # WebSocket endpoint — CONNECT/REGISTER/JOIN/PRIVMSG/QUIT. Failure
14
+ # blocks the merge (the deploy job is required on `main`).
15
+ #
16
+ # Secrets / variables (configure under repo Settings → Secrets and
17
+ # variables → Actions):
18
+ # AWS_ACCESS_KEY_ID Static AWS access key with permission to deploy
19
+ # the stack (IAM, APIGW, Lambda, DynamoDB).
20
+ # Required unless OIDC is used (see below).
21
+ # AWS_SECRET_ACCESS_KEY Companion secret key. Required unless OIDC.
22
+ # AWS_DEPLOY_ROLE_ARN Optional. When set, the job assumes this role
23
+ # via OIDC web identity instead of using static
24
+ # access keys. Requires `permissions.id-token:
25
+ # write` (declared below) and an OIDC trust
26
+ # policy on the role granting
27
+ # `sts:AssumeRoleWithWebIdentity` to this repo's
28
+ # GitHub OIDC provider.
29
+ # AWS_REGION AWS region to deploy into (e.g. us-east-1).
30
+ #
31
+ # Repo variable (Settings → Secrets and variables → Variables):
32
+ # AWS_SMOKE_URL Optional. The wss:// URL of the deployed
33
+ # WebSocket stage. When unset the workflow
34
+ # falls back to reading the stack's `ConnectUrl`
35
+ # CloudFormation output via the AWS CLI; if that
36
+ # also fails the smoke step is skipped with a
37
+ # warning (mirrors the CF pipeline's skip
38
+ # behaviour).
39
+
40
+ on:
41
+ push:
42
+ branches: [main]
43
+ workflow_dispatch:
44
+
45
+ # OIDC web identity requires id-token write; contents:read for checkout.
46
+ permissions:
47
+ id-token: write
48
+ contents: read
49
+
50
+ # Prevent two deploys racing the same CloudFormation stack.
51
+ concurrency:
52
+ group: aws-staging
53
+ cancel-in-progress: false
54
+
55
+ jobs:
56
+ deploy-staging:
57
+ name: cdk deploy --all (staging)
58
+ runs-on: ubuntu-latest
59
+ timeout-minutes: 10
60
+ steps:
61
+ - name: Checkout
62
+ uses: actions/checkout@v4
63
+
64
+ - name: Setup pnpm
65
+ uses: pnpm/action-setup@v4
66
+ with:
67
+ version: 9
68
+
69
+ - name: Setup Node
70
+ uses: actions/setup-node@v4
71
+ with:
72
+ node-version: 20
73
+ cache: pnpm
74
+
75
+ - name: Install dependencies
76
+ run: pnpm install --frozen-lockfile
77
+
78
+ - name: Build workspace
79
+ run: pnpm build
80
+
81
+ - name: Typecheck
82
+ run: pnpm typecheck
83
+
84
+ - name: Test
85
+ run: pnpm test
86
+
87
+ # When AWS_DEPLOY_ROLE_ARN is set, assume it via OIDC web identity
88
+ # (ignores the static access keys). Otherwise fall back to the
89
+ # static access-key pair. Both shapes are handled by the action:
90
+ # an empty role-to-assume is treated as unset.
91
+ - name: Configure AWS credentials
92
+ uses: aws-actions/configure-aws-credentials@v4
93
+ with:
94
+ aws-region: ${{ secrets.AWS_REGION }}
95
+ role-to-assume: ${{ secrets.AWS_DEPLOY_ROLE_ARN }}
96
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
97
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
98
+
99
+ - name: Deploy to staging
100
+ run: pnpm deploy:aws:staging -- -c environmentName=staging
101
+
102
+ - name: Resolve smoke URL
103
+ id: smoke-url
104
+ env:
105
+ AWS_SMOKE_URL: ${{ vars.AWS_SMOKE_URL }}
106
+ run: |
107
+ if [ -n "$AWS_SMOKE_URL" ]; then
108
+ echo "url=$AWS_SMOKE_URL" >> "$GITHUB_OUTPUT"
109
+ else
110
+ # Fall back to the stack's ConnectUrl CloudFormation output.
111
+ # Stack name is `IrcAwsStack-<environmentName>`; staging →
112
+ # `IrcAwsStack-staging`.
113
+ URL=$(aws cloudformation describe-stacks \
114
+ --stack-name IrcAwsStack-staging \
115
+ --query 'Stacks[0].Outputs[?OutputKey==`ConnectUrl`].OutputValue' \
116
+ --output text 2>/dev/null || true)
117
+ if [ -n "$URL" ]; then
118
+ echo "url=$URL" >> "$GITHUB_OUTPUT"
119
+ else
120
+ echo "::warning::Unable to resolve the staging WebSocket URL (set the AWS_SMOKE_URL repo variable or check the stack ConnectUrl output); smoke step will be skipped."
121
+ echo "url=" >> "$GITHUB_OUTPUT"
122
+ fi
123
+ fi
124
+
125
+ - name: Smoke e2e
126
+ if: steps.smoke-url.outputs.url != ''
127
+ env:
128
+ SMOKE_URL: ${{ steps.smoke-url.outputs.url }}
129
+ run: pnpm smoke:aws:staging -- --url "$SMOKE_URL"
@@ -45,8 +45,6 @@ jobs:
45
45
 
46
46
  - name: Setup pnpm
47
47
  uses: pnpm/action-setup@v4
48
- with:
49
- version: 9
50
48
 
51
49
  - name: Setup Node
52
50
  uses: actions/setup-node@v4
package/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "docs"]
2
+ path = docs
3
+ url = https://gitea.com/fowlmouth/ServerlessIRCd.wiki.git