@pikku/core 0.12.107 → 0.12.112
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 +357 -0
- package/dist/analytics/analytics.d.ts +6 -0
- package/dist/analytics/analytics.js +58 -0
- package/dist/analytics/analytics.types.d.ts +156 -0
- package/dist/analytics/analytics.types.js +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
- package/dist/analytics/anonymous-analytics-identity.js +27 -0
- package/dist/analytics/compose-analytics-identity.d.ts +14 -0
- package/dist/analytics/compose-analytics-identity.js +33 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
- package/dist/analytics/cookie-analytics-identity.js +37 -0
- package/dist/analytics/define-analytics-events.d.ts +22 -0
- package/dist/analytics/define-analytics-events.js +9 -0
- package/dist/analytics/fan-out-analytics.d.ts +15 -0
- package/dist/analytics/fan-out-analytics.js +36 -0
- package/dist/analytics/index.d.ts +13 -0
- package/dist/analytics/index.js +8 -0
- package/dist/analytics/logger-analytics-service.d.ts +14 -0
- package/dist/analytics/logger-analytics-service.js +23 -0
- package/dist/analytics/mint-cookie.d.ts +44 -0
- package/dist/analytics/mint-cookie.js +55 -0
- package/dist/dev/hot-reload.d.ts +0 -1
- package/dist/dev/hot-reload.js +4 -25
- package/dist/dev/module-runner.js +104 -25
- package/dist/errors/errors.d.ts +7 -0
- package/dist/errors/errors.js +17 -0
- package/dist/function/function-meta.types.d.ts +2 -0
- package/dist/function/function-runner.js +29 -0
- package/dist/function/functions.types.d.ts +22 -3
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/pikku-state.d.ts +1 -1
- package/dist/scopes.d.ts +11 -0
- package/dist/scopes.js +17 -0
- package/dist/services/credential-wire-service.d.ts +1 -1
- package/dist/services/feature-flag-service.d.ts +100 -0
- package/dist/services/feature-flag-service.js +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/meta-service.d.ts +16 -0
- package/dist/services/meta-service.js +19 -0
- package/dist/services/webhook-service.d.ts +7 -2
- package/dist/services/webhook-service.js +11 -6
- package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
- package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
- package/dist/types/core.types.d.ts +23 -0
- package/dist/wirings/agent/agent-rpc.d.ts +1 -1
- package/dist/wirings/agent/agent-turn.d.ts +1 -1
- package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
- package/dist/wirings/channel/channel-common.d.ts +1 -1
- package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
- package/dist/wirings/channel/channel-runner.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
- package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
- package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
- package/dist/wirings/flag/assert-feature-available.js +23 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
- package/dist/wirings/flag/cached-flag-source.js +96 -0
- package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
- package/dist/wirings/flag/define-feature-flags.js +32 -0
- package/dist/wirings/flag/flag.types.d.ts +97 -0
- package/dist/wirings/flag/flag.types.js +1 -0
- package/dist/wirings/flag/index.d.ts +7 -0
- package/dist/wirings/flag/index.js +5 -0
- package/dist/wirings/flag/resolve-flag.d.ts +52 -0
- package/dist/wirings/flag/resolve-flag.js +90 -0
- package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
- package/dist/wirings/flag/validate-flag-definitions.js +103 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
- package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +50 -0
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +38 -0
- package/knowledge/decisions/internals/index.md +2 -0
- package/package.json +11 -5
- package/run-tests.sh +17 -9
- package/src/public-surface.json +26 -0
- package/src/agent-naming.test.ts +0 -68
- package/src/api-report.test.ts +0 -138
- package/src/app-alias-surface.test.ts +0 -179
- package/src/app-leaf-surface.test.ts +0 -222
- package/src/bootstrap-compat/root.ts +0 -20
- package/src/classification/column-form.test.ts +0 -97
- package/src/classification/column-form.ts +0 -55
- package/src/classification/data-classification.ts +0 -73
- package/src/classification/index.ts +0 -40
- package/src/classification/key-ids.ts +0 -2
- package/src/classification/secret-value.test.ts +0 -204
- package/src/classification/secret-value.ts +0 -106
- package/src/crypto-utils.test.ts +0 -668
- package/src/crypto-utils.ts +0 -460
- package/src/dev/hot-reload.test.ts +0 -587
- package/src/dev/hot-reload.ts +0 -225
- package/src/dev/module-runner.test.ts +0 -235
- package/src/dev/module-runner.ts +0 -138
- package/src/dev/reload-meta.test.ts +0 -183
- package/src/dev/reload-meta.ts +0 -144
- package/src/ecosystem-tier-removed.test.ts +0 -72
- package/src/env.ts +0 -1
- package/src/errors/error-handler.ts +0 -77
- package/src/errors/error.test.ts +0 -229
- package/src/errors/errors.ts +0 -393
- package/src/errors/index.ts +0 -11
- package/src/errors/serialized-error.ts +0 -12
- package/src/factory-functions.test.ts +0 -111
- package/src/function/abort-scope.test.ts +0 -97
- package/src/function/abort-scope.ts +0 -80
- package/src/function/function-meta.types.ts +0 -151
- package/src/function/function-runner.test.ts +0 -1619
- package/src/function/function-runner.ts +0 -499
- package/src/function/functions.types.ts +0 -319
- package/src/function/index.ts +0 -40
- package/src/function/list.types.test.ts +0 -100
- package/src/function/list.types.ts +0 -69
- package/src/function/pikku-request.test.ts +0 -35
- package/src/function/pikku-request.ts +0 -17
- package/src/gopass-secrets-removed.test.ts +0 -51
- package/src/handle-error.test.ts +0 -532
- package/src/handle-error.ts +0 -64
- package/src/middleware/auth-apikey.test.ts +0 -362
- package/src/middleware/auth-apikey.ts +0 -39
- package/src/middleware/auth-bearer.test.ts +0 -566
- package/src/middleware/auth-bearer.ts +0 -83
- package/src/middleware/auth-cookie.test.ts +0 -572
- package/src/middleware/auth-cookie.ts +0 -107
- package/src/middleware/cors.test.ts +0 -579
- package/src/middleware/cors.ts +0 -103
- package/src/middleware/index.ts +0 -30
- package/src/middleware/middleware-factories.ts +0 -76
- package/src/middleware/middleware.types.ts +0 -61
- package/src/middleware/remote-auth.test.ts +0 -547
- package/src/middleware/remote-auth.ts +0 -95
- package/src/middleware/remote-jobs-secret.ts +0 -35
- package/src/middleware/require-origin.test.ts +0 -115
- package/src/middleware/require-origin.ts +0 -79
- package/src/middleware/telemetry.ts +0 -83
- package/src/middleware-runner.test.ts +0 -578
- package/src/middleware-runner.ts +0 -232
- package/src/no-any-casts.test.ts +0 -57
- package/src/no-root-barrel.test.ts +0 -122
- package/src/permissions.test.ts +0 -256
- package/src/permissions.ts +0 -217
- package/src/pikku-state.test.ts +0 -198
- package/src/pikku-state.ts +0 -206
- package/src/production-barrels-stay-lean.test.ts +0 -110
- package/src/public-surface.test.ts +0 -133
- package/src/remote.test.ts +0 -173
- package/src/remote.ts +0 -56
- package/src/removed-legacy-exports.test.ts +0 -66
- package/src/run-tests-script.test.ts +0 -67
- package/src/schema.test.ts +0 -430
- package/src/schema.ts +0 -204
- package/src/scopes.test.ts +0 -203
- package/src/scopes.ts +0 -67
- package/src/services/agent-run-state-service.ts +0 -37
- package/src/services/agent-runner-service.ts +0 -238
- package/src/services/agent-storage-service.ts +0 -39
- package/src/services/ai-embedding-service.ts +0 -9
- package/src/services/audit-service.test.ts +0 -44
- package/src/services/audit-service.ts +0 -280
- package/src/services/content-service.ts +0 -65
- package/src/services/credential-service.ts +0 -20
- package/src/services/credential-wire-service.test.ts +0 -235
- package/src/services/credential-wire-service.ts +0 -120
- package/src/services/deployment-service.ts +0 -32
- package/src/services/email-service.test.ts +0 -100
- package/src/services/email-service.ts +0 -60
- package/src/services/email-template.test.ts +0 -311
- package/src/services/email-template.ts +0 -254
- package/src/services/file-scenario-run-store.test.ts +0 -349
- package/src/services/file-scenario-run-store.ts +0 -282
- package/src/services/gateway-service.ts +0 -5
- package/src/services/http-personas-converse.test.ts +0 -274
- package/src/services/http-personas.test.ts +0 -379
- package/src/services/http-personas.ts +0 -508
- package/src/services/in-memory-agent-run-state-service.ts +0 -87
- package/src/services/in-memory-queue-service.test.ts +0 -162
- package/src/services/in-memory-queue-service.ts +0 -78
- package/src/services/in-memory-session-store.test.ts +0 -58
- package/src/services/in-memory-session-store.ts +0 -20
- package/src/services/in-memory-trigger-service.ts +0 -47
- package/src/services/in-memory-workflow-service.test.ts +0 -430
- package/src/services/in-memory-workflow-service.ts +0 -595
- package/src/services/index.ts +0 -192
- package/src/services/istanbul-coverage-service.test.ts +0 -66
- package/src/services/istanbul-coverage-service.ts +0 -59
- package/src/services/jwt-service.ts +0 -15
- package/src/services/local-content-request-handler.test.ts +0 -240
- package/src/services/local-content-request-handler.ts +0 -295
- package/src/services/local-content.test.ts +0 -186
- package/src/services/local-content.ts +0 -242
- package/src/services/local-credential-service.ts +0 -63
- package/src/services/local-email-service.test.ts +0 -182
- package/src/services/local-email-service.ts +0 -43
- package/src/services/local-gateway-service.ts +0 -51
- package/src/services/local-secrets.test.ts +0 -95
- package/src/services/local-secrets.ts +0 -71
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -45
- package/src/services/logger-console.test.ts +0 -117
- package/src/services/logger-console.ts +0 -174
- package/src/services/logger.ts +0 -48
- package/src/services/meta-service.test.ts +0 -75
- package/src/services/meta-service.ts +0 -767
- package/src/services/persona-actor-secret.test.ts +0 -68
- package/src/services/persona-actor-secret.ts +0 -70
- package/src/services/persona-sign-in.test.ts +0 -219
- package/src/services/persona-sign-in.ts +0 -238
- package/src/services/personas-service.ts +0 -191
- package/src/services/pikku-user-id.test.ts +0 -62
- package/src/services/pikku-user-id.ts +0 -13
- package/src/services/queue-webhook-service.test.ts +0 -409
- package/src/services/queue-webhook-service.ts +0 -150
- package/src/services/remote-jobs.test.ts +0 -106
- package/src/services/remote-jobs.ts +0 -92
- package/src/services/scheduler-service.ts +0 -37
- package/src/services/schema-service.ts +0 -10
- package/src/services/scope-service.ts +0 -91
- package/src/services/scoped-credential-service.test.ts +0 -86
- package/src/services/scoped-credential-service.ts +0 -63
- package/src/services/scoped-secret-service.test.ts +0 -93
- package/src/services/scoped-secret-service.ts +0 -40
- package/src/services/secret-host-binding.test.ts +0 -138
- package/src/services/secret-host-binding.ts +0 -51
- package/src/services/secret-service.ts +0 -25
- package/src/services/secretless.test.ts +0 -54
- package/src/services/secretless.ts +0 -29
- package/src/services/session-store.ts +0 -9
- package/src/services/stub-tracker.test.ts +0 -104
- package/src/services/stub-tracker.ts +0 -175
- package/src/services/system-role-guard.test.ts +0 -96
- package/src/services/system-role-guard.ts +0 -71
- package/src/services/temporary-file-service.ts +0 -76
- package/src/services/trigger-service.ts +0 -5
- package/src/services/typed-credential-service.ts +0 -83
- package/src/services/typed-secret-service.test.ts +0 -204
- package/src/services/typed-secret-service.ts +0 -132
- package/src/services/typed-variables-service.test.ts +0 -166
- package/src/services/typed-variables-service.ts +0 -166
- package/src/services/user-session-service.test.ts +0 -147
- package/src/services/user-session-service.ts +0 -85
- package/src/services/v8-coverage-service.test.ts +0 -69
- package/src/services/v8-coverage-service.ts +0 -163
- package/src/services/variables-service.ts +0 -13
- package/src/services/webhook-service.ts +0 -147
- package/src/services/workflow-service.ts +0 -120
- package/src/side-effects-are-declared.test.ts +0 -84
- package/src/source-files-stay-composable.test.ts +0 -41
- package/src/template-alias-surface.test.ts +0 -240
- package/src/test-utils.ts +0 -38
- package/src/testing/index.ts +0 -3
- package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
- package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
- package/src/testing/service-tests/channel-store-tests.ts +0 -98
- package/src/testing/service-tests/credential-service-tests.ts +0 -143
- package/src/testing/service-tests/deployment-service-tests.ts +0 -33
- package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
- package/src/testing/service-tests/secret-service-tests.ts +0 -105
- package/src/testing/service-tests/session-store-tests.ts +0 -62
- package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
- package/src/testing/service-tests/workflow-service-tests.ts +0 -308
- package/src/testing/service-tests.ts +0 -95
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -89
- package/src/types/core.types.ts +0 -446
- package/src/types/index.ts +0 -25
- package/src/types/state.types.ts +0 -226
- package/src/types/typed-credentials.test.ts +0 -72
- package/src/utils/hash.test.ts +0 -68
- package/src/utils/hash.ts +0 -26
- package/src/utils/hmac.ts +0 -21
- package/src/utils/node-host-resolver.ts +0 -20
- package/src/utils/safe-fetch.test.ts +0 -515
- package/src/utils/safe-fetch.ts +0 -347
- package/src/utils.test.ts +0 -359
- package/src/utils.ts +0 -165
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
- package/src/wirings/actor-flow/index.ts +0 -10
- package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
- package/src/wirings/actor-flow/run-conversation.ts +0 -280
- package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
- package/src/wirings/addon/addon-runner.ts +0 -236
- package/src/wirings/addon/addon-scopes.test.ts +0 -225
- package/src/wirings/addon/addon-secrets.test.ts +0 -391
- package/src/wirings/addon/index.ts +0 -12
- package/src/wirings/addon/remote-addon-auth.ts +0 -65
- package/src/wirings/addon/wire-addon.test.ts +0 -102
- package/src/wirings/addon/wire-addon.ts +0 -202
- package/src/wirings/addon/wire-remote-addon.ts +0 -41
- package/src/wirings/agent/agent-agui.test.ts +0 -1213
- package/src/wirings/agent/agent-agui.ts +0 -405
- package/src/wirings/agent/agent-authorization.test.ts +0 -208
- package/src/wirings/agent/agent-finalize.test.ts +0 -187
- package/src/wirings/agent/agent-finalize.ts +0 -197
- package/src/wirings/agent/agent-helpers.test.ts +0 -215
- package/src/wirings/agent/agent-helpers.ts +0 -96
- package/src/wirings/agent/agent-interrupt.test.ts +0 -833
- package/src/wirings/agent/agent-interrupt.ts +0 -400
- package/src/wirings/agent/agent-memory.test.ts +0 -397
- package/src/wirings/agent/agent-memory.ts +0 -496
- package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
- package/src/wirings/agent/agent-model-config.test.ts +0 -103
- package/src/wirings/agent/agent-model-config.ts +0 -59
- package/src/wirings/agent/agent-prepare.test.ts +0 -977
- package/src/wirings/agent/agent-prepare.ts +0 -1083
- package/src/wirings/agent/agent-registry.test.ts +0 -455
- package/src/wirings/agent/agent-registry.ts +0 -99
- package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
- package/src/wirings/agent/agent-rpc.ts +0 -116
- package/src/wirings/agent/agent-runner.test.ts +0 -1229
- package/src/wirings/agent/agent-runner.ts +0 -858
- package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
- package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
- package/src/wirings/agent/agent-stream.test.ts +0 -1800
- package/src/wirings/agent/agent-stream.ts +0 -1639
- package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
- package/src/wirings/agent/agent-turn.test.ts +0 -65
- package/src/wirings/agent/agent-turn.ts +0 -122
- package/src/wirings/agent/agent-utils.ts +0 -20
- package/src/wirings/agent/agent.types.ts +0 -676
- package/src/wirings/agent/index.ts +0 -58
- package/src/wirings/agent/voice-input.test.ts +0 -220
- package/src/wirings/agent/voice-input.ts +0 -180
- package/src/wirings/agent/voice-output.test.ts +0 -510
- package/src/wirings/agent/voice-output.ts +0 -311
- package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
- package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
- package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
- package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
- package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
- package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
- package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
- package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
- package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
- package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
- package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
- package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
- package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
- package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
- package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
- package/src/wirings/agent-scorer/index.ts +0 -23
- package/src/wirings/channel/channel-common.ts +0 -102
- package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
- package/src/wirings/channel/channel-handler.test.ts +0 -322
- package/src/wirings/channel/channel-handler.ts +0 -259
- package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
- package/src/wirings/channel/channel-host-rpc.ts +0 -69
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
- package/src/wirings/channel/channel-middleware-runner.ts +0 -126
- package/src/wirings/channel/channel-rpc-registry.ts +0 -116
- package/src/wirings/channel/channel-rpc-responder.ts +0 -117
- package/src/wirings/channel/channel-rpc-service.ts +0 -132
- package/src/wirings/channel/channel-rpc-validators.ts +0 -65
- package/src/wirings/channel/channel-rpc.test.ts +0 -841
- package/src/wirings/channel/channel-rpc.ts +0 -5
- package/src/wirings/channel/channel-rpc.types.ts +0 -160
- package/src/wirings/channel/channel-runner.ts +0 -164
- package/src/wirings/channel/channel-store.ts +0 -35
- package/src/wirings/channel/channel.types.ts +0 -193
- package/src/wirings/channel/define-channel-routes.ts +0 -5
- package/src/wirings/channel/eventhub-service.ts +0 -16
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -40
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -98
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
- package/src/wirings/channel/local/local-channel-runner.ts +0 -271
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
- package/src/wirings/channel/log-channels.ts +0 -16
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
- package/src/wirings/channel/serverless/index.ts +0 -6
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
- package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
- package/src/wirings/cli/channel/cli-approval.ts +0 -135
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
- package/src/wirings/cli/channel/index.ts +0 -6
- package/src/wirings/cli/cli-runner.test.ts +0 -969
- package/src/wirings/cli/cli-runner.ts +0 -538
- package/src/wirings/cli/cli.types.ts +0 -388
- package/src/wirings/cli/command-parser.test.ts +0 -1120
- package/src/wirings/cli/command-parser.ts +0 -713
- package/src/wirings/cli/define-cli-commands.ts +0 -13
- package/src/wirings/cli/format-cli-error.test.ts +0 -91
- package/src/wirings/cli/format-cli-error.ts +0 -96
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/credential/credential.types.ts +0 -37
- package/src/wirings/credential/define-credential.ts +0 -49
- package/src/wirings/credential/index.ts +0 -7
- package/src/wirings/credential/validate-credential-definitions.ts +0 -63
- package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
- package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
- package/src/wirings/gateway/gateway-runner.test.ts +0 -581
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -137
- package/src/wirings/gateway/index.ts +0 -15
- package/src/wirings/http/http-routes.test.ts +0 -318
- package/src/wirings/http/http-routes.ts +0 -111
- package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
- package/src/wirings/http/http-runner.test.ts +0 -503
- package/src/wirings/http/http-runner.ts +0 -462
- package/src/wirings/http/http.types.ts +0 -307
- package/src/wirings/http/index.ts +0 -27
- package/src/wirings/http/log-http-routes.ts +0 -18
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
- package/src/wirings/http/routers/path-to-regex.ts +0 -115
- package/src/wirings/http/web-request.test.ts +0 -382
- package/src/wirings/http/web-request.ts +0 -162
- package/src/wirings/mcp/index.ts +0 -26
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.test.ts +0 -588
- package/src/wirings/mcp/mcp-runner.ts +0 -330
- package/src/wirings/mcp/mcp.types.ts +0 -199
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -1
- package/src/wirings/oauth2/oauth2.types.ts +0 -12
- package/src/wirings/persona/define-personas.ts +0 -33
- package/src/wirings/persona/index.ts +0 -75
- package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
- package/src/wirings/persona/persona-app-scopes.ts +0 -74
- package/src/wirings/persona/persona-email.ts +0 -87
- package/src/wirings/persona/persona-environments.test.ts +0 -194
- package/src/wirings/persona/persona-environments.ts +0 -138
- package/src/wirings/persona/persona-mailbox.ts +0 -156
- package/src/wirings/persona/persona.test.ts +0 -230
- package/src/wirings/persona/persona.types.ts +0 -156
- package/src/wirings/persona/validate-personas.ts +0 -137
- package/src/wirings/queue/index.ts +0 -29
- package/src/wirings/queue/queue-identity.test.ts +0 -454
- package/src/wirings/queue/queue-identity.ts +0 -176
- package/src/wirings/queue/queue-runner.test.ts +0 -705
- package/src/wirings/queue/queue-runner.ts +0 -181
- package/src/wirings/queue/queue.types.ts +0 -161
- package/src/wirings/queue/register-queue-helper.ts +0 -46
- package/src/wirings/queue/signed-queue-service.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -90
- package/src/wirings/role/define-system-role.ts +0 -33
- package/src/wirings/role/index.ts +0 -13
- package/src/wirings/role/role.test.ts +0 -104
- package/src/wirings/role/role.types.ts +0 -47
- package/src/wirings/role/validate-role-definitions.ts +0 -93
- package/src/wirings/rpc/index.ts +0 -8
- package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
- package/src/wirings/rpc/rpc-runner.ts +0 -569
- package/src/wirings/rpc/rpc-types.ts +0 -87
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -16
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
- package/src/wirings/scheduler/scheduler-runner.ts +0 -138
- package/src/wirings/scheduler/scheduler.types.ts +0 -42
- package/src/wirings/scope/define-scope.ts +0 -33
- package/src/wirings/scope/index.ts +0 -15
- package/src/wirings/scope/scope.test.ts +0 -159
- package/src/wirings/scope/scope.types.ts +0 -42
- package/src/wirings/scope/validate-scope-definitions.ts +0 -107
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -70
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
- package/src/wirings/secret/validate-secret-definitions.ts +0 -88
- package/src/wirings/trigger/index.ts +0 -9
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
- package/src/wirings/trigger/trigger-runner.test.ts +0 -78
- package/src/wirings/trigger/trigger-runner.ts +0 -113
- package/src/wirings/trigger/trigger.types.ts +0 -100
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
- package/src/wirings/variable/validate-variable-definitions.ts +0 -71
- package/src/wirings/variable/variable.types.ts +0 -40
- package/src/wirings/virtual-user/index.ts +0 -107
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
- package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
- package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
- package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
- package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
- package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
- package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
- package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
- package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
- package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
- package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
- package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
- package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
- package/src/wirings/workflow/feature.test.ts +0 -131
- package/src/wirings/workflow/feature.ts +0 -59
- package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
- package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
- package/src/wirings/workflow/graph/graph-node.ts +0 -115
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
- package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
- package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
- package/src/wirings/workflow/graph/graph-validation.ts +0 -41
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
- package/src/wirings/workflow/index.ts +0 -107
- package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
- package/src/wirings/workflow/run-timeline.test.ts +0 -199
- package/src/wirings/workflow/run-timeline.ts +0 -185
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
- package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
- package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
- package/src/wirings/workflow/scenario-poll.test.ts +0 -64
- package/src/wirings/workflow/scenario-poll.ts +0 -27
- package/src/wirings/workflow/scenario-prose.test.ts +0 -275
- package/src/wirings/workflow/scenario-prose.ts +0 -86
- package/src/wirings/workflow/scenario-run.types.ts +0 -193
- package/src/wirings/workflow/scenario-service.test.ts +0 -147
- package/src/wirings/workflow/scenario-step-guards.ts +0 -23
- package/src/wirings/workflow/scenario-step.test.ts +0 -800
- package/src/wirings/workflow/scenario-step.types.ts +0 -262
- package/src/wirings/workflow/scenario-surface.test.ts +0 -146
- package/src/wirings/workflow/scenario-surface.ts +0 -71
- package/src/wirings/workflow/scenario.types.ts +0 -63
- package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
- package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
- package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
- package/src/wirings/workflow/workflow-approval.ts +0 -290
- package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
- package/src/wirings/workflow/workflow-constants.ts +0 -66
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
- package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
- package/src/wirings/workflow/workflow-errors.ts +0 -132
- package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
- package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
- package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
- package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
- package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
- package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
- package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
- package/src/wirings/workflow/workflow-recovery.ts +0 -192
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
- package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
- package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
- package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
- package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
- package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
- package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
- package/src/wirings/workflow/workflow-status-stream.ts +0 -144
- package/src/wirings/workflow/workflow-step-claim.ts +0 -46
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
- package/src/wirings/workflow/workflow-suspend.ts +0 -61
- package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
- package/src/wirings/workflow/workflow.types.ts +0 -268
- package/src/wirings-stay-decoupled.test.ts +0 -130
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
- package/tsconfig.type-tests.json +0 -15
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs resolvers in order, each seeing what the ones before it produced.
|
|
3
|
+
*
|
|
4
|
+
* Order is meaningful rather than incidental: a resolver that mints a cookie
|
|
5
|
+
* may only do so once consent has been read, so the resolver reading consent
|
|
6
|
+
* has to come first. Put the other way round, the minter sees no consent, mints
|
|
7
|
+
* nothing, and the app collects nothing — silently, which is why this threads
|
|
8
|
+
* state through instead of merging independent results.
|
|
9
|
+
*
|
|
10
|
+
* A later resolver wins a key it sets, so a minter's freshly created id
|
|
11
|
+
* replaces the absent one the cookie reader could not find.
|
|
12
|
+
*/
|
|
13
|
+
export const composeAnalyticsIdentity = (...resolvers) => {
|
|
14
|
+
return (wire, initial) => {
|
|
15
|
+
let resolved = initial ?? {};
|
|
16
|
+
for (const resolver of resolvers) {
|
|
17
|
+
const next = resolver(wire, resolved);
|
|
18
|
+
if (!next)
|
|
19
|
+
continue;
|
|
20
|
+
resolved = {
|
|
21
|
+
...resolved,
|
|
22
|
+
...next,
|
|
23
|
+
...(next.vendorIds === undefined && resolved.vendorIds === undefined
|
|
24
|
+
? {}
|
|
25
|
+
: { vendorIds: { ...resolved.vendorIds, ...next.vendorIds } }),
|
|
26
|
+
...(next.consent === undefined && resolved.consent === undefined
|
|
27
|
+
? {}
|
|
28
|
+
: { consent: { ...resolved.consent, ...next.consent } }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return Object.keys(resolved).length === 0 ? undefined : resolved;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AnalyticsIdentityResolver } from './analytics.types.js';
|
|
2
|
+
export interface CookieAnalyticsIdentityOptions {
|
|
3
|
+
/** Identity key to read it from, e.g. `{ gaClientId: '_ga' }`. */
|
|
4
|
+
vendorIds?: Record<string, string>;
|
|
5
|
+
/**
|
|
6
|
+
* Consent purpose to the cookie that grants it. The purpose is true only when
|
|
7
|
+
* the cookie is present and is not a recognised denial (`'0'`, `'false'`,
|
|
8
|
+
* `'denied'`), so a consent tool that writes a refusal rather than deleting
|
|
9
|
+
* the cookie is read as a refusal.
|
|
10
|
+
*/
|
|
11
|
+
consent?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Reads the browser-originated half of the identity off first-party cookies.
|
|
15
|
+
*
|
|
16
|
+
* Covers the common case only. A consent tool that packs every purpose into one
|
|
17
|
+
* encoded blob needs its own resolver — which is why the resolver is a function
|
|
18
|
+
* and this is a helper rather than the mechanism.
|
|
19
|
+
*
|
|
20
|
+
* Resolves nothing off an HTTP wire, which is correct: a cron task and a queue
|
|
21
|
+
* worker have no browser behind them, so any vendor id they produced would be
|
|
22
|
+
* invented.
|
|
23
|
+
*/
|
|
24
|
+
export declare const cookieAnalyticsIdentity: (options: CookieAnalyticsIdentityOptions) => AnalyticsIdentityResolver;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const DENIALS = new Set(['0', 'false', 'denied', 'deny', 'no']);
|
|
2
|
+
/**
|
|
3
|
+
* Reads the browser-originated half of the identity off first-party cookies.
|
|
4
|
+
*
|
|
5
|
+
* Covers the common case only. A consent tool that packs every purpose into one
|
|
6
|
+
* encoded blob needs its own resolver — which is why the resolver is a function
|
|
7
|
+
* and this is a helper rather than the mechanism.
|
|
8
|
+
*
|
|
9
|
+
* Resolves nothing off an HTTP wire, which is correct: a cron task and a queue
|
|
10
|
+
* worker have no browser behind them, so any vendor id they produced would be
|
|
11
|
+
* invented.
|
|
12
|
+
*/
|
|
13
|
+
export const cookieAnalyticsIdentity = (options) => {
|
|
14
|
+
return (wire) => {
|
|
15
|
+
const request = wire.http?.request;
|
|
16
|
+
if (!request)
|
|
17
|
+
return undefined;
|
|
18
|
+
const vendorIds = {};
|
|
19
|
+
for (const [key, cookieName] of Object.entries(options.vendorIds ?? {})) {
|
|
20
|
+
const value = request.cookie(cookieName);
|
|
21
|
+
if (value) {
|
|
22
|
+
vendorIds[key] = value;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const consent = {};
|
|
26
|
+
for (const [purpose, cookieName] of Object.entries(options.consent ?? {})) {
|
|
27
|
+
const value = request.cookie(cookieName);
|
|
28
|
+
if (value !== null) {
|
|
29
|
+
consent[purpose] = !DENIALS.has(value.toLowerCase());
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
...(Object.keys(vendorIds).length === 0 ? {} : { vendorIds }),
|
|
34
|
+
...(Object.keys(consent).length === 0 ? {} : { consent }),
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
2
|
+
/**
|
|
3
|
+
* The schema for one event's props. The generated ingest rebuilds each member
|
|
4
|
+
* of the union as `z.object(schema.shape)` so it can attach the event name, so
|
|
5
|
+
* a schema with no `shape` — a union, a primitive, a schema from a library
|
|
6
|
+
* that does not expose one — is not something an event can be declared with,
|
|
7
|
+
* and saying so here fails at the declaration rather than in generated code.
|
|
8
|
+
*/
|
|
9
|
+
export type AnalyticsEventPropsSchema = StandardSchemaV1 & {
|
|
10
|
+
shape: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
/** Events keyed by name; each value is the schema for that event's props. */
|
|
13
|
+
export type AnalyticsEventDefinitions = Record<string, AnalyticsEventPropsSchema>;
|
|
14
|
+
/**
|
|
15
|
+
* Declare what a module can measure. Call it as often as suits the project; the
|
|
16
|
+
* CLI unions every declaration into the ingest schema.
|
|
17
|
+
*
|
|
18
|
+
* It must stay an exported const — the schema pipeline reads the value by name.
|
|
19
|
+
* It registers nothing at runtime: where events go is an `AnalyticsService` on
|
|
20
|
+
* singleton services.
|
|
21
|
+
*/
|
|
22
|
+
export declare const defineAnalyticsEvents: <const Events extends AnalyticsEventDefinitions>(events: Events) => Events;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declare what a module can measure. Call it as often as suits the project; the
|
|
3
|
+
* CLI unions every declaration into the ingest schema.
|
|
4
|
+
*
|
|
5
|
+
* It must stay an exported const — the schema pipeline reads the value by name.
|
|
6
|
+
* It registers nothing at runtime: where events go is an `AnalyticsService` on
|
|
7
|
+
* singleton services.
|
|
8
|
+
*/
|
|
9
|
+
export const defineAnalyticsEvents = (events) => events;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AnalyticsService, AnalyticsSink } from './analytics.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* One `AnalyticsService` over several destinations.
|
|
4
|
+
*
|
|
5
|
+
* A composite rather than a change to the interface, so a single-destination
|
|
6
|
+
* app never meets it and a sink is the same class whether it runs alone or
|
|
7
|
+
* beside three others.
|
|
8
|
+
*
|
|
9
|
+
* Settled, not awaited in sequence: `flush()` runs inside the invocation, so a
|
|
10
|
+
* vendor that is slow must not add its latency to the request and a vendor that
|
|
11
|
+
* is down must not cost the others their events. A destination that throws is
|
|
12
|
+
* reported by the caller's existing flush guard, which already treats analytics
|
|
13
|
+
* as best-effort.
|
|
14
|
+
*/
|
|
15
|
+
export declare const fanOutAnalytics: (sinks: ReadonlyArray<AnalyticsSink | AnalyticsService>) => AnalyticsService;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One `AnalyticsService` over several destinations.
|
|
3
|
+
*
|
|
4
|
+
* A composite rather than a change to the interface, so a single-destination
|
|
5
|
+
* app never meets it and a sink is the same class whether it runs alone or
|
|
6
|
+
* beside three others.
|
|
7
|
+
*
|
|
8
|
+
* Settled, not awaited in sequence: `flush()` runs inside the invocation, so a
|
|
9
|
+
* vendor that is slow must not add its latency to the request and a vendor that
|
|
10
|
+
* is down must not cost the others their events. A destination that throws is
|
|
11
|
+
* reported by the caller's existing flush guard, which already treats analytics
|
|
12
|
+
* as best-effort.
|
|
13
|
+
*/
|
|
14
|
+
export const fanOutAnalytics = (sinks) => {
|
|
15
|
+
const resolved = sinks.map((sink) => 'service' in sink ? sink : { service: sink });
|
|
16
|
+
return {
|
|
17
|
+
async write(batch) {
|
|
18
|
+
if (batch.length === 0)
|
|
19
|
+
return;
|
|
20
|
+
const results = await Promise.allSettled(
|
|
21
|
+
// `accepts` is app code and runs inside this map. Thrown
|
|
22
|
+
// synchronously it would escape before `allSettled` was ever called,
|
|
23
|
+
// and every destination after it in the list would lose the batch.
|
|
24
|
+
resolved.map(async ({ service, accepts }) => {
|
|
25
|
+
const records = accepts ? batch.filter(accepts) : batch;
|
|
26
|
+
if (records.length === 0)
|
|
27
|
+
return;
|
|
28
|
+
await service.write(records);
|
|
29
|
+
}));
|
|
30
|
+
const failures = results.filter((result) => result.status === 'rejected');
|
|
31
|
+
if (failures.length > 0) {
|
|
32
|
+
throw new AggregateError(failures.map((failure) => failure.reason), `${failures.length} of ${resolved.length} analytics destinations failed`);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type { AnalyticsClientContext, AnalyticsEventBase, AnalyticsEventMeta, AnalyticsEventsMeta, AnalyticsEventInput, AnalyticsIdentity, AnalyticsLog, AnalyticsIdentityResolver, AnalyticsRecord, AnalyticsService, AnalyticsSink, } from './analytics.types.js';
|
|
2
|
+
export { createInvocationAnalytics, flattenAnalyticsEvent, } from './analytics.js';
|
|
3
|
+
export { LoggerAnalyticsService } from './logger-analytics-service.js';
|
|
4
|
+
export { defineAnalyticsEvents } from './define-analytics-events.js';
|
|
5
|
+
export type { AnalyticsEventDefinitions, AnalyticsEventPropsSchema, } from './define-analytics-events.js';
|
|
6
|
+
export { fanOutAnalytics } from './fan-out-analytics.js';
|
|
7
|
+
export { cookieAnalyticsIdentity } from './cookie-analytics-identity.js';
|
|
8
|
+
export type { CookieAnalyticsIdentityOptions } from './cookie-analytics-identity.js';
|
|
9
|
+
export { mintCookie, randomDigits } from './mint-cookie.js';
|
|
10
|
+
export type { MintCookieOptions } from './mint-cookie.js';
|
|
11
|
+
export { composeAnalyticsIdentity } from './compose-analytics-identity.js';
|
|
12
|
+
export { anonymousAnalyticsIdentity } from './anonymous-analytics-identity.js';
|
|
13
|
+
export type { AnonymousAnalyticsIdentityOptions } from './anonymous-analytics-identity.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createInvocationAnalytics, flattenAnalyticsEvent, } from './analytics.js';
|
|
2
|
+
export { LoggerAnalyticsService } from './logger-analytics-service.js';
|
|
3
|
+
export { defineAnalyticsEvents } from './define-analytics-events.js';
|
|
4
|
+
export { fanOutAnalytics } from './fan-out-analytics.js';
|
|
5
|
+
export { cookieAnalyticsIdentity } from './cookie-analytics-identity.js';
|
|
6
|
+
export { mintCookie, randomDigits } from './mint-cookie.js';
|
|
7
|
+
export { composeAnalyticsIdentity } from './compose-analytics-identity.js';
|
|
8
|
+
export { anonymousAnalyticsIdentity } from './anonymous-analytics-identity.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Logger } from '../services/logger.js';
|
|
2
|
+
import type { AnalyticsRecord, AnalyticsService } from './analytics.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* What an app gets before it has chosen a store. There is deliberately no noop:
|
|
5
|
+
* a validated wire with nowhere for the events to go is indistinguishable from
|
|
6
|
+
* a broken one.
|
|
7
|
+
*
|
|
8
|
+
* At `debug` so attaching a real store does not report every event twice.
|
|
9
|
+
*/
|
|
10
|
+
export declare class LoggerAnalyticsService implements AnalyticsService {
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(logger: Logger);
|
|
13
|
+
write(batch: AnalyticsRecord[]): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an app gets before it has chosen a store. There is deliberately no noop:
|
|
3
|
+
* a validated wire with nowhere for the events to go is indistinguishable from
|
|
4
|
+
* a broken one.
|
|
5
|
+
*
|
|
6
|
+
* At `debug` so attaching a real store does not report every event twice.
|
|
7
|
+
*/
|
|
8
|
+
export class LoggerAnalyticsService {
|
|
9
|
+
logger;
|
|
10
|
+
constructor(logger) {
|
|
11
|
+
this.logger = logger;
|
|
12
|
+
}
|
|
13
|
+
async write(batch) {
|
|
14
|
+
for (const event of batch) {
|
|
15
|
+
this.logger.debug(`analytics: ${event.name}`, {
|
|
16
|
+
...event.props,
|
|
17
|
+
userId: event.userIdentity.userId,
|
|
18
|
+
source: event.source,
|
|
19
|
+
...(event.at === undefined ? {} : { at: event.at }),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SerializeOptions } from 'cookie';
|
|
2
|
+
import type { CoreUserSession, PikkuWire } from '../types/core.types.js';
|
|
3
|
+
type AnyWire = PikkuWire<any, any, any, CoreUserSession>;
|
|
4
|
+
export interface MintCookieOptions {
|
|
5
|
+
/** Cookie attributes. Long-lived and first-party is the usual shape. */
|
|
6
|
+
cookie: SerializeOptions;
|
|
7
|
+
/**
|
|
8
|
+
* Purposes that must all be `true` before anything is written. Writing the
|
|
9
|
+
* cookie IS the act consent governs, so a minter that runs before the banner
|
|
10
|
+
* is answered has already done the thing the send gate was meant to prevent.
|
|
11
|
+
*/
|
|
12
|
+
requires?: string[];
|
|
13
|
+
consent?: Record<string, boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Replace the cookie already on the device rather than returning it.
|
|
16
|
+
*
|
|
17
|
+
* For the case where the request itself carries something newer than what is
|
|
18
|
+
* stored — Meta's `_fbc` derives from the `fbclid` on the current URL, and
|
|
19
|
+
* keeping an older click would attribute the conversion to the wrong ad.
|
|
20
|
+
*/
|
|
21
|
+
overwrite?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Reads a first-party cookie, creating and setting it when absent.
|
|
25
|
+
*
|
|
26
|
+
* This is how an app tracks a visitor with no vendor SDK on the page: the
|
|
27
|
+
* identifiers GA4 and Meta key on are ordinary first-party cookies in a
|
|
28
|
+
* documented format, and nothing requires a browser script to be the one that
|
|
29
|
+
* writes them. It is the mechanism behind server-side tagging, and the reason
|
|
30
|
+
* pikku can offer it as a wired service rather than a second container to run.
|
|
31
|
+
*
|
|
32
|
+
* Minted once per wire, not once per call. The resolver runs for every event,
|
|
33
|
+
* and a second mint within one request would hand the same visitor two
|
|
34
|
+
* identities — which reads downstream as two people rather than as a bug.
|
|
35
|
+
*
|
|
36
|
+
* Writes nothing on a wire with no HTTP response, and nothing once the response
|
|
37
|
+
* has been sent; a cron task and a queue worker have no browser to store it,
|
|
38
|
+
* and a stream's headers are long gone. Both return undefined rather than
|
|
39
|
+
* pretending.
|
|
40
|
+
*/
|
|
41
|
+
export declare const mintCookie: (wire: AnyWire, name: string, options: MintCookieOptions, mint: () => string) => string | undefined;
|
|
42
|
+
/** Cryptographically random digits, the shape both vendor formats use. */
|
|
43
|
+
export declare const randomDigits: (length: number) => string;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const minted = new WeakMap();
|
|
2
|
+
const permitted = (requires, consent) => {
|
|
3
|
+
if (!requires || requires.length === 0)
|
|
4
|
+
return true;
|
|
5
|
+
return requires.every((purpose) => consent?.[purpose] === true);
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Reads a first-party cookie, creating and setting it when absent.
|
|
9
|
+
*
|
|
10
|
+
* This is how an app tracks a visitor with no vendor SDK on the page: the
|
|
11
|
+
* identifiers GA4 and Meta key on are ordinary first-party cookies in a
|
|
12
|
+
* documented format, and nothing requires a browser script to be the one that
|
|
13
|
+
* writes them. It is the mechanism behind server-side tagging, and the reason
|
|
14
|
+
* pikku can offer it as a wired service rather than a second container to run.
|
|
15
|
+
*
|
|
16
|
+
* Minted once per wire, not once per call. The resolver runs for every event,
|
|
17
|
+
* and a second mint within one request would hand the same visitor two
|
|
18
|
+
* identities — which reads downstream as two people rather than as a bug.
|
|
19
|
+
*
|
|
20
|
+
* Writes nothing on a wire with no HTTP response, and nothing once the response
|
|
21
|
+
* has been sent; a cron task and a queue worker have no browser to store it,
|
|
22
|
+
* and a stream's headers are long gone. Both return undefined rather than
|
|
23
|
+
* pretending.
|
|
24
|
+
*/
|
|
25
|
+
export const mintCookie = (wire, name, options, mint) => {
|
|
26
|
+
const existing = options.overwrite
|
|
27
|
+
? null
|
|
28
|
+
: wire.http?.request?.cookie(name);
|
|
29
|
+
if (existing)
|
|
30
|
+
return existing;
|
|
31
|
+
const cache = minted.get(wire) ?? new Map();
|
|
32
|
+
const already = cache.get(name);
|
|
33
|
+
if (already)
|
|
34
|
+
return already;
|
|
35
|
+
const response = wire.http?.response;
|
|
36
|
+
if (!response)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (!permitted(options.requires, options.consent))
|
|
39
|
+
return undefined;
|
|
40
|
+
const value = mint();
|
|
41
|
+
response.cookie(name, value, options.cookie);
|
|
42
|
+
cache.set(name, value);
|
|
43
|
+
minted.set(wire, cache);
|
|
44
|
+
return value;
|
|
45
|
+
};
|
|
46
|
+
/** Cryptographically random digits, the shape both vendor formats use. */
|
|
47
|
+
export const randomDigits = (length) => {
|
|
48
|
+
const bytes = new Uint8Array(length);
|
|
49
|
+
crypto.getRandomValues(bytes);
|
|
50
|
+
let digits = '';
|
|
51
|
+
for (const byte of bytes) {
|
|
52
|
+
digits += String(byte % 10);
|
|
53
|
+
}
|
|
54
|
+
return digits;
|
|
55
|
+
};
|
package/dist/dev/hot-reload.d.ts
CHANGED
package/dist/dev/hot-reload.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { watch } from 'node:fs';
|
|
2
|
-
import { stat } from 'node:fs/promises';
|
|
3
2
|
import { basename, join, resolve, relative } from 'node:path';
|
|
4
3
|
import { pikkuState } from '../pikku-state.js';
|
|
5
4
|
import { clearMiddlewareCache } from '../middleware-runner.js';
|
|
@@ -14,24 +13,6 @@ const isFunctionConfig = (value) => {
|
|
|
14
13
|
'func' in value &&
|
|
15
14
|
typeof value.func === 'function');
|
|
16
15
|
};
|
|
17
|
-
const findCompiledFile = async (tsFile, srcDir, pikkuDir) => {
|
|
18
|
-
const rel = relative(srcDir, tsFile).replace(/\.ts$/, '.js');
|
|
19
|
-
const candidates = [
|
|
20
|
-
join(pikkuDir, 'dist', rel),
|
|
21
|
-
join(srcDir, rel),
|
|
22
|
-
tsFile.replace(/\.ts$/, '.js'),
|
|
23
|
-
];
|
|
24
|
-
for (const candidate of candidates) {
|
|
25
|
-
try {
|
|
26
|
-
await stat(candidate);
|
|
27
|
-
return candidate;
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
// not found, try next
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
};
|
|
35
16
|
const isWatchedTsFile = (filename) => {
|
|
36
17
|
return (filename.endsWith('.ts') &&
|
|
37
18
|
!filename.endsWith('.test.ts') &&
|
|
@@ -55,9 +36,8 @@ const reloadFailureReason = (error) => {
|
|
|
55
36
|
return ` ${error.stack ?? error.message}`;
|
|
56
37
|
};
|
|
57
38
|
export async function pikkuDevReloader(options) {
|
|
58
|
-
const { srcDirectories, logger
|
|
39
|
+
const { srcDirectories, logger } = options;
|
|
59
40
|
const absSrcDirs = srcDirectories.map((d) => resolve(d));
|
|
60
|
-
const absPikkuDir = resolve(pikkuDir);
|
|
61
41
|
const watchers = [];
|
|
62
42
|
const functionsMap = pikkuState(null, 'function', 'functions');
|
|
63
43
|
const moduleRunner = createModuleRunner();
|
|
@@ -68,15 +48,14 @@ export async function pikkuDevReloader(options) {
|
|
|
68
48
|
const srcDir = absSrcDirs.find((d) => changedTsFile.startsWith(d));
|
|
69
49
|
if (!srcDir)
|
|
70
50
|
return;
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
const result = await moduleRunner.run(importPath);
|
|
51
|
+
// knowledge: decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md
|
|
52
|
+
const result = await moduleRunner.run(changedTsFile);
|
|
74
53
|
if (!result.ok) {
|
|
75
54
|
// Keeping the old code leaves the process disagreeing with the file on
|
|
76
55
|
// disk, and the only symptom is stale output from a function that looks
|
|
77
56
|
// correct in the editor — so the reason has to be printed here, where it
|
|
78
57
|
// is still known, rather than left for the developer to reconstruct.
|
|
79
|
-
logger.error(`Failed to import: ${relative(process.cwd(),
|
|
58
|
+
logger.error(`Failed to import: ${relative(process.cwd(), changedTsFile)} (keeping old code)\n` +
|
|
80
59
|
reloadFailureReason(result.error));
|
|
81
60
|
return;
|
|
82
61
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { dirname, isAbsolute, join, resolve, sep } from 'node:path';
|
|
4
4
|
import { pathToFileURL } from 'node:url';
|
|
5
5
|
import { compileFunction } from 'node:vm';
|
|
6
6
|
let transformSync;
|
|
@@ -18,7 +18,78 @@ const loadTransform = async () => {
|
|
|
18
18
|
* is correct, and no amount of re-reading it will reveal that the reloader —
|
|
19
19
|
* not the file — is what cannot cope. */
|
|
20
20
|
export const isTopLevelAwaitLimitation = (error) => /top-level await/i.test(error.message);
|
|
21
|
+
const TYPESCRIPT_FILE = /\.(m|c)?tsx?$/;
|
|
22
|
+
const isFile = (path) => {
|
|
23
|
+
try {
|
|
24
|
+
return statSync(path).isFile();
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
/** Where a relative specifier's TypeScript source lives, for the specifiers a
|
|
31
|
+
* plain `require` cannot resolve. A TS project writes `./sibling.js` for a file
|
|
32
|
+
* that only exists as `./sibling.ts`, and a reloaded module is the source, so
|
|
33
|
+
* every one of its relative imports arrives in that unresolvable form. */
|
|
34
|
+
const findTypeScriptSource = (specifier, importerDir) => {
|
|
35
|
+
if (!specifier.startsWith('.') && !isAbsolute(specifier))
|
|
36
|
+
return undefined;
|
|
37
|
+
const base = resolve(importerDir, specifier);
|
|
38
|
+
const withoutJs = base.replace(/\.(m|c)?js$/, '');
|
|
39
|
+
const candidates = [
|
|
40
|
+
`${withoutJs}.ts`,
|
|
41
|
+
`${withoutJs}.tsx`,
|
|
42
|
+
`${withoutJs}.mts`,
|
|
43
|
+
`${withoutJs}.cts`,
|
|
44
|
+
join(base, 'index.ts'),
|
|
45
|
+
join(base, 'index.tsx'),
|
|
46
|
+
];
|
|
47
|
+
return candidates.find(isFile);
|
|
48
|
+
};
|
|
49
|
+
const isProjectTypeScript = (path) => TYPESCRIPT_FILE.test(path) && !path.includes(`${sep}node_modules${sep}`);
|
|
50
|
+
/** JSX is a syntax esbuild only parses when asked, so a `.tsx` helper handed to
|
|
51
|
+
* the `ts` loader fails to compile and the file importing it keeps its old
|
|
52
|
+
* code. */
|
|
53
|
+
const loaderFor = (path) => {
|
|
54
|
+
if (path.endsWith('.tsx'))
|
|
55
|
+
return 'tsx';
|
|
56
|
+
if (TYPESCRIPT_FILE.test(path))
|
|
57
|
+
return 'ts';
|
|
58
|
+
if (path.endsWith('.jsx'))
|
|
59
|
+
return 'jsx';
|
|
60
|
+
return 'js';
|
|
61
|
+
};
|
|
62
|
+
const evaluateModule = (absPath, cache) => {
|
|
63
|
+
const cached = cache.get(absPath);
|
|
64
|
+
if (cached)
|
|
65
|
+
return cached;
|
|
66
|
+
const source = readFileSync(absPath, 'utf-8');
|
|
67
|
+
const { code } = transformSync(source, {
|
|
68
|
+
loader: loaderFor(absPath),
|
|
69
|
+
format: 'cjs',
|
|
70
|
+
sourcefile: absPath,
|
|
71
|
+
});
|
|
72
|
+
const fn = compileFunction(code, ['require', 'exports', 'module', '__filename', '__dirname'], { filename: absPath });
|
|
73
|
+
const moduleObj = { exports: {} };
|
|
74
|
+
// Seeded before evaluation so an import cycle terminates the way CJS's own
|
|
75
|
+
// cache makes it terminate, and overwritten after because esbuild's `cjs`
|
|
76
|
+
// emit assigns a fresh `module.exports` on the way out.
|
|
77
|
+
cache.set(absPath, moduleObj.exports);
|
|
78
|
+
fn(createRequireForFile(absPath, cache), moduleObj.exports, moduleObj, absPath, dirname(absPath));
|
|
79
|
+
cache.set(absPath, moduleObj.exports);
|
|
80
|
+
return moduleObj.exports;
|
|
81
|
+
};
|
|
21
82
|
/** The `require` a reloaded module is run with.
|
|
83
|
+
*
|
|
84
|
+
* Resolution goes through the host first, so every package binds to the
|
|
85
|
+
* instance the rest of the process holds and a user file's `wire*` side
|
|
86
|
+
* effect mutates live state rather than a private copy.
|
|
87
|
+
*
|
|
88
|
+
* A resolved TypeScript file outside `node_modules` is the project's own
|
|
89
|
+
* source, and is compiled here instead of handed back to the host: both hosts
|
|
90
|
+
* cache what they load, so a helper edited alongside the function importing it
|
|
91
|
+
* would otherwise keep answering with the version loaded at startup — the same
|
|
92
|
+
* stale-code-under-a-successful-reload the reloader exists to avoid.
|
|
22
93
|
*
|
|
23
94
|
* On Bun, `createRequire`'s referrer stops being honoured somewhere in a
|
|
24
95
|
* long-running process: the same relative specifier that resolves in a fresh
|
|
@@ -27,47 +98,55 @@ export const isTopLevelAwaitLimitation = (error) => /top-level await/i.test(erro
|
|
|
27
98
|
* is left serving the previous code from an edit that looked applied. Bun's
|
|
28
99
|
* own resolver still answers correctly when handed the importer's directory
|
|
29
100
|
* outright, so the specifier is resolved to an absolute path first and the
|
|
30
|
-
* referrer never has to survive the trip.
|
|
31
|
-
*
|
|
101
|
+
* referrer never has to survive the trip.
|
|
102
|
+
*
|
|
103
|
+
* What neither host resolves is a relative `./sibling.js` whose only file on
|
|
104
|
+
* disk is `./sibling.ts` — node's `require` has no `.js → .ts` rewrite, and
|
|
105
|
+
* the reloader hands it source. Those, and only those, are compiled here.
|
|
32
106
|
*/
|
|
33
|
-
const createRequireForFile = (absPath) => {
|
|
107
|
+
const createRequireForFile = (absPath, cache) => {
|
|
34
108
|
const base = createRequire(pathToFileURL(absPath));
|
|
35
109
|
const bun = globalThis.Bun;
|
|
36
|
-
if (!bun)
|
|
37
|
-
return base;
|
|
38
110
|
const importerDir = dirname(absPath);
|
|
39
|
-
const
|
|
111
|
+
const resolveThroughHost = (specifier) => {
|
|
112
|
+
if (bun) {
|
|
113
|
+
try {
|
|
114
|
+
return bun.resolveSync(specifier, importerDir);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
40
120
|
try {
|
|
41
|
-
return
|
|
121
|
+
return base.resolve(specifier);
|
|
42
122
|
}
|
|
43
123
|
catch {
|
|
44
|
-
return
|
|
124
|
+
return undefined;
|
|
45
125
|
}
|
|
46
126
|
};
|
|
47
127
|
// Only resolution is delegated; the require itself stays outside the guard so
|
|
48
128
|
// a module that throws while evaluating reports its own error rather than
|
|
49
129
|
// being retried under a second specifier.
|
|
50
|
-
const
|
|
51
|
-
|
|
130
|
+
const loadingRequire = ((specifier) => {
|
|
131
|
+
const resolved = resolveThroughHost(specifier) ??
|
|
132
|
+
findTypeScriptSource(specifier, importerDir);
|
|
133
|
+
if (!resolved)
|
|
134
|
+
return base(specifier);
|
|
135
|
+
if (isProjectTypeScript(resolved))
|
|
136
|
+
return evaluateModule(resolved, cache);
|
|
137
|
+
return base(resolved);
|
|
138
|
+
});
|
|
139
|
+
return Object.assign(loadingRequire, base);
|
|
52
140
|
};
|
|
53
141
|
export const createModuleRunner = () => {
|
|
54
142
|
const registry = new Map();
|
|
55
143
|
const run = async (filePath) => {
|
|
56
144
|
const absPath = resolve(filePath);
|
|
57
145
|
try {
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
format: 'cjs',
|
|
63
|
-
sourcefile: absPath,
|
|
64
|
-
});
|
|
65
|
-
const fn = compileFunction(code, ['require', 'exports', 'module', '__filename', '__dirname'], { filename: absPath });
|
|
66
|
-
const require = createRequireForFile(absPath);
|
|
67
|
-
const moduleObj = { exports: {} };
|
|
68
|
-
fn(require, moduleObj.exports, moduleObj, absPath, dirname(absPath));
|
|
69
|
-
registry.set(absPath, moduleObj.exports);
|
|
70
|
-
return { ok: true, exports: moduleObj.exports };
|
|
146
|
+
await loadTransform();
|
|
147
|
+
const exports = evaluateModule(absPath, new Map());
|
|
148
|
+
registry.set(absPath, exports);
|
|
149
|
+
return { ok: true, exports };
|
|
71
150
|
}
|
|
72
151
|
catch (thrown) {
|
|
73
152
|
// A bad edit, or the one known limitation: a file using top-level
|
package/dist/errors/errors.d.ts
CHANGED
|
@@ -35,6 +35,13 @@ export declare class MissingScopeError extends PikkuError {
|
|
|
35
35
|
};
|
|
36
36
|
constructor(scope: string);
|
|
37
37
|
}
|
|
38
|
+
export declare class FeatureUnavailableError extends PikkuError {
|
|
39
|
+
payload: {
|
|
40
|
+
error: 'feature_unavailable';
|
|
41
|
+
feature: string;
|
|
42
|
+
};
|
|
43
|
+
constructor(feature: string);
|
|
44
|
+
}
|
|
38
45
|
export declare class ReadonlySessionError extends PikkuError {
|
|
39
46
|
}
|
|
40
47
|
export declare class InvalidOriginError extends PikkuError {
|
package/dist/errors/errors.js
CHANGED
|
@@ -87,6 +87,23 @@ addError(MissingScopeError, {
|
|
|
87
87
|
status: 403,
|
|
88
88
|
message: 'The session does not hold a scope required by this function.',
|
|
89
89
|
});
|
|
90
|
+
export class FeatureUnavailableError extends PikkuError {
|
|
91
|
+
payload;
|
|
92
|
+
constructor(feature) {
|
|
93
|
+
super(`Feature is currently unavailable: ${feature}`);
|
|
94
|
+
this.payload = {
|
|
95
|
+
error: 'feature_unavailable',
|
|
96
|
+
feature,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 503 and not 403: a killed feature is a server-side, temporary, not-your-fault
|
|
101
|
+
// condition, and it should be retryable and monitorable as one. A 403 here
|
|
102
|
+
// would page the wrong team and tell the caller to fix something they cannot.
|
|
103
|
+
addError(FeatureUnavailableError, {
|
|
104
|
+
status: 503,
|
|
105
|
+
message: 'This feature is switched off.',
|
|
106
|
+
});
|
|
90
107
|
export class ReadonlySessionError extends PikkuError {
|
|
91
108
|
}
|
|
92
109
|
addError(ReadonlySessionError, {
|
|
@@ -25,6 +25,8 @@ export type FunctionRuntimeMeta = {
|
|
|
25
25
|
outputSchemaName: string | null;
|
|
26
26
|
/** Scopes the session must hold to run this function. All are required (AND). */
|
|
27
27
|
scopes?: string[];
|
|
28
|
+
/** The feature this function belongs to. Checked for availability only. */
|
|
29
|
+
featureFlag?: string;
|
|
28
30
|
expose?: boolean;
|
|
29
31
|
/**
|
|
30
32
|
* A sessionless function's own `auth: true`. `sessionless` carries the
|