okengine 0.2.6 → 0.3.2
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/AGENTS.md +33 -30
- package/README.md +74 -340
- package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
- package/package.json +47 -44
- package/site/content/docs/ai/llms-txt.mdx +54 -0
- package/site/content/docs/ai/mcp.mdx +123 -0
- package/site/content/docs/ai/meta.json +5 -0
- package/site/content/docs/ai/skills.mdx +53 -0
- package/site/content/docs/console/access.mdx +29 -0
- package/site/content/docs/console/ai.mdx +35 -0
- package/site/content/docs/console/architecture.mdx +35 -0
- package/site/content/docs/console/channels.mdx +37 -0
- package/site/content/docs/console/clock.mdx +31 -0
- package/site/content/docs/console/flows.mdx +31 -0
- package/site/content/docs/console/gates.mdx +35 -0
- package/site/content/docs/console/manifest-diff.mdx +34 -0
- package/site/content/docs/console/meta.json +23 -0
- package/site/content/docs/console/overview.mdx +40 -0
- package/site/content/docs/console/plugins.mdx +41 -0
- package/site/content/docs/console/privacy.mdx +32 -0
- package/site/content/docs/console/runs.mdx +40 -0
- package/site/content/docs/console/signals.mdx +31 -0
- package/site/content/docs/console/store.mdx +32 -0
- package/site/content/docs/console/tenancy.mdx +32 -0
- package/site/content/docs/console/traces.mdx +34 -0
- package/site/content/docs/console/vault.mdx +37 -0
- package/site/content/docs/elements/ai.mdx +180 -0
- package/site/content/docs/elements/channel.mdx +167 -0
- package/site/content/docs/elements/clock.mdx +182 -0
- package/site/content/docs/elements/flow.mdx +288 -0
- package/site/content/docs/elements/gate.mdx +171 -0
- package/site/content/docs/elements/meta.json +5 -0
- package/site/content/docs/elements/signal.mdx +171 -0
- package/site/content/docs/elements/store.mdx +320 -0
- package/site/content/docs/elements/vault.mdx +263 -0
- package/site/content/docs/get-started/basic-usage.mdx +124 -0
- package/site/content/docs/get-started/comparison.mdx +65 -0
- package/site/content/docs/get-started/installation.mdx +113 -0
- package/site/content/docs/get-started/introduction.mdx +123 -0
- package/site/content/docs/get-started/meta.json +5 -0
- package/site/content/docs/index.mdx +63 -0
- package/site/content/docs/meta.json +5 -0
- package/site/content/docs/plugins/compression.mdx +60 -0
- package/site/content/docs/plugins/cors.mdx +92 -0
- package/site/content/docs/plugins/csrf.mdx +96 -0
- package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
- package/site/content/docs/plugins/meta.json +15 -0
- package/site/content/docs/plugins/security-headers.mdx +136 -0
- package/site/content/docs/reference/cli.md +101 -0
- package/site/content/docs/reference/configuration.mdx +159 -0
- package/site/content/docs/reference/environment-variables.mdx +87 -0
- package/site/content/docs/reference/errors.mdx +80 -0
- package/site/content/docs/reference/fx.mdx +117 -0
- package/site/content/docs/reference/meta.json +5 -0
- package/site/content/docs/reference/plugins.mdx +249 -0
- package/site/content/docs/reference/security.md +63 -0
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +56 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +456 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +193 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev-schema-sync.test.ts +66 -0
- package/src/cli/dev-schema-sync.ts +139 -0
- package/src/cli/dev.test.ts +264 -15
- package/src/cli/dev.ts +355 -139
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +27 -8
- package/src/cli/docker.ts +11 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/drizzle-env.test.ts +67 -0
- package/src/cli/drizzle-env.ts +78 -0
- package/src/cli/ensure-drizzle-config.ts +50 -0
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +47 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +65 -0
- package/src/cli/openbao-bootstrap.test.ts +147 -0
- package/src/cli/openbao-bootstrap.ts +280 -0
- package/src/cli/openbao-restart.integration.test.ts +136 -0
- package/src/cli/ports.test.ts +7 -14
- package/src/cli/ports.ts +7 -5
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/resolve-dev-sql-env.test.ts +48 -0
- package/src/cli/resolve-dev-sql-env.ts +42 -0
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +8 -10
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/cli/vault-cmd.ts +63 -0
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +15 -30
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +136 -30
- package/src/compiler/extract.ts +485 -157
- package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +16 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +55 -34
- package/src/config/index.ts +177 -46
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +16 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +44 -66
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +215 -27
- package/src/docker/derive.ts +6 -14
- package/src/docker/docker.test.ts +118 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +9 -6
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +6 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/openbao.ts +47 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +11 -2
- package/src/docker/recipes/rustfs.ts +32 -0
- package/src/docker/stack-id.test.ts +73 -5
- package/src/docker/stack-id.ts +124 -33
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/stack.ts +36 -4
- package/src/docker/types.ts +16 -4
- package/src/docs-origin.ts +4 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/drizzle-dialect.test.ts +20 -0
- package/src/drivers/drizzle-dialect.ts +37 -0
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -57
- package/src/drivers/memory.ts +287 -75
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +15 -18
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-driver-removal.test.ts +55 -0
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.test.ts +97 -0
- package/src/drivers/vault-openbao.ts +103 -40
- package/src/drivers/vault-types.ts +3 -16
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +11 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/resource-list-docs.fixture.ts +56 -0
- package/src/elements/store/resource-list-docs.test.ts +79 -0
- package/src/elements/store/resource.test.ts +253 -0
- package/src/elements/store/resource.ts +786 -0
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.test.ts +132 -0
- package/src/elements/store/sql-condition.ts +293 -65
- package/src/elements/store/sql-session.test.ts +135 -0
- package/src/elements/store/sql-session.ts +241 -84
- package/src/elements/store/table.ts +69 -23
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +53 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +19 -33
- package/src/elements/vault.test.ts +12 -55
- package/src/elements/vault.ts +9 -13
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +92 -118
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.test.ts +60 -0
- package/src/kernel/boot-bind/channel.ts +61 -5
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +27 -18
- package/src/kernel/boot-bind/store.ts +93 -52
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -10
- package/src/kernel/boot.ts +30 -77
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/edge.test.ts +68 -0
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +13 -25
- package/src/kernel/fx.test.ts +31 -40
- package/src/kernel/fx.ts +135 -90
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +43 -10
- package/src/kernel/hooks.ts +25 -12
- package/src/kernel/index.ts +11 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +45 -9
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +81 -27
- package/src/kernel/registry-isolation.test.ts +74 -0
- package/src/kernel/registry.ts +102 -30
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +63 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/manifest/index.ts +3 -10
- package/src/manifest/types.ts +30 -6
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +5 -15
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/compression.test.ts +127 -0
- package/src/plugins/compression.ts +94 -0
- package/src/plugins/config-source.test.ts +204 -0
- package/src/plugins/config-source.ts +209 -0
- package/src/plugins/cors.test.ts +138 -0
- package/src/plugins/cors.ts +129 -0
- package/src/plugins/csrf.test.ts +102 -0
- package/src/plugins/csrf.ts +86 -0
- package/src/plugins/headers.ts +54 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/ip-allowlist.test.ts +105 -0
- package/src/plugins/ip-allowlist.ts +76 -0
- package/src/plugins/maintenance-mode.test.ts +91 -0
- package/src/plugins/maintenance-mode.ts +85 -0
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/security-headers.test.ts +243 -0
- package/src/plugins/security-headers.ts +255 -0
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +16 -45
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +27 -33
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/docs/spec/console.md +0 -739
- package/docs/spec/example.md +0 -1196
- package/docs/spec/four-applications.md +0 -1195
- package/docs/spec/unified-theory.md +0 -489
- package/src/cli/doc-drift.test.ts +0 -146
- package/src/cli/doc-drift.ts +0 -430
- package/src/cli/doctor-diff-examples.ts +0 -92
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
- package/src/drivers/vault-sops.ts +0 -271
package/src/drivers/s3.ts
CHANGED
|
@@ -4,24 +4,15 @@
|
|
|
4
4
|
* Protocol-named: AWS S3 · R2 · MinIO · SeaweedFS · Garage · Backblaze.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
FilesBucket,
|
|
9
|
-
FilesDriver,
|
|
10
|
-
FilesOpenOptions,
|
|
11
|
-
S3ClientLike,
|
|
12
|
-
} from "./types.ts";
|
|
7
|
+
import type { FilesBucket, FilesDriver, FilesOpenOptions, S3ClientLike } from "./types.ts";
|
|
13
8
|
|
|
14
9
|
/**
|
|
15
10
|
* Open a files bucket over the S3 protocol.
|
|
16
11
|
*
|
|
17
12
|
* @param options - Bucket name / injected client
|
|
18
13
|
*/
|
|
19
|
-
export async function openS3Bucket(
|
|
20
|
-
|
|
21
|
-
): Promise<FilesBucket> {
|
|
22
|
-
const client: S3ClientLike =
|
|
23
|
-
options.client ??
|
|
24
|
-
createBunS3Client(options.root ?? options.name);
|
|
14
|
+
export async function openS3Bucket(options: FilesOpenOptions): Promise<FilesBucket> {
|
|
15
|
+
const client: S3ClientLike = options.client ?? createBunS3Client(options.root ?? options.name);
|
|
25
16
|
|
|
26
17
|
const prefix = "";
|
|
27
18
|
|
|
@@ -55,7 +46,16 @@ export async function openS3Bucket(
|
|
|
55
46
|
}
|
|
56
47
|
|
|
57
48
|
function createBunS3Client(bucket: string): S3ClientLike {
|
|
58
|
-
const s3 = new Bun.S3Client({
|
|
49
|
+
const s3 = new Bun.S3Client({
|
|
50
|
+
bucket,
|
|
51
|
+
...(process.env.S3_ENDPOINT ? { endpoint: process.env.S3_ENDPOINT } : {}),
|
|
52
|
+
...(process.env.S3_ACCESS_KEY_ID ? { accessKeyId: process.env.S3_ACCESS_KEY_ID } : {}),
|
|
53
|
+
...(process.env.S3_SECRET_ACCESS_KEY
|
|
54
|
+
? { secretAccessKey: process.env.S3_SECRET_ACCESS_KEY }
|
|
55
|
+
: {}),
|
|
56
|
+
...(process.env.S3_REGION ? { region: process.env.S3_REGION } : {}),
|
|
57
|
+
...(process.env.S3_SESSION_TOKEN ? { sessionToken: process.env.S3_SESSION_TOKEN } : {}),
|
|
58
|
+
});
|
|
59
59
|
return {
|
|
60
60
|
file(key: string) {
|
|
61
61
|
const f = s3.file(key);
|
|
@@ -89,8 +89,7 @@ export function createS3FakeClient(): S3ClientLike & {
|
|
|
89
89
|
file(key: string) {
|
|
90
90
|
return {
|
|
91
91
|
async write(data) {
|
|
92
|
-
const bytes =
|
|
93
|
-
typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
92
|
+
const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
94
93
|
objects.set(key, bytes);
|
|
95
94
|
return bytes.byteLength;
|
|
96
95
|
},
|
|
@@ -113,9 +112,7 @@ export function createS3FakeClient(): S3ClientLike & {
|
|
|
113
112
|
async list(options) {
|
|
114
113
|
const prefix = options?.prefix ?? "";
|
|
115
114
|
return {
|
|
116
|
-
contents: [...objects.keys()]
|
|
117
|
-
.filter((k) => k.startsWith(prefix))
|
|
118
|
-
.map((key) => ({ key })),
|
|
115
|
+
contents: [...objects.keys()].filter((k) => k.startsWith(prefix)).map((key) => ({ key })),
|
|
119
116
|
};
|
|
120
117
|
},
|
|
121
118
|
};
|
|
@@ -10,11 +10,7 @@ import { dirname } from "node:path";
|
|
|
10
10
|
|
|
11
11
|
import type { SignalDecl } from "../elements/signal/declare.ts";
|
|
12
12
|
import type { SignalDelivery } from "../manifest/types.ts";
|
|
13
|
-
import {
|
|
14
|
-
DryRunWriteIsolationError,
|
|
15
|
-
setDryRunMessageId,
|
|
16
|
-
withDryRun,
|
|
17
|
-
} from "../kernel/dry-run.ts";
|
|
13
|
+
import { DryRunWriteIsolationError, setDryRunMessageId, withDryRun } from "../kernel/dry-run.ts";
|
|
18
14
|
import type {
|
|
19
15
|
DeadLetter,
|
|
20
16
|
LiveHandler,
|
|
@@ -112,10 +108,7 @@ export async function createSignalEngine(
|
|
|
112
108
|
while (list.length > 50) list.shift();
|
|
113
109
|
}
|
|
114
110
|
|
|
115
|
-
function failureFromError(
|
|
116
|
-
err: unknown,
|
|
117
|
-
attempt: number,
|
|
118
|
-
): SignalFailureReason {
|
|
111
|
+
function failureFromError(err: unknown, attempt: number): SignalFailureReason {
|
|
119
112
|
const code =
|
|
120
113
|
err &&
|
|
121
114
|
typeof err === "object" &&
|
|
@@ -196,11 +189,7 @@ export async function createSignalEngine(
|
|
|
196
189
|
return decl;
|
|
197
190
|
}
|
|
198
191
|
|
|
199
|
-
function stageEmit(
|
|
200
|
-
stagedMessages: MutMessage[],
|
|
201
|
-
name: string,
|
|
202
|
-
payload: unknown,
|
|
203
|
-
): void {
|
|
192
|
+
function stageEmit(stagedMessages: MutMessage[], name: string, payload: unknown): void {
|
|
204
193
|
const decl = requireDecl(name);
|
|
205
194
|
const t = now();
|
|
206
195
|
stagedMessages.push({
|
|
@@ -271,10 +260,7 @@ export async function createSignalEngine(
|
|
|
271
260
|
};
|
|
272
261
|
}
|
|
273
262
|
|
|
274
|
-
async function live(
|
|
275
|
-
signal: string,
|
|
276
|
-
handler: LiveHandler,
|
|
277
|
-
): Promise<SignalUnsubscribe> {
|
|
263
|
+
async function live(signal: string, handler: LiveHandler): Promise<SignalUnsubscribe> {
|
|
278
264
|
const decl = requireDecl(signal);
|
|
279
265
|
if (decl.delivery !== "live") {
|
|
280
266
|
throw new Error(`signal "${signal}" is not delivery: "live"`);
|
|
@@ -313,10 +299,7 @@ export async function createSignalEngine(
|
|
|
313
299
|
/**
|
|
314
300
|
* Claim the next `once` message with SKIP LOCKED semantics.
|
|
315
301
|
*/
|
|
316
|
-
function claimOnce(
|
|
317
|
-
signal: string,
|
|
318
|
-
consumerId: string,
|
|
319
|
-
): MutMessage | null {
|
|
302
|
+
function claimOnce(signal: string, consumerId: string): MutMessage | null {
|
|
320
303
|
const t = now();
|
|
321
304
|
for (const m of messages) {
|
|
322
305
|
if (m.signal !== signal || m.delivery !== "once") continue;
|
|
@@ -391,10 +374,7 @@ export async function createSignalEngine(
|
|
|
391
374
|
subscriberErrors.set(key, (subscriberErrors.get(key) ?? 0) + 1);
|
|
392
375
|
}
|
|
393
376
|
}
|
|
394
|
-
if (
|
|
395
|
-
subs.length > 0 &&
|
|
396
|
-
subs.every((s) => m.deliveredTo.has(s.subscriberId))
|
|
397
|
-
) {
|
|
377
|
+
if (subs.length > 0 && subs.every((s) => m.deliveredTo.has(s.subscriberId))) {
|
|
398
378
|
m.status = "delivered";
|
|
399
379
|
}
|
|
400
380
|
}
|
|
@@ -498,21 +478,14 @@ export async function createSignalEngine(
|
|
|
498
478
|
return out;
|
|
499
479
|
}
|
|
500
480
|
|
|
501
|
-
async function replay(
|
|
502
|
-
options: SignalReplayOptions,
|
|
503
|
-
): Promise<SignalReplayResult> {
|
|
481
|
+
async function replay(options: SignalReplayOptions): Promise<SignalReplayResult> {
|
|
504
482
|
requireDecl(options.signal);
|
|
505
483
|
const rate = Math.max(1, options.ratePerSec);
|
|
506
484
|
const intervalMs = Math.floor(1_000 / rate);
|
|
507
485
|
const ids =
|
|
508
|
-
options.messageIds && options.messageIds.length > 0
|
|
509
|
-
? new Set(options.messageIds)
|
|
510
|
-
: null;
|
|
486
|
+
options.messageIds && options.messageIds.length > 0 ? new Set(options.messageIds) : null;
|
|
511
487
|
const targets = messages.filter(
|
|
512
|
-
(m) =>
|
|
513
|
-
m.signal === options.signal &&
|
|
514
|
-
m.status === "dead" &&
|
|
515
|
-
(ids === null || ids.has(m.id)),
|
|
488
|
+
(m) => m.signal === options.signal && m.status === "dead" && (ids === null || ids.has(m.id)),
|
|
516
489
|
);
|
|
517
490
|
const results: SignalReplayResult["results"][number][] = [];
|
|
518
491
|
const wouldHaveFired: SignalReplayResult["wouldHaveFired"][number][] = [];
|
|
@@ -525,11 +498,7 @@ export async function createSignalEngine(
|
|
|
525
498
|
}
|
|
526
499
|
const m = targets[i]!;
|
|
527
500
|
// Never mutate stored payload during dry-run — override is view-only.
|
|
528
|
-
if (
|
|
529
|
-
!options.dryRun &&
|
|
530
|
-
options.payloads &&
|
|
531
|
-
options.payloads[m.id] !== undefined
|
|
532
|
-
) {
|
|
501
|
+
if (!options.dryRun && options.payloads && options.payloads[m.id] !== undefined) {
|
|
533
502
|
m.payload = options.payloads[m.id];
|
|
534
503
|
}
|
|
535
504
|
|
|
@@ -630,18 +599,12 @@ export async function createSignalEngine(
|
|
|
630
599
|
};
|
|
631
600
|
}
|
|
632
601
|
|
|
633
|
-
async function discard(
|
|
634
|
-
options: SignalDiscardOptions,
|
|
635
|
-
): Promise<{ readonly discarded: number }> {
|
|
602
|
+
async function discard(options: SignalDiscardOptions): Promise<{ readonly discarded: number }> {
|
|
636
603
|
const ids = new Set(options.messageIds);
|
|
637
604
|
let discarded = 0;
|
|
638
605
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
639
606
|
const m = messages[i]!;
|
|
640
|
-
if (
|
|
641
|
-
m.signal === options.signal &&
|
|
642
|
-
m.status === "dead" &&
|
|
643
|
-
ids.has(m.id)
|
|
644
|
-
) {
|
|
607
|
+
if (m.signal === options.signal && m.status === "dead" && ids.has(m.id)) {
|
|
645
608
|
messages.splice(i, 1);
|
|
646
609
|
discarded += 1;
|
|
647
610
|
}
|
|
@@ -3,20 +3,14 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { createSignalEngine } from "./signal-engine.ts";
|
|
6
|
-
import type {
|
|
7
|
-
SignalBus,
|
|
8
|
-
SignalDriver,
|
|
9
|
-
SignalOpenOptions,
|
|
10
|
-
} from "./signal-types.ts";
|
|
6
|
+
import type { SignalBus, SignalDriver, SignalOpenOptions } from "./signal-types.ts";
|
|
11
7
|
|
|
12
8
|
/**
|
|
13
9
|
* Open an in-memory signal bus.
|
|
14
10
|
*
|
|
15
11
|
* @param options - Declarations / durable path / clock
|
|
16
12
|
*/
|
|
17
|
-
export async function openMemorySignal(
|
|
18
|
-
options: SignalOpenOptions,
|
|
19
|
-
): Promise<SignalBus> {
|
|
13
|
+
export async function openMemorySignal(options: SignalOpenOptions): Promise<SignalBus> {
|
|
20
14
|
return createSignalEngine("memory", options);
|
|
21
15
|
}
|
|
22
16
|
|
|
@@ -31,12 +31,10 @@ export function createSignalNatsFake(): SignalNatsClientLike & {
|
|
|
31
31
|
return {
|
|
32
32
|
published,
|
|
33
33
|
async publish(subject, data) {
|
|
34
|
-
const text =
|
|
35
|
-
typeof data === "string" ? data : new TextDecoder().decode(data);
|
|
34
|
+
const text = typeof data === "string" ? data : new TextDecoder().decode(data);
|
|
36
35
|
published.push({ subject, data: text });
|
|
37
36
|
const list = subs.get(subject) ?? [];
|
|
38
|
-
const bytes =
|
|
39
|
-
typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
37
|
+
const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
40
38
|
|
|
41
39
|
const queued = list.filter((s) => s.queue);
|
|
42
40
|
const plain = list.filter((s) => !s.queue);
|
|
@@ -70,9 +68,7 @@ export function createSignalNatsFake(): SignalNatsClientLike & {
|
|
|
70
68
|
*
|
|
71
69
|
* @param options - Declarations / nats client / durable outbox path
|
|
72
70
|
*/
|
|
73
|
-
export async function openNatsSignal(
|
|
74
|
-
options: SignalOpenOptions,
|
|
75
|
-
): Promise<SignalBus> {
|
|
71
|
+
export async function openNatsSignal(options: SignalOpenOptions): Promise<SignalBus> {
|
|
76
72
|
const nats = options.nats ?? createSignalNatsFake();
|
|
77
73
|
const outbox = await createSignalEngine("nats", options);
|
|
78
74
|
|
|
@@ -111,8 +107,7 @@ export async function openNatsSignal(
|
|
|
111
107
|
rollback: () => tx.rollback(),
|
|
112
108
|
};
|
|
113
109
|
},
|
|
114
|
-
subscribe: (signal, subscriberId, handler) =>
|
|
115
|
-
outbox.subscribe(signal, subscriberId, handler),
|
|
110
|
+
subscribe: (signal, subscriberId, handler) => outbox.subscribe(signal, subscriberId, handler),
|
|
116
111
|
live: (signal, handler) => outbox.live(signal, handler),
|
|
117
112
|
drain: () => outbox.drain(),
|
|
118
113
|
deadLetters: (s) => outbox.deadLetters(s),
|
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import type { SignalDecl } from "../elements/signal/declare.ts";
|
|
9
9
|
import type { SignalDelivery } from "../manifest/types.ts";
|
|
10
|
-
import {
|
|
11
|
-
DryRunWriteIsolationError,
|
|
12
|
-
setDryRunMessageId,
|
|
13
|
-
withDryRun,
|
|
14
|
-
} from "../kernel/dry-run.ts";
|
|
10
|
+
import { DryRunWriteIsolationError, setDryRunMessageId, withDryRun } from "../kernel/dry-run.ts";
|
|
15
11
|
import type {
|
|
16
12
|
DeadLetter,
|
|
17
13
|
LiveHandler,
|
|
@@ -141,7 +137,10 @@ export function createPostgresSignalFake(options?: {
|
|
|
141
137
|
};
|
|
142
138
|
}
|
|
143
139
|
|
|
144
|
-
const api: PostgresSignalSql & {
|
|
140
|
+
const api: PostgresSignalSql & {
|
|
141
|
+
killActiveTransaction(): void;
|
|
142
|
+
_ensureReady: () => Promise<void>;
|
|
143
|
+
} = {
|
|
145
144
|
_ensureReady: ensureReady,
|
|
146
145
|
killActiveTransaction() {
|
|
147
146
|
active = null;
|
|
@@ -180,9 +179,7 @@ export function createPostgresSignalFake(options?: {
|
|
|
180
179
|
);
|
|
181
180
|
if (selMsg) {
|
|
182
181
|
return state.messages
|
|
183
|
-
.filter(
|
|
184
|
-
(m) => m.signal === params[0] && m.status === params[1],
|
|
185
|
-
)
|
|
182
|
+
.filter((m) => m.signal === params[0] && m.status === params[1])
|
|
186
183
|
.map((m) => ({ ...m }));
|
|
187
184
|
}
|
|
188
185
|
|
|
@@ -197,33 +194,24 @@ export function createPostgresSignalFake(options?: {
|
|
|
197
194
|
}
|
|
198
195
|
|
|
199
196
|
const selAll =
|
|
200
|
-
/^SELECT\s+\*\s+FROM\s+oke_signal_messages\s+WHERE\s+signal\s*=\s*\?\s*$/i.exec(
|
|
201
|
-
text,
|
|
202
|
-
);
|
|
197
|
+
/^SELECT\s+\*\s+FROM\s+oke_signal_messages\s+WHERE\s+signal\s*=\s*\?\s*$/i.exec(text);
|
|
203
198
|
if (selAll) {
|
|
204
|
-
return state.messages
|
|
205
|
-
.filter((m) => m.signal === params[0])
|
|
206
|
-
.map((m) => ({ ...m }));
|
|
199
|
+
return state.messages.filter((m) => m.signal === params[0]).map((m) => ({ ...m }));
|
|
207
200
|
}
|
|
208
201
|
|
|
209
202
|
const selWrite =
|
|
210
|
-
/^SELECT\s+value\s+FROM\s+oke_signal_writes\s+WHERE\s+key\s*=\s*\?\s*$/i.exec(
|
|
211
|
-
text,
|
|
212
|
-
);
|
|
203
|
+
/^SELECT\s+value\s+FROM\s+oke_signal_writes\s+WHERE\s+key\s*=\s*\?\s*$/i.exec(text);
|
|
213
204
|
if (selWrite) {
|
|
214
205
|
const v = state.writes.get(String(params[0]));
|
|
215
206
|
if (v === undefined) return [];
|
|
216
207
|
return [{ value: JSON.stringify(v) }];
|
|
217
208
|
}
|
|
218
209
|
|
|
219
|
-
const byId =
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
);
|
|
210
|
+
const byId = /^SELECT\s+\*\s+FROM\s+oke_signal_messages\s+WHERE\s+id\s*=\s*\?\s*$/i.exec(
|
|
211
|
+
text,
|
|
212
|
+
);
|
|
223
213
|
if (byId) {
|
|
224
|
-
return state.messages
|
|
225
|
-
.filter((m) => m.id === params[0])
|
|
226
|
-
.map((m) => ({ ...m }));
|
|
214
|
+
return state.messages.filter((m) => m.id === params[0]).map((m) => ({ ...m }));
|
|
227
215
|
}
|
|
228
216
|
|
|
229
217
|
const selLive =
|
|
@@ -253,11 +241,7 @@ export function createPostgresSignalFake(options?: {
|
|
|
253
241
|
let changes = 0;
|
|
254
242
|
for (let i = state.messages.length - 1; i >= 0; i--) {
|
|
255
243
|
const m = state.messages[i]!;
|
|
256
|
-
if (
|
|
257
|
-
m.id === params[0] &&
|
|
258
|
-
m.signal === params[1] &&
|
|
259
|
-
m.status === "dead"
|
|
260
|
-
) {
|
|
244
|
+
if (m.id === params[0] && m.signal === params[1] && m.status === "dead") {
|
|
261
245
|
state.messages.splice(i, 1);
|
|
262
246
|
changes += 1;
|
|
263
247
|
}
|
|
@@ -266,9 +250,7 @@ export function createPostgresSignalFake(options?: {
|
|
|
266
250
|
}
|
|
267
251
|
|
|
268
252
|
const insertMsg =
|
|
269
|
-
/^INSERT\s+INTO\s+oke_signal_messages\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\)\s*$/i.exec(
|
|
270
|
-
text,
|
|
271
|
-
);
|
|
253
|
+
/^INSERT\s+INTO\s+oke_signal_messages\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\)\s*$/i.exec(text);
|
|
272
254
|
if (insertMsg) {
|
|
273
255
|
const cols = insertMsg[1]!.split(",").map((c) => c.trim());
|
|
274
256
|
const row: Record<string, unknown> = {};
|
|
@@ -300,10 +282,9 @@ export function createPostgresSignalFake(options?: {
|
|
|
300
282
|
return { changes: 1 };
|
|
301
283
|
}
|
|
302
284
|
|
|
303
|
-
const upd =
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
);
|
|
285
|
+
const upd = /^UPDATE\s+oke_signal_messages\s+SET\s+(.+)\s+WHERE\s+id\s*=\s*\?\s*$/i.exec(
|
|
286
|
+
text,
|
|
287
|
+
);
|
|
307
288
|
if (upd) {
|
|
308
289
|
const id = String(params[params.length - 1]);
|
|
309
290
|
const row = state.messages.find((m) => m.id === id);
|
|
@@ -414,9 +395,7 @@ function rowToMessage(row: Record<string, unknown>): SignalMessage {
|
|
|
414
395
|
*
|
|
415
396
|
* @param options - Declarations / sql fake / clock
|
|
416
397
|
*/
|
|
417
|
-
export async function openPostgresSignal(
|
|
418
|
-
options: SignalOpenOptions,
|
|
419
|
-
): Promise<SignalBus> {
|
|
398
|
+
export async function openPostgresSignal(options: SignalOpenOptions): Promise<SignalBus> {
|
|
420
399
|
const now = options.now ?? (() => Date.now());
|
|
421
400
|
const signals = options.signals;
|
|
422
401
|
const sql =
|
|
@@ -443,10 +422,7 @@ export async function openPostgresSignal(
|
|
|
443
422
|
let unlisten: (() => void) | null = null;
|
|
444
423
|
let draining: Promise<void> | null = null;
|
|
445
424
|
|
|
446
|
-
function failureFromError(
|
|
447
|
-
err: unknown,
|
|
448
|
-
attempt: number,
|
|
449
|
-
): SignalFailureReason {
|
|
425
|
+
function failureFromError(err: unknown, attempt: number): SignalFailureReason {
|
|
450
426
|
const code =
|
|
451
427
|
err &&
|
|
452
428
|
typeof err === "object" &&
|
|
@@ -539,10 +515,10 @@ export async function openPostgresSignal(
|
|
|
539
515
|
finished = true;
|
|
540
516
|
await sql.begin(async (tx) => {
|
|
541
517
|
for (const [k, v] of stagedWrites) {
|
|
542
|
-
await tx.exec(
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
);
|
|
518
|
+
await tx.exec(`INSERT INTO oke_signal_writes (key, value) VALUES (?, ?)`, [
|
|
519
|
+
k,
|
|
520
|
+
JSON.stringify(v),
|
|
521
|
+
]);
|
|
546
522
|
}
|
|
547
523
|
for (const e of stagedEmits) {
|
|
548
524
|
await insertEmit(tx, e.signal, e.payload);
|
|
@@ -594,10 +570,7 @@ export async function openPostgresSignal(
|
|
|
594
570
|
};
|
|
595
571
|
}
|
|
596
572
|
|
|
597
|
-
async function live(
|
|
598
|
-
signal: string,
|
|
599
|
-
handler: LiveHandler,
|
|
600
|
-
): Promise<SignalUnsubscribe> {
|
|
573
|
+
async function live(signal: string, handler: LiveHandler): Promise<SignalUnsubscribe> {
|
|
601
574
|
const decl = requireDecl(signal);
|
|
602
575
|
if (decl.delivery !== "live") {
|
|
603
576
|
throw new Error(`signal "${signal}" is not delivery: "live"`);
|
|
@@ -628,10 +601,10 @@ export async function openPostgresSignal(
|
|
|
628
601
|
const msg = rowToMessage(row);
|
|
629
602
|
try {
|
|
630
603
|
await consumer.handler(msg);
|
|
631
|
-
await sql.exec(
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
);
|
|
604
|
+
await sql.exec(`UPDATE oke_signal_messages SET status = ?, locked_by = NULL WHERE id = ?`, [
|
|
605
|
+
"delivered",
|
|
606
|
+
msg.id,
|
|
607
|
+
]);
|
|
635
608
|
noteDelivered();
|
|
636
609
|
} catch (err) {
|
|
637
610
|
const failures = [...msg.failures, failureFromError(err, msg.attempts)];
|
|
@@ -689,38 +662,27 @@ export async function openPostgresSignal(
|
|
|
689
662
|
for (const consumer of consumers) {
|
|
690
663
|
const decl = signals.get(consumer.signal);
|
|
691
664
|
if (decl?.delivery !== "broadcast") continue;
|
|
692
|
-
const rows = await sql.query(
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
);
|
|
665
|
+
const rows = await sql.query(`SELECT * FROM oke_signal_messages WHERE signal = ?`, [
|
|
666
|
+
consumer.signal,
|
|
667
|
+
]);
|
|
696
668
|
for (const row of rows) {
|
|
697
669
|
if (row.status === "dead" || row.status === "delivered") continue;
|
|
698
670
|
if (row.delivery !== "broadcast") continue;
|
|
699
671
|
// Re-read delivered_to so concurrent drain (NOTIFY) cannot double-deliver.
|
|
700
|
-
const fresh = await sql.query(
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
);
|
|
672
|
+
const fresh = await sql.query(`SELECT * FROM oke_signal_messages WHERE signal = ?`, [
|
|
673
|
+
consumer.signal,
|
|
674
|
+
]);
|
|
704
675
|
const current = fresh.find((r) => r.id === row.id);
|
|
705
676
|
if (!current || current.status === "delivered") continue;
|
|
706
|
-
const deliveredTo = new Set(
|
|
707
|
-
JSON.parse(String(current.delivered_to ?? "[]")) as string[],
|
|
708
|
-
);
|
|
677
|
+
const deliveredTo = new Set(JSON.parse(String(current.delivered_to ?? "[]")) as string[]);
|
|
709
678
|
if (deliveredTo.has(consumer.subscriberId)) continue;
|
|
710
679
|
// Claim this subscriber slot before invoking the handler.
|
|
711
680
|
deliveredTo.add(consumer.subscriberId);
|
|
712
681
|
const subs = consumers.filter((c) => c.signal === consumer.signal);
|
|
713
|
-
const status = subs.every((s) => deliveredTo.has(s.subscriberId))
|
|
714
|
-
? "delivered"
|
|
715
|
-
: "pending";
|
|
682
|
+
const status = subs.every((s) => deliveredTo.has(s.subscriberId)) ? "delivered" : "pending";
|
|
716
683
|
await sql.exec(
|
|
717
684
|
`UPDATE oke_signal_messages SET delivered_to = ?, status = ?, attempts = ? WHERE id = ?`,
|
|
718
|
-
[
|
|
719
|
-
JSON.stringify([...deliveredTo]),
|
|
720
|
-
status,
|
|
721
|
-
Number(current.attempts) + 1,
|
|
722
|
-
row.id,
|
|
723
|
-
],
|
|
685
|
+
[JSON.stringify([...deliveredTo]), status, Number(current.attempts) + 1, row.id],
|
|
724
686
|
);
|
|
725
687
|
progress = true;
|
|
726
688
|
const msg = rowToMessage(current);
|
|
@@ -728,16 +690,13 @@ export async function openPostgresSignal(
|
|
|
728
690
|
await consumer.handler(msg);
|
|
729
691
|
noteDelivered();
|
|
730
692
|
} catch (err) {
|
|
731
|
-
const failures = [
|
|
732
|
-
...msg.failures,
|
|
733
|
-
failureFromError(err, Number(current.attempts) + 1),
|
|
734
|
-
];
|
|
693
|
+
const failures = [...msg.failures, failureFromError(err, Number(current.attempts) + 1)];
|
|
735
694
|
const key = `${consumer.signal}::${consumer.subscriberId}`;
|
|
736
695
|
subscriberErrors.set(key, (subscriberErrors.get(key) ?? 0) + 1);
|
|
737
|
-
await sql.exec(
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
);
|
|
696
|
+
await sql.exec(`UPDATE oke_signal_messages SET failures = ? WHERE id = ?`, [
|
|
697
|
+
JSON.stringify(failures),
|
|
698
|
+
row.id,
|
|
699
|
+
]);
|
|
741
700
|
}
|
|
742
701
|
}
|
|
743
702
|
}
|
|
@@ -805,10 +764,7 @@ export async function openPostgresSignal(
|
|
|
805
764
|
async function statsFor(name: string): Promise<SignalStats | null> {
|
|
806
765
|
const decl = signals.get(name);
|
|
807
766
|
if (!decl) return null;
|
|
808
|
-
const rows = await sql.query(
|
|
809
|
-
`SELECT * FROM oke_signal_messages WHERE signal = ?`,
|
|
810
|
-
[name],
|
|
811
|
-
);
|
|
767
|
+
const rows = await sql.query(`SELECT * FROM oke_signal_messages WHERE signal = ?`, [name]);
|
|
812
768
|
let pending = 0;
|
|
813
769
|
let inflight = 0;
|
|
814
770
|
let dead = 0;
|
|
@@ -843,9 +799,7 @@ export async function openPostgresSignal(
|
|
|
843
799
|
for (const row of rows) {
|
|
844
800
|
if (row.delivery !== "broadcast") continue;
|
|
845
801
|
if (row.status === "dead" || row.status === "delivered") continue;
|
|
846
|
-
const deliveredTo = new Set(
|
|
847
|
-
JSON.parse(String(row.delivered_to ?? "[]")) as string[],
|
|
848
|
-
);
|
|
802
|
+
const deliveredTo = new Set(JSON.parse(String(row.delivered_to ?? "[]")) as string[]);
|
|
849
803
|
if (!deliveredTo.has(c.subscriberId)) lag += 1;
|
|
850
804
|
}
|
|
851
805
|
return {
|
|
@@ -864,8 +818,7 @@ export async function openPostgresSignal(
|
|
|
864
818
|
delivered,
|
|
865
819
|
retries: decl.retries,
|
|
866
820
|
deadLetterEnabled: decl.deadLetter,
|
|
867
|
-
outboxLagMs:
|
|
868
|
-
oldestPending === null ? null : Math.max(0, now() - oldestPending),
|
|
821
|
+
outboxLagMs: oldestPending === null ? null : Math.max(0, now() - oldestPending),
|
|
869
822
|
subscribers,
|
|
870
823
|
connections: liveHandlers.get(name)?.size ?? 0,
|
|
871
824
|
throughputPerSec: throughputPerSec(),
|
|
@@ -888,17 +841,13 @@ export async function openPostgresSignal(
|
|
|
888
841
|
return out;
|
|
889
842
|
}
|
|
890
843
|
|
|
891
|
-
async function replay(
|
|
892
|
-
options: SignalReplayOptions,
|
|
893
|
-
): Promise<SignalReplayResult> {
|
|
844
|
+
async function replay(options: SignalReplayOptions): Promise<SignalReplayResult> {
|
|
894
845
|
requireDecl(options.signal);
|
|
895
846
|
const rate = Math.max(1, options.ratePerSec);
|
|
896
847
|
const intervalMs = Math.floor(1_000 / rate);
|
|
897
848
|
const dead = await deadLetters(options.signal);
|
|
898
849
|
const ids =
|
|
899
|
-
options.messageIds && options.messageIds.length > 0
|
|
900
|
-
? new Set(options.messageIds)
|
|
901
|
-
: null;
|
|
850
|
+
options.messageIds && options.messageIds.length > 0 ? new Set(options.messageIds) : null;
|
|
902
851
|
const targets = dead.filter((m) => ids === null || ids.has(m.id));
|
|
903
852
|
const results: SignalReplayResult["results"][number][] = [];
|
|
904
853
|
const wouldHaveFired: SignalReplayResult["wouldHaveFired"][number][] = [];
|
|
@@ -910,18 +859,12 @@ export async function openPostgresSignal(
|
|
|
910
859
|
await new Promise((r) => setTimeout(r, intervalMs));
|
|
911
860
|
}
|
|
912
861
|
const m = targets[i]!;
|
|
913
|
-
const payload =
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
!options.dryRun
|
|
920
|
-
) {
|
|
921
|
-
await sql.exec(
|
|
922
|
-
`UPDATE oke_signal_messages SET payload = ? WHERE id = ?`,
|
|
923
|
-
[JSON.stringify(payload), m.id],
|
|
924
|
-
);
|
|
862
|
+
const payload = options.payloads?.[m.id] !== undefined ? options.payloads[m.id] : m.payload;
|
|
863
|
+
if (options.payloads?.[m.id] !== undefined && !options.dryRun) {
|
|
864
|
+
await sql.exec(`UPDATE oke_signal_messages SET payload = ? WHERE id = ?`, [
|
|
865
|
+
JSON.stringify(payload),
|
|
866
|
+
m.id,
|
|
867
|
+
]);
|
|
925
868
|
}
|
|
926
869
|
|
|
927
870
|
const handlers = consumers.filter((c) => {
|
|
@@ -983,10 +926,10 @@ export async function openPostgresSignal(
|
|
|
983
926
|
lastErr = { code: reason.code, message: reason.message };
|
|
984
927
|
if (!options.dryRun) {
|
|
985
928
|
const failures = [...m.failures, reason];
|
|
986
|
-
await sql.exec(
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
);
|
|
929
|
+
await sql.exec(`UPDATE oke_signal_messages SET failures = ? WHERE id = ?`, [
|
|
930
|
+
JSON.stringify(failures),
|
|
931
|
+
m.id,
|
|
932
|
+
]);
|
|
990
933
|
}
|
|
991
934
|
}
|
|
992
935
|
}
|
|
@@ -997,14 +940,9 @@ export async function openPostgresSignal(
|
|
|
997
940
|
if (!options.dryRun) {
|
|
998
941
|
if (options.subscriberId && m.delivery === "broadcast") {
|
|
999
942
|
const row = (
|
|
1000
|
-
await sql.query(
|
|
1001
|
-
`SELECT * FROM oke_signal_messages WHERE id = ?`,
|
|
1002
|
-
[m.id],
|
|
1003
|
-
)
|
|
943
|
+
await sql.query(`SELECT * FROM oke_signal_messages WHERE id = ?`, [m.id])
|
|
1004
944
|
)[0];
|
|
1005
|
-
const deliveredTo = new Set(
|
|
1006
|
-
JSON.parse(String(row?.delivered_to ?? "[]")) as string[],
|
|
1007
|
-
);
|
|
945
|
+
const deliveredTo = new Set(JSON.parse(String(row?.delivered_to ?? "[]")) as string[]);
|
|
1008
946
|
deliveredTo.delete(options.subscriberId);
|
|
1009
947
|
await sql.exec(
|
|
1010
948
|
`UPDATE oke_signal_messages SET status = 'pending', locked_by = NULL, attempts = 0, available_at = ?, delivered_to = ? WHERE id = ?`,
|
|
@@ -1033,9 +971,7 @@ export async function openPostgresSignal(
|
|
|
1033
971
|
};
|
|
1034
972
|
}
|
|
1035
973
|
|
|
1036
|
-
async function discard(
|
|
1037
|
-
options: SignalDiscardOptions,
|
|
1038
|
-
): Promise<{ readonly discarded: number }> {
|
|
974
|
+
async function discard(options: SignalDiscardOptions): Promise<{ readonly discarded: number }> {
|
|
1039
975
|
let discarded = 0;
|
|
1040
976
|
for (const id of options.messageIds) {
|
|
1041
977
|
const result = await sql.exec(
|
|
@@ -1048,10 +984,7 @@ export async function openPostgresSignal(
|
|
|
1048
984
|
}
|
|
1049
985
|
|
|
1050
986
|
async function getWrite(key: string): Promise<unknown> {
|
|
1051
|
-
const rows = await sql.query(
|
|
1052
|
-
`SELECT value FROM oke_signal_writes WHERE key = ?`,
|
|
1053
|
-
[key],
|
|
1054
|
-
);
|
|
987
|
+
const rows = await sql.query(`SELECT value FROM oke_signal_writes WHERE key = ?`, [key]);
|
|
1055
988
|
if (!rows[0]) return undefined;
|
|
1056
989
|
return JSON.parse(String(rows[0].value));
|
|
1057
990
|
}
|