everything-dev 1.53.2 → 2.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -11
- package/dist/_virtual/_rolldown/runtime.cjs +17 -2
- package/dist/_virtual/_rolldown/runtime.mjs +36 -0
- package/dist/api/auth-middleware.cjs +161 -0
- package/dist/api/auth-middleware.cjs.map +1 -0
- package/dist/api/auth-middleware.d.cts +69 -0
- package/dist/api/auth-middleware.d.mts +69 -0
- package/dist/api/auth-middleware.mjs +160 -0
- package/dist/api/auth-middleware.mjs.map +1 -0
- package/dist/api-contract.cjs +250 -62
- package/dist/api-contract.cjs.map +1 -1
- package/dist/api-contract.mjs +246 -65
- package/dist/api-contract.mjs.map +1 -1
- package/dist/app.cjs +99 -26
- package/dist/app.cjs.map +1 -1
- package/dist/app.d.cts +3 -0
- package/dist/app.d.mts +3 -0
- package/dist/app.mjs +100 -27
- package/dist/app.mjs.map +1 -1
- package/dist/auth-login.cjs +163 -0
- package/dist/auth-login.cjs.map +1 -0
- package/dist/auth-login.mjs +162 -0
- package/dist/auth-login.mjs.map +1 -0
- package/dist/auth-session.cjs +64 -0
- package/dist/auth-session.cjs.map +1 -0
- package/dist/auth-session.mjs +58 -0
- package/dist/auth-session.mjs.map +1 -0
- package/dist/auth-types-gen.cjs +0 -1
- package/dist/auth-types-gen.cjs.map +1 -1
- package/dist/build.cjs +37 -173
- package/dist/build.cjs.map +1 -1
- package/dist/build.mjs +37 -171
- package/dist/build.mjs.map +1 -1
- package/dist/bundle-cache.cjs +74 -0
- package/dist/bundle-cache.cjs.map +1 -0
- package/dist/bundle-cache.d.cts +27 -0
- package/dist/bundle-cache.d.mts +27 -0
- package/dist/bundle-cache.mjs +68 -0
- package/dist/bundle-cache.mjs.map +1 -0
- package/dist/bundle-fs-resolve.cjs +209 -0
- package/dist/bundle-fs-resolve.cjs.map +1 -0
- package/dist/bundle-fs-resolve.d.cts +76 -0
- package/dist/bundle-fs-resolve.d.mts +76 -0
- package/dist/bundle-fs-resolve.mjs +202 -0
- package/dist/bundle-fs-resolve.mjs.map +1 -0
- package/dist/cdn-deploy.cjs +126 -0
- package/dist/cdn-deploy.cjs.map +1 -0
- package/dist/cdn-deploy.mjs +124 -0
- package/dist/cdn-deploy.mjs.map +1 -0
- package/dist/cli/db-doctor.cjs +19 -19
- package/dist/cli/db-doctor.cjs.map +1 -1
- package/dist/cli/db-doctor.mjs +18 -18
- package/dist/cli/db-doctor.mjs.map +1 -1
- package/dist/cli/db-repair.cjs +9 -32
- package/dist/cli/db-repair.cjs.map +1 -1
- package/dist/cli/db-repair.mjs +9 -32
- package/dist/cli/db-repair.mjs.map +1 -1
- package/dist/cli/framework-version.cjs +7 -3
- package/dist/cli/framework-version.cjs.map +1 -1
- package/dist/cli/framework-version.mjs +7 -3
- package/dist/cli/framework-version.mjs.map +1 -1
- package/dist/cli/infra.cjs +159 -251
- package/dist/cli/infra.cjs.map +1 -1
- package/dist/cli/infra.mjs +154 -242
- package/dist/cli/infra.mjs.map +1 -1
- package/dist/cli/init.cjs +624 -196
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.d.cts +61 -8
- package/dist/cli/init.d.mts +61 -8
- package/dist/cli/init.mjs +613 -194
- package/dist/cli/init.mjs.map +1 -1
- package/dist/cli/parse.cjs +8 -7
- package/dist/cli/parse.cjs.map +1 -1
- package/dist/cli/parse.mjs +9 -7
- package/dist/cli/parse.mjs.map +1 -1
- package/dist/cli/prompts.cjs +14 -1
- package/dist/cli/prompts.cjs.map +1 -1
- package/dist/cli/prompts.mjs +14 -1
- package/dist/cli/prompts.mjs.map +1 -1
- package/dist/cli/prune.cjs +220 -0
- package/dist/cli/prune.cjs.map +1 -0
- package/dist/cli/prune.mjs +220 -0
- package/dist/cli/prune.mjs.map +1 -0
- package/dist/cli/snapshot.cjs +2 -1
- package/dist/cli/snapshot.cjs.map +1 -1
- package/dist/cli/snapshot.mjs +2 -1
- package/dist/cli/snapshot.mjs.map +1 -1
- package/dist/cli/status.cjs +5 -4
- package/dist/cli/status.cjs.map +1 -1
- package/dist/cli/status.mjs +6 -5
- package/dist/cli/status.mjs.map +1 -1
- package/dist/cli/sync.cjs +156 -58
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +158 -63
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/timing.cjs +0 -1
- package/dist/cli/timing.cjs.map +1 -1
- package/dist/cli/upgrade.cjs +95 -69
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +97 -72
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/cli/utils/helpers.cjs.map +1 -1
- package/dist/cli.cjs +320 -72
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +316 -68
- package/dist/cli.mjs.map +1 -1
- package/dist/code-artifacts.cjs +76 -8
- package/dist/code-artifacts.cjs.map +1 -1
- package/dist/code-artifacts.mjs +76 -10
- package/dist/code-artifacts.mjs.map +1 -1
- package/dist/commands/build.cjs +65 -0
- package/dist/commands/build.cjs.map +1 -0
- package/dist/commands/build.mjs +65 -0
- package/dist/commands/build.mjs.map +1 -0
- package/dist/commands/config.cjs +77 -0
- package/dist/commands/config.cjs.map +1 -0
- package/dist/commands/config.d.cts +8 -0
- package/dist/commands/config.d.mts +8 -0
- package/dist/commands/config.mjs +74 -0
- package/dist/commands/config.mjs.map +1 -0
- package/dist/commands/db.cjs +107 -0
- package/dist/commands/db.cjs.map +1 -0
- package/dist/commands/db.mjs +107 -0
- package/dist/commands/db.mjs.map +1 -0
- package/dist/commands/deploy.cjs +336 -0
- package/dist/commands/deploy.cjs.map +1 -0
- package/dist/commands/deploy.mjs +334 -0
- package/dist/commands/deploy.mjs.map +1 -0
- package/dist/commands/dev.cjs +75 -0
- package/dist/commands/dev.cjs.map +1 -0
- package/dist/commands/dev.mjs +73 -0
- package/dist/commands/dev.mjs.map +1 -0
- package/dist/commands/init.cjs +234 -0
- package/dist/commands/init.cjs.map +1 -0
- package/dist/commands/init.mjs +231 -0
- package/dist/commands/init.mjs.map +1 -0
- package/dist/commands/keys.cjs +255 -0
- package/dist/commands/keys.cjs.map +1 -0
- package/dist/commands/keys.mjs +253 -0
- package/dist/commands/keys.mjs.map +1 -0
- package/dist/commands/ops.cjs +199 -0
- package/dist/commands/ops.cjs.map +1 -0
- package/dist/commands/ops.mjs +197 -0
- package/dist/commands/ops.mjs.map +1 -0
- package/dist/commands/plugins.cjs +211 -0
- package/dist/commands/plugins.cjs.map +1 -0
- package/dist/commands/plugins.mjs +211 -0
- package/dist/commands/plugins.mjs.map +1 -0
- package/dist/commands/shared.cjs +8 -0
- package/dist/commands/shared.cjs.map +1 -0
- package/dist/commands/shared.d.cts +6 -0
- package/dist/commands/shared.d.mts +6 -0
- package/dist/commands/shared.mjs +8 -0
- package/dist/commands/shared.mjs.map +1 -0
- package/dist/commands/upgrade.cjs +325 -0
- package/dist/commands/upgrade.cjs.map +1 -0
- package/dist/commands/upgrade.mjs +323 -0
- package/dist/commands/upgrade.mjs.map +1 -0
- package/dist/components/dev-render.cjs +340 -0
- package/dist/components/dev-render.cjs.map +1 -0
- package/dist/components/dev-render.mjs +332 -0
- package/dist/components/dev-render.mjs.map +1 -0
- package/dist/config.cjs +460 -221
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +491 -48
- package/dist/config.d.mts +491 -48
- package/dist/config.mjs +439 -212
- package/dist/config.mjs.map +1 -1
- package/dist/contract.cjs +327 -50
- package/dist/contract.cjs.map +1 -1
- package/dist/contract.d.cts +1951 -1062
- package/dist/contract.d.mts +1951 -1062
- package/dist/contract.meta.cjs +107 -12
- package/dist/contract.meta.cjs.map +1 -1
- package/dist/contract.meta.d.cts +166 -8
- package/dist/contract.meta.d.mts +166 -8
- package/dist/contract.meta.mjs +107 -11
- package/dist/contract.meta.mjs.map +1 -1
- package/dist/contract.mjs +580 -327
- package/dist/contract.mjs.map +1 -1
- package/dist/dag.cjs +5 -3
- package/dist/dag.cjs.map +1 -1
- package/dist/dag.mjs +6 -3
- package/dist/dag.mjs.map +1 -1
- package/dist/db/binding.cjs +80 -0
- package/dist/db/binding.cjs.map +1 -0
- package/dist/db/binding.d.cts +39 -0
- package/dist/db/binding.d.mts +39 -0
- package/dist/db/binding.mjs +78 -0
- package/dist/db/binding.mjs.map +1 -0
- package/dist/db/bindings.cjs +78 -0
- package/dist/db/bindings.cjs.map +1 -0
- package/dist/db/bindings.d.cts +34 -0
- package/dist/db/bindings.d.mts +34 -0
- package/dist/db/bindings.mjs +76 -0
- package/dist/db/bindings.mjs.map +1 -0
- package/dist/db/core.cjs +204 -0
- package/dist/db/core.cjs.map +1 -0
- package/dist/db/core.d.cts +69 -0
- package/dist/db/core.d.mts +69 -0
- package/dist/db/core.mjs +192 -0
- package/dist/db/core.mjs.map +1 -0
- package/dist/db/driver.cjs +167 -0
- package/dist/db/driver.cjs.map +1 -0
- package/dist/db/driver.d.cts +50 -0
- package/dist/db/driver.d.mts +50 -0
- package/dist/db/driver.mjs +165 -0
- package/dist/db/driver.mjs.map +1 -0
- package/dist/db/drizzle-kit.cjs +177 -0
- package/dist/db/drizzle-kit.cjs.map +1 -0
- package/dist/db/drizzle-kit.d.cts +25 -0
- package/dist/db/drizzle-kit.d.mts +25 -0
- package/dist/db/drizzle-kit.mjs +175 -0
- package/dist/db/drizzle-kit.mjs.map +1 -0
- package/dist/db/errors.cjs +27 -0
- package/dist/db/errors.cjs.map +1 -0
- package/dist/db/errors.d.cts +16 -0
- package/dist/db/errors.d.mts +16 -0
- package/dist/db/errors.mjs +26 -0
- package/dist/db/errors.mjs.map +1 -0
- package/dist/db/identity.cjs +55 -0
- package/dist/db/identity.cjs.map +1 -0
- package/dist/db/identity.d.cts +40 -0
- package/dist/db/identity.d.mts +40 -0
- package/dist/db/identity.mjs +53 -0
- package/dist/db/identity.mjs.map +1 -0
- package/dist/db/index.cjs +43 -0
- package/dist/db/index.d.cts +9 -0
- package/dist/db/index.d.mts +9 -0
- package/dist/db/index.mjs +10 -0
- package/dist/db/run-migrations.cjs +343 -0
- package/dist/db/run-migrations.cjs.map +1 -0
- package/dist/db/run-migrations.d.cts +87 -0
- package/dist/db/run-migrations.d.mts +87 -0
- package/dist/db/run-migrations.mjs +341 -0
- package/dist/db/run-migrations.mjs.map +1 -0
- package/dist/delegate-signer.cjs +85 -0
- package/dist/delegate-signer.cjs.map +1 -0
- package/dist/delegate-signer.mjs +84 -0
- package/dist/delegate-signer.mjs.map +1 -0
- package/dist/deploy-diff.cjs +119 -0
- package/dist/deploy-diff.cjs.map +1 -0
- package/dist/deploy-diff.mjs +109 -0
- package/dist/deploy-diff.mjs.map +1 -0
- package/dist/descriptor/constructors.cjs +49 -0
- package/dist/descriptor/constructors.cjs.map +1 -0
- package/dist/descriptor/constructors.d.cts +27 -0
- package/dist/descriptor/constructors.d.mts +27 -0
- package/dist/descriptor/constructors.mjs +45 -0
- package/dist/descriptor/constructors.mjs.map +1 -0
- package/dist/descriptor/index.cjs +24 -0
- package/dist/descriptor/index.d.cts +5 -0
- package/dist/descriptor/index.d.mts +5 -0
- package/dist/descriptor/index.mjs +6 -0
- package/dist/descriptor/resolve.cjs +258 -0
- package/dist/descriptor/resolve.cjs.map +1 -0
- package/dist/descriptor/resolve.d.cts +50 -0
- package/dist/descriptor/resolve.d.mts +50 -0
- package/dist/descriptor/resolve.mjs +252 -0
- package/dist/descriptor/resolve.mjs.map +1 -0
- package/dist/descriptor/schema.cjs +109 -0
- package/dist/descriptor/schema.cjs.map +1 -0
- package/dist/descriptor/schema.d.cts +217 -0
- package/dist/descriptor/schema.d.mts +217 -0
- package/dist/descriptor/schema.mjs +102 -0
- package/dist/descriptor/schema.mjs.map +1 -0
- package/dist/descriptor/serialize.cjs +45 -0
- package/dist/descriptor/serialize.cjs.map +1 -0
- package/dist/descriptor/serialize.d.cts +7 -0
- package/dist/descriptor/serialize.d.mts +7 -0
- package/dist/descriptor/serialize.mjs +45 -0
- package/dist/descriptor/serialize.mjs.map +1 -0
- package/dist/dev-log-pipeline.cjs +273 -0
- package/dist/dev-log-pipeline.cjs.map +1 -0
- package/dist/dev-log-pipeline.mjs +267 -0
- package/dist/dev-log-pipeline.mjs.map +1 -0
- package/dist/dev-logs.cjs +39 -8
- package/dist/dev-logs.cjs.map +1 -1
- package/dist/dev-logs.mjs +37 -9
- package/dist/dev-logs.mjs.map +1 -1
- package/dist/dev-program.cjs +405 -0
- package/dist/dev-program.cjs.map +1 -0
- package/dist/dev-program.d.cts +10 -0
- package/dist/dev-program.d.mts +10 -0
- package/dist/dev-program.mjs +395 -0
- package/dist/dev-program.mjs.map +1 -0
- package/dist/dev-session-data.d.cts +27 -0
- package/dist/dev-session-data.d.mts +27 -0
- package/dist/dev-session.cjs +178 -105
- package/dist/dev-session.cjs.map +1 -1
- package/dist/dev-session.mjs +180 -105
- package/dist/dev-session.mjs.map +1 -1
- package/dist/env/process-env.cjs +16 -0
- package/dist/env/process-env.cjs.map +1 -0
- package/dist/env/process-env.mjs +13 -0
- package/dist/env/process-env.mjs.map +1 -0
- package/dist/env/project-env.cjs +144 -0
- package/dist/env/project-env.cjs.map +1 -0
- package/dist/env/project-env.d.cts +1 -0
- package/dist/env/project-env.d.mts +1 -0
- package/dist/env/project-env.mjs +132 -0
- package/dist/env/project-env.mjs.map +1 -0
- package/dist/fastkv.cjs +59 -12
- package/dist/fastkv.cjs.map +1 -1
- package/dist/fastkv.d.cts +42 -6
- package/dist/fastkv.d.mts +42 -6
- package/dist/fastkv.mjs +58 -13
- package/dist/fastkv.mjs.map +1 -1
- package/dist/fingerprint.cjs +57 -0
- package/dist/fingerprint.cjs.map +1 -0
- package/dist/fingerprint.d.cts +14 -0
- package/dist/fingerprint.d.mts +14 -0
- package/dist/fingerprint.mjs +55 -0
- package/dist/fingerprint.mjs.map +1 -0
- package/dist/http-client.cjs +17 -17
- package/dist/http-client.cjs.map +1 -1
- package/dist/http-client.mjs +17 -17
- package/dist/http-client.mjs.map +1 -1
- package/dist/image-deploy.cjs +186 -0
- package/dist/image-deploy.cjs.map +1 -0
- package/dist/image-deploy.mjs +182 -0
- package/dist/image-deploy.mjs.map +1 -0
- package/dist/index.cjs +66 -18
- package/dist/index.d.cts +8 -7
- package/dist/index.d.mts +8 -7
- package/dist/index.mjs +6 -5
- package/dist/infra/docker.cjs +77 -0
- package/dist/infra/docker.cjs.map +1 -0
- package/dist/infra/docker.d.cts +10 -0
- package/dist/infra/docker.d.mts +10 -0
- package/dist/infra/docker.mjs +69 -0
- package/dist/infra/docker.mjs.map +1 -0
- package/dist/infra/materializer.cjs +74 -0
- package/dist/infra/materializer.cjs.map +1 -0
- package/dist/infra/materializer.mjs +70 -0
- package/dist/infra/materializer.mjs.map +1 -0
- package/dist/infra/planner.cjs +135 -103
- package/dist/infra/planner.cjs.map +1 -1
- package/dist/infra/planner.mjs +137 -104
- package/dist/infra/planner.mjs.map +1 -1
- package/dist/infra/port-ownership.cjs +57 -0
- package/dist/infra/port-ownership.cjs.map +1 -0
- package/dist/infra/port-ownership.mjs +57 -0
- package/dist/infra/port-ownership.mjs.map +1 -0
- package/dist/infra/preflight.cjs +45 -33
- package/dist/infra/preflight.cjs.map +1 -1
- package/dist/infra/preflight.d.cts +1 -0
- package/dist/infra/preflight.d.mts +1 -0
- package/dist/infra/preflight.mjs +46 -34
- package/dist/infra/preflight.mjs.map +1 -1
- package/dist/infra/types.cjs.map +1 -1
- package/dist/infra/types.d.cts +2 -0
- package/dist/infra/types.d.mts +2 -0
- package/dist/infra/types.mjs.map +1 -1
- package/dist/integrity.cjs +50 -61
- package/dist/integrity.cjs.map +1 -1
- package/dist/integrity.d.cts +16 -10
- package/dist/integrity.d.mts +16 -10
- package/dist/integrity.mjs +50 -59
- package/dist/integrity.mjs.map +1 -1
- package/dist/internal/manifest-normalizer.cjs +8 -2
- package/dist/internal/manifest-normalizer.cjs.map +1 -1
- package/dist/internal/manifest-normalizer.mjs +9 -3
- package/dist/internal/manifest-normalizer.mjs.map +1 -1
- package/dist/merge.cjs +19 -1
- package/dist/merge.cjs.map +1 -1
- package/dist/merge.d.cts +1 -1
- package/dist/merge.d.mts +1 -1
- package/dist/merge.mjs +19 -2
- package/dist/merge.mjs.map +1 -1
- package/dist/mf.cjs +190 -3
- package/dist/mf.cjs.map +1 -1
- package/dist/mf.d.cts +24 -2
- package/dist/mf.d.mts +24 -2
- package/dist/mf.mjs +189 -4
- package/dist/mf.mjs.map +1 -1
- package/dist/near-cli.cjs +59 -91
- package/dist/near-cli.cjs.map +1 -1
- package/dist/near-cli.mjs +58 -90
- package/dist/near-cli.mjs.map +1 -1
- package/dist/near-signer.cjs +73 -0
- package/dist/near-signer.cjs.map +1 -0
- package/dist/near-signer.mjs +70 -0
- package/dist/near-signer.mjs.map +1 -0
- package/dist/network.cjs +0 -1
- package/dist/network.cjs.map +1 -1
- package/dist/orchestrator.cjs +256 -87
- package/dist/orchestrator.cjs.map +1 -1
- package/dist/orchestrator.mjs +248 -87
- package/dist/orchestrator.mjs.map +1 -1
- package/dist/platform-deploy.cjs +81 -0
- package/dist/platform-deploy.cjs.map +1 -0
- package/dist/platform-deploy.mjs +80 -0
- package/dist/platform-deploy.mjs.map +1 -0
- package/dist/plugin.cjs +54 -1389
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +6 -896
- package/dist/plugin.d.mts +6 -896
- package/dist/plugin.mjs +53 -1387
- package/dist/plugin.mjs.map +1 -1
- package/dist/process-kill.cjs +44 -0
- package/dist/process-kill.cjs.map +1 -0
- package/dist/process-kill.mjs +43 -0
- package/dist/process-kill.mjs.map +1 -0
- package/dist/process-registry.cjs +64 -9
- package/dist/process-registry.cjs.map +1 -1
- package/dist/process-registry.mjs +61 -10
- package/dist/process-registry.mjs.map +1 -1
- package/dist/progress.cjs +45 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.d.cts +13 -0
- package/dist/progress.d.mts +13 -0
- package/dist/progress.mjs +42 -0
- package/dist/progress.mjs.map +1 -0
- package/dist/publish.cjs +513 -79
- package/dist/publish.cjs.map +1 -1
- package/dist/publish.mjs +515 -82
- package/dist/publish.mjs.map +1 -1
- package/dist/registry-use.cjs +41 -0
- package/dist/registry-use.cjs.map +1 -0
- package/dist/registry-use.mjs +40 -0
- package/dist/registry-use.mjs.map +1 -0
- package/dist/resolution/session.cjs +335 -0
- package/dist/resolution/session.cjs.map +1 -0
- package/dist/resolution/session.d.cts +105 -0
- package/dist/resolution/session.d.mts +105 -0
- package/dist/resolution/session.mjs +331 -0
- package/dist/resolution/session.mjs.map +1 -0
- package/dist/rollback.cjs +131 -0
- package/dist/rollback.cjs.map +1 -0
- package/dist/rollback.mjs +128 -0
- package/dist/rollback.mjs.map +1 -0
- package/dist/sdk.cjs +7 -7
- package/dist/sdk.d.cts +3 -3
- package/dist/sdk.d.mts +3 -3
- package/dist/sdk.mjs +2 -2
- package/dist/service-descriptor.cjs +67 -34
- package/dist/service-descriptor.cjs.map +1 -1
- package/dist/service-descriptor.d.cts +4 -1
- package/dist/service-descriptor.d.mts +3 -0
- package/dist/service-descriptor.mjs +63 -35
- package/dist/service-descriptor.mjs.map +1 -1
- package/dist/shared-deps.cjs +17 -16
- package/dist/shared-deps.cjs.map +1 -1
- package/dist/shared-deps.mjs +17 -16
- package/dist/shared-deps.mjs.map +1 -1
- package/dist/start-config-source.cjs +24 -0
- package/dist/start-config-source.cjs.map +1 -0
- package/dist/start-config-source.d.cts +29 -0
- package/dist/start-config-source.d.mts +29 -0
- package/dist/start-config-source.mjs +22 -0
- package/dist/start-config-source.mjs.map +1 -0
- package/dist/storage-upload.cjs +145 -0
- package/dist/storage-upload.cjs.map +1 -0
- package/dist/storage-upload.mjs +143 -0
- package/dist/storage-upload.mjs.map +1 -0
- package/dist/types.cjs +126 -20
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +867 -585
- package/dist/types.d.mts +867 -585
- package/dist/types.mjs +307 -208
- package/dist/types.mjs.map +1 -1
- package/dist/ui/api.cjs +105 -0
- package/dist/ui/api.cjs.map +1 -0
- package/dist/ui/api.d.cts +31 -0
- package/dist/ui/api.d.mts +31 -0
- package/dist/ui/api.mjs +99 -0
- package/dist/ui/api.mjs.map +1 -0
- package/dist/ui/auth-guards.cjs +50 -0
- package/dist/ui/auth-guards.cjs.map +1 -0
- package/dist/ui/auth-guards.d.cts +39 -0
- package/dist/ui/auth-guards.d.mts +39 -0
- package/dist/ui/auth-guards.mjs +48 -0
- package/dist/ui/auth-guards.mjs.map +1 -0
- package/dist/ui/auth.cjs +197 -0
- package/dist/ui/auth.cjs.map +1 -0
- package/dist/ui/auth.d.cts +56 -0
- package/dist/ui/auth.d.mts +56 -0
- package/dist/ui/auth.mjs +179 -0
- package/dist/ui/auth.mjs.map +1 -0
- package/dist/ui/entry.cjs +16 -0
- package/dist/ui/entry.cjs.map +1 -0
- package/dist/ui/entry.d.cts +12 -0
- package/dist/ui/entry.d.mts +12 -0
- package/dist/ui/entry.mjs +15 -0
- package/dist/ui/entry.mjs.map +1 -0
- package/dist/ui/head.cjs +14 -7
- package/dist/ui/head.cjs.map +1 -1
- package/dist/ui/head.mjs +15 -7
- package/dist/ui/head.mjs.map +1 -1
- package/dist/ui/hydrate.cjs +265 -0
- package/dist/ui/hydrate.cjs.map +1 -0
- package/dist/ui/hydrate.d.cts +48 -0
- package/dist/ui/hydrate.d.mts +48 -0
- package/dist/ui/hydrate.mjs +263 -0
- package/dist/ui/hydrate.mjs.map +1 -0
- package/dist/ui/i18n.cjs +153 -0
- package/dist/ui/i18n.cjs.map +1 -0
- package/dist/ui/i18n.d.cts +29 -0
- package/dist/ui/i18n.d.mts +29 -0
- package/dist/ui/i18n.mjs +140 -0
- package/dist/ui/i18n.mjs.map +1 -0
- package/dist/ui/index.cjs +19 -1
- package/dist/ui/index.d.cts +6 -3
- package/dist/ui/index.d.mts +6 -3
- package/dist/ui/index.mjs +5 -2
- package/dist/ui/locale.cjs +53 -0
- package/dist/ui/locale.cjs.map +1 -0
- package/dist/ui/locale.d.cts +18 -0
- package/dist/ui/locale.d.mts +18 -0
- package/dist/ui/locale.mjs +49 -0
- package/dist/ui/locale.mjs.map +1 -0
- package/dist/ui/manifest/index.cjs +25 -0
- package/dist/ui/manifest/index.cjs.map +1 -0
- package/dist/ui/manifest/index.d.cts +9 -0
- package/dist/ui/manifest/index.d.mts +9 -0
- package/dist/ui/manifest/index.mjs +13 -0
- package/dist/ui/manifest/index.mjs.map +1 -0
- package/dist/ui/manifest-generator.cjs +8 -0
- package/dist/ui/manifest-generator.d.cts +1 -0
- package/dist/ui/manifest-generator.d.mts +1 -0
- package/dist/ui/manifest-generator.mjs +3 -0
- package/dist/ui/message-catalogs.cjs +8 -0
- package/dist/ui/message-catalogs.cjs.map +1 -0
- package/dist/ui/message-catalogs.d.cts +5 -0
- package/dist/ui/message-catalogs.d.mts +5 -0
- package/dist/ui/message-catalogs.mjs +8 -0
- package/dist/ui/message-catalogs.mjs.map +1 -0
- package/dist/ui/metadata.cjs +0 -1
- package/dist/ui/metadata.cjs.map +1 -1
- package/dist/ui/metadata.d.cts +1 -1
- package/dist/ui/metadata.d.mts +1 -1
- package/dist/ui/plugin-path.cjs +37 -0
- package/dist/ui/plugin-path.cjs.map +1 -0
- package/dist/ui/plugin-path.d.cts +25 -0
- package/dist/ui/plugin-path.d.mts +25 -0
- package/dist/ui/plugin-path.mjs +35 -0
- package/dist/ui/plugin-path.mjs.map +1 -0
- package/dist/ui/router-client.cjs +61 -0
- package/dist/ui/router-client.cjs.map +1 -0
- package/dist/ui/router-client.d.cts +20 -0
- package/dist/ui/router-client.d.mts +20 -0
- package/dist/ui/router-client.mjs +60 -0
- package/dist/ui/router-client.mjs.map +1 -0
- package/dist/ui/router-defaults.cjs +48 -0
- package/dist/ui/router-defaults.cjs.map +1 -0
- package/dist/ui/router-defaults.d.cts +8 -0
- package/dist/ui/router-defaults.d.mts +8 -0
- package/dist/ui/router-defaults.mjs +45 -0
- package/dist/ui/router-defaults.mjs.map +1 -0
- package/dist/ui/router-error.cjs +70 -0
- package/dist/ui/router-error.cjs.map +1 -0
- package/dist/ui/router-error.d.cts +19 -0
- package/dist/ui/router-error.d.mts +19 -0
- package/dist/ui/router-error.mjs +69 -0
- package/dist/ui/router-error.mjs.map +1 -0
- package/dist/ui/router-server.cjs +153 -0
- package/dist/ui/router-server.cjs.map +1 -0
- package/dist/ui/router-server.d.cts +38 -0
- package/dist/ui/router-server.d.mts +38 -0
- package/dist/ui/router-server.mjs +152 -0
- package/dist/ui/router-server.mjs.map +1 -0
- package/dist/ui/router.cjs +4 -16
- package/dist/ui/router.cjs.map +1 -1
- package/dist/ui/router.mjs +4 -15
- package/dist/ui/router.mjs.map +1 -1
- package/dist/ui/runtime.cjs +5 -1
- package/dist/ui/runtime.cjs.map +1 -1
- package/dist/ui/runtime.d.cts +2 -1
- package/dist/ui/runtime.d.mts +2 -1
- package/dist/ui/runtime.mjs +5 -1
- package/dist/ui/runtime.mjs.map +1 -1
- package/dist/ui/slot.cjs +34 -0
- package/dist/ui/slot.cjs.map +1 -0
- package/dist/ui/slot.d.cts +43 -0
- package/dist/ui/slot.d.mts +43 -0
- package/dist/ui/slot.mjs +34 -0
- package/dist/ui/slot.mjs.map +1 -0
- package/dist/ui/tenant.cjs +300 -0
- package/dist/ui/tenant.cjs.map +1 -0
- package/dist/ui/tenant.d.cts +122 -0
- package/dist/ui/tenant.d.mts +122 -0
- package/dist/ui/tenant.mjs +279 -0
- package/dist/ui/tenant.mjs.map +1 -0
- package/dist/ui/types.d.cts +32 -2
- package/dist/ui/types.d.mts +32 -2
- package/dist/ui/version-check.cjs +47 -0
- package/dist/ui/version-check.cjs.map +1 -0
- package/dist/ui/version-check.d.cts +23 -0
- package/dist/ui/version-check.d.mts +23 -0
- package/dist/ui/version-check.mjs +46 -0
- package/dist/ui/version-check.mjs.map +1 -0
- package/dist/utils/banner.cjs +2 -2
- package/dist/utils/banner.cjs.map +1 -1
- package/dist/utils/banner.mjs +2 -2
- package/dist/utils/banner.mjs.map +1 -1
- package/dist/utils/linkify.cjs +1 -1
- package/dist/utils/linkify.cjs.map +1 -1
- package/dist/utils/linkify.mjs +1 -0
- package/dist/utils/linkify.mjs.map +1 -1
- package/dist/utils/run.cjs +6 -6
- package/dist/utils/run.cjs.map +1 -1
- package/dist/utils/run.mjs +6 -6
- package/dist/utils/run.mjs.map +1 -1
- package/dist/utils/save-config.cjs +12 -0
- package/dist/utils/save-config.cjs.map +1 -1
- package/dist/utils/save-config.mjs +12 -0
- package/dist/utils/save-config.mjs.map +1 -1
- package/dist/utils/snapshot-hash.cjs +10 -0
- package/dist/utils/snapshot-hash.cjs.map +1 -0
- package/dist/utils/snapshot-hash.mjs +10 -0
- package/dist/utils/snapshot-hash.mjs.map +1 -0
- package/dist/utils/string.cjs +0 -1
- package/dist/utils/string.cjs.map +1 -1
- package/dist/utils/theme.cjs +30 -12
- package/dist/utils/theme.cjs.map +1 -1
- package/dist/utils/theme.mjs +30 -11
- package/dist/utils/theme.mjs.map +1 -1
- package/dist/version-manifest-deploy.cjs +50 -0
- package/dist/version-manifest-deploy.cjs.map +1 -0
- package/dist/version-manifest-deploy.mjs +49 -0
- package/dist/version-manifest-deploy.mjs.map +1 -0
- package/dist/version-manifest-resolve.cjs +42 -0
- package/dist/version-manifest-resolve.cjs.map +1 -0
- package/dist/version-manifest-resolve.d.cts +38 -0
- package/dist/version-manifest-resolve.d.mts +38 -0
- package/dist/version-manifest-resolve.mjs +40 -0
- package/dist/version-manifest-resolve.mjs.map +1 -0
- package/dist/version-status.cjs +18 -0
- package/dist/version-status.cjs.map +1 -0
- package/dist/version-status.d.cts +22 -0
- package/dist/version-status.d.mts +22 -0
- package/dist/version-status.mjs +17 -0
- package/dist/version-status.mjs.map +1 -0
- package/dist/workspace-catalog.cjs +53 -0
- package/dist/workspace-catalog.cjs.map +1 -0
- package/dist/workspace-catalog.mjs +51 -0
- package/dist/workspace-catalog.mjs.map +1 -0
- package/dist/workspace.cjs +237 -0
- package/dist/workspace.cjs.map +1 -0
- package/dist/workspace.mjs +233 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +179 -27
- package/skills/add-a-route/SKILL.md +132 -0
- package/skills/api-and-auth/SKILL.md +87 -21
- package/skills/api-and-auth/references/middleware.md +1 -1
- package/skills/cli-reference/SKILL.md +48 -21
- package/skills/code-style/SKILL.md +8 -0
- package/skills/dev-workflow/SKILL.md +50 -26
- package/skills/extends-config/SKILL.md +31 -19
- package/skills/init-upgrade/SKILL.md +29 -16
- package/skills/plugin-development/SKILL.md +46 -112
- package/skills/plugin-development/references/database.md +82 -0
- package/skills/plugin-development/references/request-context.md +67 -0
- package/skills/publish-sync/SKILL.md +99 -22
- package/skills/registry/SKILL.md +82 -0
- package/skills/super-app/SKILL.md +25 -15
- package/skills/talk-to-the-app/SKILL.md +138 -0
- package/skills/ui-integration/SKILL.md +93 -11
- package/dist/cli/db-studio.cjs +0 -131
- package/dist/cli/db-studio.cjs.map +0 -1
- package/dist/cli/db-studio.mjs +0 -127
- package/dist/cli/db-studio.mjs.map +0 -1
- package/dist/cli/init.d.cts.map +0 -1
- package/dist/cli/init.d.mts.map +0 -1
- package/dist/components/dev-view.cjs +0 -309
- package/dist/components/dev-view.cjs.map +0 -1
- package/dist/components/dev-view.mjs +0 -309
- package/dist/components/dev-view.mjs.map +0 -1
- package/dist/components/streaming-view.cjs +0 -134
- package/dist/components/streaming-view.cjs.map +0 -1
- package/dist/components/streaming-view.mjs +0 -132
- package/dist/components/streaming-view.mjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/contract.d.cts.map +0 -1
- package/dist/contract.d.mts.map +0 -1
- package/dist/contract.meta.d.cts.map +0 -1
- package/dist/contract.meta.d.mts.map +0 -1
- package/dist/dag.d.cts.map +0 -1
- package/dist/dag.d.mts.map +0 -1
- package/dist/db.cjs +0 -81
- package/dist/db.cjs.map +0 -1
- package/dist/db.d.cts +0 -30
- package/dist/db.d.cts.map +0 -1
- package/dist/db.d.mts +0 -30
- package/dist/db.d.mts.map +0 -1
- package/dist/db.mjs +0 -75
- package/dist/db.mjs.map +0 -1
- package/dist/fastkv.d.cts.map +0 -1
- package/dist/fastkv.d.mts.map +0 -1
- package/dist/integrity.d.cts.map +0 -1
- package/dist/integrity.d.mts.map +0 -1
- package/dist/merge.d.cts.map +0 -1
- package/dist/merge.d.mts.map +0 -1
- package/dist/mf.d.cts.map +0 -1
- package/dist/mf.d.mts.map +0 -1
- package/dist/plugin.d.cts.map +0 -1
- package/dist/plugin.d.mts.map +0 -1
- package/dist/service-descriptor.d.cts.map +0 -1
- package/dist/service-descriptor.d.mts.map +0 -1
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/ui/head.d.cts.map +0 -1
- package/dist/ui/head.d.mts.map +0 -1
- package/dist/ui/metadata.d.cts.map +0 -1
- package/dist/ui/metadata.d.mts.map +0 -1
- package/dist/ui/router.d.cts.map +0 -1
- package/dist/ui/router.d.mts.map +0 -1
- package/dist/ui/runtime.d.cts.map +0 -1
- package/dist/ui/runtime.d.mts.map +0 -1
- package/dist/ui/types.d.cts.map +0 -1
- package/dist/ui/types.d.mts.map +0 -1
package/dist/fastkv.mjs
CHANGED
|
@@ -4,29 +4,34 @@ import { fetchJsonOrNull } from "./http-client.mjs";
|
|
|
4
4
|
function getNetworkIdForAccount(accountId) {
|
|
5
5
|
return accountId.endsWith(".testnet") ? "testnet" : "mainnet";
|
|
6
6
|
}
|
|
7
|
+
const FASTKV_TESTNET_URL = "https://kv.test.fastnear.com";
|
|
8
|
+
const FASTKV_MAINNET_URL = "https://kv.main.fastnear.com";
|
|
9
|
+
const REGISTRY_NAMESPACE_TESTNET = "dev.allthethings.testnet";
|
|
10
|
+
const REGISTRY_NAMESPACE_MAINNET = "dev.everything.near";
|
|
7
11
|
function getFastKvBaseUrlForNetwork(network) {
|
|
8
|
-
return network === "testnet" ?
|
|
12
|
+
return network === "testnet" ? FASTKV_TESTNET_URL : FASTKV_MAINNET_URL;
|
|
9
13
|
}
|
|
10
14
|
function getFastKvBaseUrlForAccount(accountId) {
|
|
11
15
|
return getNetworkIdForAccount(accountId) === "testnet" ? getFastKvBaseUrlForNetwork("testnet") : getFastKvBaseUrlForNetwork("mainnet");
|
|
12
16
|
}
|
|
13
|
-
function buildRegistryConfigUrl(accountId, gatewayId) {
|
|
17
|
+
function buildRegistryConfigUrl(accountId, gatewayId, registry) {
|
|
14
18
|
const baseUrl = getFastKvBaseUrlForAccount(accountId);
|
|
15
|
-
const namespace = getRegistryNamespaceForAccount(accountId);
|
|
19
|
+
const namespace = getRegistryNamespaceForAccount(accountId, registry);
|
|
16
20
|
const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));
|
|
17
21
|
return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;
|
|
18
22
|
}
|
|
19
|
-
function buildRegistryConfigUrlForNetwork(network, accountId, gatewayId) {
|
|
23
|
+
function buildRegistryConfigUrlForNetwork(network, accountId, gatewayId, registry) {
|
|
20
24
|
const baseUrl = getFastKvBaseUrlForNetwork(network);
|
|
21
|
-
const namespace = getRegistryNamespaceForNetwork(network);
|
|
25
|
+
const namespace = getRegistryNamespaceForNetwork(network, registry);
|
|
22
26
|
const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));
|
|
23
27
|
return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;
|
|
24
28
|
}
|
|
25
|
-
function getRegistryNamespaceForAccount(accountId) {
|
|
26
|
-
return accountId
|
|
29
|
+
function getRegistryNamespaceForAccount(accountId, registry) {
|
|
30
|
+
return registry ?? getRegistryNamespaceForNetwork(getNetworkIdForAccount(accountId));
|
|
27
31
|
}
|
|
28
|
-
function getRegistryNamespaceForNetwork(network) {
|
|
29
|
-
|
|
32
|
+
function getRegistryNamespaceForNetwork(network, registry) {
|
|
33
|
+
if (registry) return registry;
|
|
34
|
+
return network === "testnet" ? REGISTRY_NAMESPACE_TESTNET : REGISTRY_NAMESPACE_MAINNET;
|
|
30
35
|
}
|
|
31
36
|
function getRegistryConfigKey(accountId, gatewayId, pathSegments = []) {
|
|
32
37
|
return `apps/${accountId}/${gatewayId}${pathSegments.length > 0 ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join("/")}` : ""}/bos.config.json`;
|
|
@@ -44,17 +49,57 @@ function parseBosUrl(bosUrl) {
|
|
|
44
49
|
pathSegments: pathSegmentsTail
|
|
45
50
|
};
|
|
46
51
|
}
|
|
47
|
-
async function fetchBosConfigFromFastKv(bosUrl) {
|
|
52
|
+
async function fetchBosConfigFromFastKv(bosUrl, registry) {
|
|
48
53
|
const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);
|
|
49
54
|
const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));
|
|
50
|
-
const value = (await fetchJson(`${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}/${key}`))?.entries?.find(Boolean)?.value;
|
|
55
|
+
const value = (await fetchJson(`${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId, registry))}/${encodeURIComponent(accountId)}/${key}`))?.entries?.find(Boolean)?.value;
|
|
51
56
|
if (!value) throw new Error(`No config found for ${bosUrl}`);
|
|
52
57
|
if (typeof value === "string") return JSON.parse(value);
|
|
53
58
|
if (typeof value !== "object") throw new Error(`Invalid config value for ${bosUrl}`);
|
|
54
59
|
return value;
|
|
55
60
|
}
|
|
61
|
+
const FASTKV_HISTORY_MAX_LIMIT = 200;
|
|
62
|
+
/**
|
|
63
|
+
* Publish history for the registry config key (atomic-deploys 11): the
|
|
64
|
+
* exact-key variant of FastData's history endpoint, newest-first. The API
|
|
65
|
+
* caps a page at 200 rows; a config key's write history fits well inside
|
|
66
|
+
* that, so a single request is the whole story (the limit param is clamped).
|
|
67
|
+
*/
|
|
68
|
+
async function fetchConfigHistory(opts) {
|
|
69
|
+
const key = encodeURIComponent(getRegistryConfigKey(opts.accountId, opts.gatewayId));
|
|
70
|
+
const limit = Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT));
|
|
71
|
+
return ((await fetchJson(`${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}/${key}?limit=${limit}`))?.entries ?? []).filter(Boolean).map((entry) => ({
|
|
72
|
+
blockHeight: entry.block_height ?? 0,
|
|
73
|
+
blockTimestampNs: String(entry.block_timestamp ?? ""),
|
|
74
|
+
...entry.tx_hash ? { txHash: entry.tx_hash } : {},
|
|
75
|
+
value: typeof entry.value === "string" && entry.value.length > 0 ? JSON.parse(entry.value) : entry.value
|
|
76
|
+
})).sort((a, b) => b.blockHeight - a.blockHeight);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The per-deploy audit trail (atomic-deploys 03/12): every publish writes
|
|
80
|
+
* `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer
|
|
81
|
+
* swap — this lists that key family newest-first via the history-by-prefix
|
|
82
|
+
* endpoint.
|
|
83
|
+
*/
|
|
84
|
+
async function fetchDeployManifests(opts) {
|
|
85
|
+
const keyPrefix = encodeURIComponent(`${getRegistryConfigKey(opts.accountId, opts.gatewayId).replace(/bos\.config\.json$/, "")}manifests/`);
|
|
86
|
+
return ((await fetchJson(`${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
body: JSON.stringify({
|
|
89
|
+
key_prefix: decodeURIComponent(keyPrefix),
|
|
90
|
+
asc: false,
|
|
91
|
+
limit: Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT))
|
|
92
|
+
})
|
|
93
|
+
}))?.entries ?? []).filter(Boolean).map((entry) => ({
|
|
94
|
+
key: entry.key ?? "",
|
|
95
|
+
blockHeight: entry.block_height ?? 0,
|
|
96
|
+
blockTimestampNs: String(entry.block_timestamp ?? ""),
|
|
97
|
+
value: typeof entry.value === "string" && entry.value.length > 0 ? JSON.parse(entry.value) : entry.value
|
|
98
|
+
})).sort((a, b) => b.blockHeight - a.blockHeight);
|
|
99
|
+
}
|
|
56
100
|
async function fetchRemotePluginManifest(cdnUrl) {
|
|
57
|
-
|
|
101
|
+
const baseUrl = cdnUrl.replace(/\/$/, "");
|
|
102
|
+
return fetchJsonOrNull(`${baseUrl}/plugin.manifest.json`, { retries: 2 });
|
|
58
103
|
}
|
|
59
104
|
async function fetchJson(url, init) {
|
|
60
105
|
const headers = {
|
|
@@ -71,5 +116,5 @@ async function fetchJson(url, init) {
|
|
|
71
116
|
}
|
|
72
117
|
|
|
73
118
|
//#endregion
|
|
74
|
-
export { buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
|
|
119
|
+
export { buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchConfigHistory, fetchDeployManifests, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
|
|
75
120
|
//# sourceMappingURL=fastkv.mjs.map
|
package/dist/fastkv.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastkv.mjs","names":[],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nimport { fetchJsonOrNull } from \"./http-client\";\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_URL || \"https://kv.test.fastnear.com\"\n : process.env.REGISTRY_FASTKV_MAINNET_URL || \"https://kv.main.fastnear.com\";\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(accountId: string, gatewayId: string): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string): string {\n return accountId.endsWith(\".testnet\")\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nexport function parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const strippedUrl = bosUrl.split(\"#\")[0];\n const match = strippedUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}/${key}`,\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nexport interface PluginManifest {\n schemaVersion: number;\n kind: string;\n plugin: { name: string; version: string };\n runtime: { remoteEntry: string };\n contract: {\n kind: string;\n types: { path: string; exportName: string; typeName: string; sha256: string };\n };\n additionalExports?: Array<{ path: string; exports: string[]; sha256: string }>;\n}\n\nexport async function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null> {\n const baseUrl = cdnUrl.replace(/\\/$/, \"\");\n return fetchJsonOrNull<PluginManifest>(`${baseUrl}/plugin.manifest.json`, { retries: 0 });\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers as Record<string, string> | undefined),\n };\n return fetchJsonOrNull<T>(url, {\n method: init?.method,\n headers,\n body: init?.body ?? undefined,\n retries: 3,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fastkv.mjs","names":[],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nimport { fetchJsonOrNull } from \"./http-client\";\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nconst FASTKV_TESTNET_URL = \"https://kv.test.fastnear.com\";\nconst FASTKV_MAINNET_URL = \"https://kv.main.fastnear.com\";\nconst REGISTRY_NAMESPACE_TESTNET = \"dev.allthethings.testnet\";\nconst REGISTRY_NAMESPACE_MAINNET = \"dev.everything.near\";\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\" ? FASTKV_TESTNET_URL : FASTKV_MAINNET_URL;\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(\n accountId: string,\n gatewayId: string,\n registry?: string,\n): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId, registry);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n registry?: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network, registry);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string, registry?: string): string {\n return registry ?? getRegistryNamespaceForNetwork(getNetworkIdForAccount(accountId));\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId, registry?: string): string {\n if (registry) return registry;\n return network === \"testnet\" ? REGISTRY_NAMESPACE_TESTNET : REGISTRY_NAMESPACE_MAINNET;\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nexport function parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const strippedUrl = bosUrl.split(\"#\")[0]!;\n const match = strippedUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string, registry?: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId, registry))}/${encodeURIComponent(accountId)}/${key}`,\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nexport interface ConfigHistoryEntry {\n blockHeight: number;\n blockTimestampNs: string;\n txHash?: string;\n value: unknown;\n}\n\ninterface FastKvHistoryEntry {\n block_height?: number;\n block_timestamp?: string | number;\n tx_hash?: string;\n value?: unknown;\n}\n\ninterface FastKvHistoryResponse {\n entries?: Array<FastKvHistoryEntry | null>;\n}\n\nconst FASTKV_HISTORY_MAX_LIMIT = 200;\n\n/**\n * Publish history for the registry config key (atomic-deploys 11): the\n * exact-key variant of FastData's history endpoint, newest-first. The API\n * caps a page at 200 rows; a config key's write history fits well inside\n * that, so a single request is the whole story (the limit param is clamped).\n */\nexport async function fetchConfigHistory(opts: {\n accountId: string;\n gatewayId: string;\n registry?: string;\n limit?: number;\n}): Promise<ConfigHistoryEntry[]> {\n const key = encodeURIComponent(getRegistryConfigKey(opts.accountId, opts.gatewayId));\n const limit = Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT));\n const url = `${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}/${key}?limit=${limit}`;\n const payload = await fetchJson<FastKvHistoryResponse>(url);\n const entries = (payload?.entries ?? []).filter(Boolean) as FastKvHistoryEntry[];\n\n return entries\n .map((entry) => ({\n blockHeight: entry.block_height ?? 0,\n blockTimestampNs: String(entry.block_timestamp ?? \"\"),\n ...(entry.tx_hash ? { txHash: entry.tx_hash } : {}),\n value:\n typeof entry.value === \"string\" && entry.value.length > 0\n ? (JSON.parse(entry.value) as unknown)\n : entry.value,\n }))\n .sort((a, b) => b.blockHeight - a.blockHeight);\n}\n\nexport interface DeployManifestEntry {\n key: string;\n blockHeight: number;\n blockTimestampNs: string;\n value: unknown;\n}\n\n/**\n * The per-deploy audit trail (atomic-deploys 03/12): every publish writes\n * `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer\n * swap — this lists that key family newest-first via the history-by-prefix\n * endpoint.\n */\nexport async function fetchDeployManifests(opts: {\n accountId: string;\n gatewayId: string;\n registry?: string;\n limit?: number;\n}): Promise<DeployManifestEntry[]> {\n const keyPrefix = encodeURIComponent(\n `${getRegistryConfigKey(opts.accountId, opts.gatewayId).replace(/bos\\.config\\.json$/, \"\")}manifests/`,\n );\n const url = `${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}`;\n const payload = await fetchJson<FastKvHistoryResponse>(url, {\n method: \"POST\",\n body: JSON.stringify({\n key_prefix: decodeURIComponent(keyPrefix),\n asc: false,\n limit: Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT)),\n }),\n });\n const entries = (payload?.entries ?? []).filter(Boolean) as Array<\n FastKvHistoryEntry & { key?: string }\n >;\n\n return entries\n .map((entry) => ({\n key: entry.key ?? \"\",\n blockHeight: entry.block_height ?? 0,\n blockTimestampNs: String(entry.block_timestamp ?? \"\"),\n value:\n typeof entry.value === \"string\" && entry.value.length > 0\n ? (JSON.parse(entry.value) as unknown)\n : entry.value,\n }))\n .sort((a, b) => b.blockHeight - a.blockHeight);\n}\n\nexport interface PluginManifest {\n schemaVersion: number;\n kind: string;\n plugin: { name: string; version: string };\n runtime: { remoteEntry: string };\n contract: {\n kind: string;\n types: { path: string; exportName: string; typeName: string; sha256: string };\n };\n additionalExports?: Array<{ path: string; exports: string[]; sha256: string }>;\n}\n\nexport async function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null> {\n const baseUrl = cdnUrl.replace(/\\/$/, \"\");\n return fetchJsonOrNull<PluginManifest>(`${baseUrl}/plugin.manifest.json`, { retries: 2 });\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers as Record<string, string> | undefined),\n };\n return fetchJsonOrNull<T>(url, {\n method: init?.method,\n headers,\n body: init?.body ?? undefined,\n retries: 3,\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
let node_crypto = require("node:crypto");
|
|
3
|
+
|
|
4
|
+
//#region src/fingerprint.ts
|
|
5
|
+
/**
|
|
6
|
+
* The published pointer's version identity (atomic-deploys 08/12): a hash
|
|
7
|
+
* over every slot's `pin` — cheap to compute (no version-manifest fetch), and
|
|
8
|
+
* stable exactly when the deployed set is. Shared so the CLI and the host
|
|
9
|
+
* compute the same identity for the same pointer.
|
|
10
|
+
*/
|
|
11
|
+
function pointerFingerprint(config) {
|
|
12
|
+
const parts = [];
|
|
13
|
+
const slot = (prefix, s) => {
|
|
14
|
+
if (!s) return;
|
|
15
|
+
const pin = s.pin;
|
|
16
|
+
const pinPart = pin && typeof pin.manifest === "string" && typeof pin.integrity === "string" ? `${pin.manifest}:${pin.integrity}` : "";
|
|
17
|
+
const directPart = typeof s.integrity === "string" ? s.integrity : "";
|
|
18
|
+
parts.push(`${prefix}:${pinPart}:${directPart}`);
|
|
19
|
+
};
|
|
20
|
+
for (const [key, entry] of Object.entries(config.app ?? {})) {
|
|
21
|
+
slot(`app.${key}`, entry);
|
|
22
|
+
slot(`app.${key}.ui`, entry.ui);
|
|
23
|
+
}
|
|
24
|
+
for (const [key, entry] of Object.entries(config.plugins ?? {})) {
|
|
25
|
+
if (typeof entry === "string") {
|
|
26
|
+
parts.push(`plugins.${key}:${entry}`);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
slot(`plugins.${key}`, entry);
|
|
30
|
+
slot(`plugins.${key}.ui`, entry.ui);
|
|
31
|
+
}
|
|
32
|
+
return (0, node_crypto.createHash)("sha256").update(parts.join("|")).digest("hex").slice(0, 16);
|
|
33
|
+
}
|
|
34
|
+
/** Per-slot pin ids for display (slot → versioned manifest filename). */
|
|
35
|
+
function slotPins(config) {
|
|
36
|
+
const pins = {};
|
|
37
|
+
const slot = (prefix, s) => {
|
|
38
|
+
if (!s) return;
|
|
39
|
+
const manifest = s.pin?.manifest;
|
|
40
|
+
if (typeof manifest === "string") pins[prefix] = manifest;
|
|
41
|
+
};
|
|
42
|
+
for (const [key, entry] of Object.entries(config.app ?? {})) {
|
|
43
|
+
slot(`app.${key}`, entry);
|
|
44
|
+
slot(`app.${key}.ui`, entry.ui);
|
|
45
|
+
}
|
|
46
|
+
for (const [key, entry] of Object.entries(config.plugins ?? {})) {
|
|
47
|
+
if (typeof entry === "string") continue;
|
|
48
|
+
slot(`plugins.${key}`, entry);
|
|
49
|
+
slot(`plugins.${key}.ui`, entry.ui);
|
|
50
|
+
}
|
|
51
|
+
return pins;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
exports.pointerFingerprint = pointerFingerprint;
|
|
56
|
+
exports.slotPins = slotPins;
|
|
57
|
+
//# sourceMappingURL=fingerprint.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.cjs","names":["createHash"],"sources":["../src/fingerprint.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { BosConfig } from \"./types\";\n\n/**\n * The published pointer's version identity (atomic-deploys 08/12): a hash\n * over every slot's `pin` — cheap to compute (no version-manifest fetch), and\n * stable exactly when the deployed set is. Shared so the CLI and the host\n * compute the same identity for the same pointer.\n */\nexport function pointerFingerprint(config: BosConfig): string {\n const parts: Array<string> = [];\n const slot = (prefix: string, s: { pin?: unknown; integrity?: unknown } | undefined) => {\n if (!s) return;\n const pin = s.pin as { manifest?: unknown; integrity?: unknown } | undefined;\n const pinPart =\n pin && typeof pin.manifest === \"string\" && typeof pin.integrity === \"string\"\n ? `${pin.manifest}:${pin.integrity}`\n : \"\";\n const directPart = typeof s.integrity === \"string\" ? s.integrity : \"\";\n parts.push(`${prefix}:${pinPart}:${directPart}`);\n };\n for (const [key, entry] of Object.entries(config.app ?? {})) {\n slot(`app.${key}`, entry);\n slot(`app.${key}.ui`, (entry as { ui?: { pin?: unknown; integrity?: unknown } }).ui);\n }\n for (const [key, entry] of Object.entries(config.plugins ?? {})) {\n if (typeof entry === \"string\") {\n parts.push(`plugins.${key}:${entry}`);\n continue;\n }\n slot(`plugins.${key}`, entry);\n slot(`plugins.${key}.ui`, (entry as { ui?: { pin?: unknown; integrity?: unknown } }).ui);\n }\n return createHash(\"sha256\").update(parts.join(\"|\")).digest(\"hex\").slice(0, 16);\n}\n\n/** Per-slot pin ids for display (slot → versioned manifest filename). */\nexport function slotPins(config: BosConfig): Record<string, string> {\n const pins: Record<string, string> = {};\n const slot = (prefix: string, s: { pin?: unknown } | undefined) => {\n if (!s) return;\n const manifest = (s.pin as { manifest?: unknown } | undefined)?.manifest;\n if (typeof manifest === \"string\") pins[prefix] = manifest;\n };\n for (const [key, entry] of Object.entries(config.app ?? {})) {\n slot(`app.${key}`, entry);\n slot(`app.${key}.ui`, (entry as { ui?: { pin?: unknown } }).ui);\n }\n for (const [key, entry] of Object.entries(config.plugins ?? {})) {\n if (typeof entry === \"string\") continue;\n slot(`plugins.${key}`, entry);\n slot(`plugins.${key}.ui`, (entry as { ui?: { pin?: unknown } }).ui);\n }\n return pins;\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,mBAAmB,QAA2B;CAC5D,MAAM,QAAuB,CAAC;CAC9B,MAAM,QAAQ,QAAgB,MAA0D;EACtF,IAAI,CAAC,GAAG;EACR,MAAM,MAAM,EAAE;EACd,MAAM,UACJ,OAAO,OAAO,IAAI,aAAa,YAAY,OAAO,IAAI,cAAc,WAChE,GAAG,IAAI,SAAS,GAAG,IAAI,cACvB;EACN,MAAM,aAAa,OAAO,EAAE,cAAc,WAAW,EAAE,YAAY;EACnE,MAAM,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY;CACjD;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,GAAG;EAC3D,KAAK,OAAO,OAAO,KAAK;EACxB,KAAK,OAAO,IAAI,MAAO,MAA0D,EAAE;CACrF;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;EAC/D,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,KAAK,WAAW,IAAI,GAAG,OAAO;GACpC;EACF;EACA,KAAK,WAAW,OAAO,KAAK;EAC5B,KAAK,WAAW,IAAI,MAAO,MAA0D,EAAE;CACzF;CACA,WAAOA,wBAAW,QAAQ,CAAC,CAAC,OAAO,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AAC/E;;AAGA,SAAgB,SAAS,QAA2C;CAClE,MAAM,OAA+B,CAAC;CACtC,MAAM,QAAQ,QAAgB,MAAqC;EACjE,IAAI,CAAC,GAAG;EACR,MAAM,WAAY,EAAE,KAA4C;EAChE,IAAI,OAAO,aAAa,UAAU,KAAK,UAAU;CACnD;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,GAAG;EAC3D,KAAK,OAAO,OAAO,KAAK;EACxB,KAAK,OAAO,IAAI,MAAO,MAAqC,EAAE;CAChE;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;EAC/D,IAAI,OAAO,UAAU,UAAU;EAC/B,KAAK,WAAW,OAAO,KAAK;EAC5B,KAAK,WAAW,IAAI,MAAO,MAAqC,EAAE;CACpE;CACA,OAAO;AACT"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BosConfig } from "./types.cjs";
|
|
2
|
+
//#region src/fingerprint.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The published pointer's version identity (atomic-deploys 08/12): a hash
|
|
5
|
+
* over every slot's `pin` — cheap to compute (no version-manifest fetch), and
|
|
6
|
+
* stable exactly when the deployed set is. Shared so the CLI and the host
|
|
7
|
+
* compute the same identity for the same pointer.
|
|
8
|
+
*/
|
|
9
|
+
declare function pointerFingerprint(config: BosConfig): string;
|
|
10
|
+
/** Per-slot pin ids for display (slot → versioned manifest filename). */
|
|
11
|
+
declare function slotPins(config: BosConfig): Record<string, string>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { pointerFingerprint, slotPins };
|
|
14
|
+
//# sourceMappingURL=fingerprint.d.cts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BosConfig } from "./types.mjs";
|
|
2
|
+
//#region src/fingerprint.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The published pointer's version identity (atomic-deploys 08/12): a hash
|
|
5
|
+
* over every slot's `pin` — cheap to compute (no version-manifest fetch), and
|
|
6
|
+
* stable exactly when the deployed set is. Shared so the CLI and the host
|
|
7
|
+
* compute the same identity for the same pointer.
|
|
8
|
+
*/
|
|
9
|
+
declare function pointerFingerprint(config: BosConfig): string;
|
|
10
|
+
/** Per-slot pin ids for display (slot → versioned manifest filename). */
|
|
11
|
+
declare function slotPins(config: BosConfig): Record<string, string>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { pointerFingerprint, slotPins };
|
|
14
|
+
//# sourceMappingURL=fingerprint.d.mts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
//#region src/fingerprint.ts
|
|
4
|
+
/**
|
|
5
|
+
* The published pointer's version identity (atomic-deploys 08/12): a hash
|
|
6
|
+
* over every slot's `pin` — cheap to compute (no version-manifest fetch), and
|
|
7
|
+
* stable exactly when the deployed set is. Shared so the CLI and the host
|
|
8
|
+
* compute the same identity for the same pointer.
|
|
9
|
+
*/
|
|
10
|
+
function pointerFingerprint(config) {
|
|
11
|
+
const parts = [];
|
|
12
|
+
const slot = (prefix, s) => {
|
|
13
|
+
if (!s) return;
|
|
14
|
+
const pin = s.pin;
|
|
15
|
+
const pinPart = pin && typeof pin.manifest === "string" && typeof pin.integrity === "string" ? `${pin.manifest}:${pin.integrity}` : "";
|
|
16
|
+
const directPart = typeof s.integrity === "string" ? s.integrity : "";
|
|
17
|
+
parts.push(`${prefix}:${pinPart}:${directPart}`);
|
|
18
|
+
};
|
|
19
|
+
for (const [key, entry] of Object.entries(config.app ?? {})) {
|
|
20
|
+
slot(`app.${key}`, entry);
|
|
21
|
+
slot(`app.${key}.ui`, entry.ui);
|
|
22
|
+
}
|
|
23
|
+
for (const [key, entry] of Object.entries(config.plugins ?? {})) {
|
|
24
|
+
if (typeof entry === "string") {
|
|
25
|
+
parts.push(`plugins.${key}:${entry}`);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
slot(`plugins.${key}`, entry);
|
|
29
|
+
slot(`plugins.${key}.ui`, entry.ui);
|
|
30
|
+
}
|
|
31
|
+
return createHash("sha256").update(parts.join("|")).digest("hex").slice(0, 16);
|
|
32
|
+
}
|
|
33
|
+
/** Per-slot pin ids for display (slot → versioned manifest filename). */
|
|
34
|
+
function slotPins(config) {
|
|
35
|
+
const pins = {};
|
|
36
|
+
const slot = (prefix, s) => {
|
|
37
|
+
if (!s) return;
|
|
38
|
+
const manifest = s.pin?.manifest;
|
|
39
|
+
if (typeof manifest === "string") pins[prefix] = manifest;
|
|
40
|
+
};
|
|
41
|
+
for (const [key, entry] of Object.entries(config.app ?? {})) {
|
|
42
|
+
slot(`app.${key}`, entry);
|
|
43
|
+
slot(`app.${key}.ui`, entry.ui);
|
|
44
|
+
}
|
|
45
|
+
for (const [key, entry] of Object.entries(config.plugins ?? {})) {
|
|
46
|
+
if (typeof entry === "string") continue;
|
|
47
|
+
slot(`plugins.${key}`, entry);
|
|
48
|
+
slot(`plugins.${key}.ui`, entry.ui);
|
|
49
|
+
}
|
|
50
|
+
return pins;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { pointerFingerprint, slotPins };
|
|
55
|
+
//# sourceMappingURL=fingerprint.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.mjs","names":[],"sources":["../src/fingerprint.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { BosConfig } from \"./types\";\n\n/**\n * The published pointer's version identity (atomic-deploys 08/12): a hash\n * over every slot's `pin` — cheap to compute (no version-manifest fetch), and\n * stable exactly when the deployed set is. Shared so the CLI and the host\n * compute the same identity for the same pointer.\n */\nexport function pointerFingerprint(config: BosConfig): string {\n const parts: Array<string> = [];\n const slot = (prefix: string, s: { pin?: unknown; integrity?: unknown } | undefined) => {\n if (!s) return;\n const pin = s.pin as { manifest?: unknown; integrity?: unknown } | undefined;\n const pinPart =\n pin && typeof pin.manifest === \"string\" && typeof pin.integrity === \"string\"\n ? `${pin.manifest}:${pin.integrity}`\n : \"\";\n const directPart = typeof s.integrity === \"string\" ? s.integrity : \"\";\n parts.push(`${prefix}:${pinPart}:${directPart}`);\n };\n for (const [key, entry] of Object.entries(config.app ?? {})) {\n slot(`app.${key}`, entry);\n slot(`app.${key}.ui`, (entry as { ui?: { pin?: unknown; integrity?: unknown } }).ui);\n }\n for (const [key, entry] of Object.entries(config.plugins ?? {})) {\n if (typeof entry === \"string\") {\n parts.push(`plugins.${key}:${entry}`);\n continue;\n }\n slot(`plugins.${key}`, entry);\n slot(`plugins.${key}.ui`, (entry as { ui?: { pin?: unknown; integrity?: unknown } }).ui);\n }\n return createHash(\"sha256\").update(parts.join(\"|\")).digest(\"hex\").slice(0, 16);\n}\n\n/** Per-slot pin ids for display (slot → versioned manifest filename). */\nexport function slotPins(config: BosConfig): Record<string, string> {\n const pins: Record<string, string> = {};\n const slot = (prefix: string, s: { pin?: unknown } | undefined) => {\n if (!s) return;\n const manifest = (s.pin as { manifest?: unknown } | undefined)?.manifest;\n if (typeof manifest === \"string\") pins[prefix] = manifest;\n };\n for (const [key, entry] of Object.entries(config.app ?? {})) {\n slot(`app.${key}`, entry);\n slot(`app.${key}.ui`, (entry as { ui?: { pin?: unknown } }).ui);\n }\n for (const [key, entry] of Object.entries(config.plugins ?? {})) {\n if (typeof entry === \"string\") continue;\n slot(`plugins.${key}`, entry);\n slot(`plugins.${key}.ui`, (entry as { ui?: { pin?: unknown } }).ui);\n }\n return pins;\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,mBAAmB,QAA2B;CAC5D,MAAM,QAAuB,CAAC;CAC9B,MAAM,QAAQ,QAAgB,MAA0D;EACtF,IAAI,CAAC,GAAG;EACR,MAAM,MAAM,EAAE;EACd,MAAM,UACJ,OAAO,OAAO,IAAI,aAAa,YAAY,OAAO,IAAI,cAAc,WAChE,GAAG,IAAI,SAAS,GAAG,IAAI,cACvB;EACN,MAAM,aAAa,OAAO,EAAE,cAAc,WAAW,EAAE,YAAY;EACnE,MAAM,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY;CACjD;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,GAAG;EAC3D,KAAK,OAAO,OAAO,KAAK;EACxB,KAAK,OAAO,IAAI,MAAO,MAA0D,EAAE;CACrF;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;EAC/D,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,KAAK,WAAW,IAAI,GAAG,OAAO;GACpC;EACF;EACA,KAAK,WAAW,OAAO,KAAK;EAC5B,KAAK,WAAW,IAAI,MAAO,MAA0D,EAAE;CACzF;CACA,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AAC/E;;AAGA,SAAgB,SAAS,QAA2C;CAClE,MAAM,OAA+B,CAAC;CACtC,MAAM,QAAQ,QAAgB,MAAqC;EACjE,IAAI,CAAC,GAAG;EACR,MAAM,WAAY,EAAE,KAA4C;EAChE,IAAI,OAAO,aAAa,UAAU,KAAK,UAAU;CACnD;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,GAAG;EAC3D,KAAK,OAAO,OAAO,KAAK;EACxB,KAAK,OAAO,IAAI,MAAO,MAAqC,EAAE;CAChE;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;EAC/D,IAAI,OAAO,UAAU,UAAU;EAC/B,KAAK,WAAW,OAAO,KAAK;EAC5B,KAAK,WAAW,IAAI,MAAO,MAAqC,EAAE;CACpE;CACA,OAAO;AACT"}
|
package/dist/http-client.cjs
CHANGED
|
@@ -14,27 +14,24 @@ const isRetryable = (error) => {
|
|
|
14
14
|
if (error instanceof FetchHttpError) return error.status >= 500;
|
|
15
15
|
return false;
|
|
16
16
|
};
|
|
17
|
+
const runFetch = (url, init) => fetch(url, init);
|
|
17
18
|
const fetchRawEff = (url, options) => effect.Effect.tryPromise({
|
|
18
19
|
try: async () => {
|
|
19
|
-
const timeoutMs = effect.Duration.toMillis(
|
|
20
|
-
const controller = new AbortController();
|
|
21
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
20
|
+
const timeoutMs = effect.Duration.toMillis(options?.timeout ?? DEFAULT_TIMEOUT);
|
|
22
21
|
try {
|
|
23
|
-
return await
|
|
22
|
+
return await runFetch(url, {
|
|
24
23
|
method: options?.method ?? "GET",
|
|
25
24
|
headers: options?.headers,
|
|
26
25
|
body: options?.body,
|
|
27
26
|
redirect: options?.redirect,
|
|
28
|
-
signal:
|
|
27
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
29
28
|
});
|
|
30
29
|
} catch (error) {
|
|
31
|
-
if (error instanceof Error && error.name === "AbortError") throw new FetchTimeoutError({ url });
|
|
30
|
+
if (error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError")) throw new FetchTimeoutError({ url });
|
|
32
31
|
throw new FetchNetworkError({
|
|
33
32
|
url,
|
|
34
33
|
cause: error
|
|
35
34
|
});
|
|
36
|
-
} finally {
|
|
37
|
-
clearTimeout(timer);
|
|
38
35
|
}
|
|
39
36
|
},
|
|
40
37
|
catch: (error) => {
|
|
@@ -45,19 +42,22 @@ const fetchRawEff = (url, options) => effect.Effect.tryPromise({
|
|
|
45
42
|
});
|
|
46
43
|
}
|
|
47
44
|
});
|
|
48
|
-
const fetchEff = (url, options) => fetchRawEff(url, options).pipe(effect.Effect.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
const fetchEff = (url, options) => fetchRawEff(url, options).pipe(effect.Effect.filterOrFail((response) => response.ok, (response) => new FetchHttpError({
|
|
46
|
+
url,
|
|
47
|
+
status: response.status,
|
|
48
|
+
statusText: response.statusText
|
|
49
|
+
})));
|
|
50
|
+
const retrySchedule = effect.Schedule.exponential(EXPONENTIAL_BASE).pipe(effect.Schedule.upTo({
|
|
51
|
+
duration: EXPONENTIAL_CAP,
|
|
52
|
+
times: DEFAULT_RETRIES
|
|
55
53
|
}));
|
|
56
|
-
const retrySchedule = effect.Schedule.exponential(EXPONENTIAL_BASE).pipe(effect.Schedule.upTo(EXPONENTIAL_CAP), effect.Schedule.intersect(effect.Schedule.recurs(DEFAULT_RETRIES)));
|
|
57
54
|
const fetchWithRetryEff = (url, options) => {
|
|
58
55
|
const retries = options?.retries ?? DEFAULT_RETRIES;
|
|
59
56
|
if (retries <= 0) return fetchEff(url, options);
|
|
60
|
-
const schedule = options?.retries !== void 0 ? effect.Schedule.exponential(EXPONENTIAL_BASE).pipe(effect.Schedule.upTo(
|
|
57
|
+
const schedule = options?.retries !== void 0 ? effect.Schedule.exponential(EXPONENTIAL_BASE).pipe(effect.Schedule.upTo({
|
|
58
|
+
duration: EXPONENTIAL_CAP,
|
|
59
|
+
times: retries
|
|
60
|
+
})) : retrySchedule;
|
|
61
61
|
return fetchEff(url, options).pipe(effect.Effect.retry({
|
|
62
62
|
schedule,
|
|
63
63
|
while: isRetryable
|
package/dist/http-client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.cjs","names":["Data","Duration","Effect","Schedule"],"sources":["../src/http-client.ts"],"sourcesContent":["import { Data, Duration, Effect, Schedule } from \"effect\";\n\n// --- Tagged errors ---\n\nexport class FetchNetworkError extends Data.TaggedError(\"FetchNetworkError\")<{\n url: string;\n cause: unknown;\n}> {}\n\nexport class FetchTimeoutError extends Data.TaggedError(\"FetchTimeoutError\")<{\n url: string;\n}> {}\n\nexport class FetchHttpError extends Data.TaggedError(\"FetchHttpError\")<{\n url: string;\n status: number;\n statusText: string;\n}> {}\n\nexport type FetchError = FetchNetworkError | FetchTimeoutError | FetchHttpError;\n\n// --- Options ---\n\nexport interface FetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit;\n redirect?: RequestRedirect;\n timeout?: Duration.
|
|
1
|
+
{"version":3,"file":"http-client.cjs","names":["Data","Duration","Effect","Schedule"],"sources":["../src/http-client.ts"],"sourcesContent":["import { Data, Duration, Effect, Schedule } from \"effect\";\n\n// --- Tagged errors ---\n\nexport class FetchNetworkError extends Data.TaggedError(\"FetchNetworkError\")<{\n url: string;\n cause: unknown;\n}> {}\n\nexport class FetchTimeoutError extends Data.TaggedError(\"FetchTimeoutError\")<{\n url: string;\n}> {}\n\nexport class FetchHttpError extends Data.TaggedError(\"FetchHttpError\")<{\n url: string;\n status: number;\n statusText: string;\n}> {}\n\nexport type FetchError = FetchNetworkError | FetchTimeoutError | FetchHttpError;\n\n// --- Options ---\n\nexport interface FetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit;\n redirect?: RequestRedirect;\n timeout?: Duration.Input;\n}\n\nexport interface FetchWithRetryOptions extends FetchOptions {\n retries?: number;\n}\n\n// --- Defaults ---\n\nconst DEFAULT_TIMEOUT = \"10 seconds\";\nconst DEFAULT_RETRIES = 3;\n\nconst EXPONENTIAL_BASE = Duration.seconds(1);\nconst EXPONENTIAL_CAP = Duration.seconds(15);\n\n// --- Helpers ---\n\nconst isRetryable = (error: FetchError): boolean => {\n if (error instanceof FetchNetworkError) return true;\n if (error instanceof FetchTimeoutError) return true;\n if (error instanceof FetchHttpError) return error.status >= 500;\n return false;\n};\n\n// --- Low-level: just timeout + error classification, returns Response regardless of HTTP status ---\n\nconst runFetch = (url: string, init?: RequestInit): Promise<Response> => fetch(url, init);\n\nconst fetchRawEff = (\n url: string,\n options?: FetchOptions,\n): Effect.Effect<Response, FetchNetworkError | FetchTimeoutError> =>\n Effect.tryPromise({\n try: async () => {\n const timeoutMs = Duration.toMillis(options?.timeout ?? DEFAULT_TIMEOUT);\n try {\n return await runFetch(url, {\n method: options?.method ?? \"GET\",\n headers: options?.headers,\n body: options?.body,\n redirect: options?.redirect,\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n if (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n ) {\n throw new FetchTimeoutError({ url });\n }\n throw new FetchNetworkError({ url, cause: error });\n }\n },\n catch: (error) => {\n if (error instanceof FetchNetworkError || error instanceof FetchTimeoutError) {\n return error;\n }\n return new FetchNetworkError({ url, cause: error });\n },\n });\n\n// --- Adds HTTP status checking: non-2xx becomes FetchHttpError ---\n\nconst fetchEff = (url: string, options?: FetchOptions): Effect.Effect<Response, FetchError> =>\n fetchRawEff(url, options).pipe(\n Effect.filterOrFail(\n (response) => response.ok,\n (response) =>\n new FetchHttpError({ url, status: response.status, statusText: response.statusText }),\n ),\n );\n\n// --- With retry ---\n\nconst retrySchedule = Schedule.exponential(EXPONENTIAL_BASE).pipe(\n Schedule.upTo({ duration: EXPONENTIAL_CAP, times: DEFAULT_RETRIES }),\n);\n\nexport const fetchWithRetryEff = (\n url: string,\n options?: FetchWithRetryOptions,\n): Effect.Effect<Response, FetchError> => {\n const retries = options?.retries ?? DEFAULT_RETRIES;\n\n if (retries <= 0) return fetchEff(url, options);\n\n const schedule =\n options?.retries !== undefined\n ? Schedule.exponential(EXPONENTIAL_BASE).pipe(\n Schedule.upTo({ duration: EXPONENTIAL_CAP, times: retries }),\n )\n : retrySchedule;\n\n return fetchEff(url, options).pipe(\n Effect.retry({\n schedule,\n while: isRetryable,\n }),\n );\n};\n\n// --- In-memory GET cache (per-process, prevents duplicate round trips) ---\n\nconst getCache = new Map<string, { data: unknown; expiresAt: number }>();\nconst GET_CACHE_TTL_MS = 30_000;\n\nexport function clearHttpCache(): void {\n getCache.clear();\n}\n\nfunction isCacheable(_url: string, options?: FetchWithRetryOptions): boolean {\n if (options?.method && options.method !== \"GET\") return false;\n if (options?.body) return false;\n return true;\n}\n\n// --- Promise wrappers (bridge for non-Effect code) ---\n\nexport const fetchResponse = (url: string, options?: FetchOptions): Promise<Response> =>\n Effect.runPromise(fetchRawEff(url, options));\n\nexport const fetchJsonOrNull = async <T>(\n url: string,\n options?: FetchWithRetryOptions,\n): Promise<T | null> => {\n if (isCacheable(url, options)) {\n const cached = getCache.get(url);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.data as T;\n }\n }\n\n const retries = options?.retries ?? DEFAULT_RETRIES;\n const eff =\n retries > 0 ? fetchWithRetryEff(url, { ...options, retries }) : fetchEff(url, options);\n\n try {\n const res = await Effect.runPromise(eff);\n const data = (await res.json()) as T;\n if (isCacheable(url, options)) {\n getCache.set(url, { data, expiresAt: Date.now() + GET_CACHE_TTL_MS });\n }\n return data;\n } catch (error) {\n const msg =\n error instanceof FetchNetworkError\n ? `[http] Network error: ${error.url} — ${String(error.cause)}`\n : error instanceof FetchTimeoutError\n ? `[http] Timeout: ${error.url}`\n : error instanceof FetchHttpError\n ? `[http] HTTP ${error.status}: ${error.url}`\n : `[http] Unknown error while fetching ${url}`;\n console.error(msg);\n return null;\n }\n};\n"],"mappings":"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"}
|
package/dist/http-client.mjs
CHANGED
|
@@ -14,27 +14,24 @@ const isRetryable = (error) => {
|
|
|
14
14
|
if (error instanceof FetchHttpError) return error.status >= 500;
|
|
15
15
|
return false;
|
|
16
16
|
};
|
|
17
|
+
const runFetch = (url, init) => fetch(url, init);
|
|
17
18
|
const fetchRawEff = (url, options) => Effect.tryPromise({
|
|
18
19
|
try: async () => {
|
|
19
|
-
const timeoutMs = Duration.toMillis(
|
|
20
|
-
const controller = new AbortController();
|
|
21
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
20
|
+
const timeoutMs = Duration.toMillis(options?.timeout ?? DEFAULT_TIMEOUT);
|
|
22
21
|
try {
|
|
23
|
-
return await
|
|
22
|
+
return await runFetch(url, {
|
|
24
23
|
method: options?.method ?? "GET",
|
|
25
24
|
headers: options?.headers,
|
|
26
25
|
body: options?.body,
|
|
27
26
|
redirect: options?.redirect,
|
|
28
|
-
signal:
|
|
27
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
29
28
|
});
|
|
30
29
|
} catch (error) {
|
|
31
|
-
if (error instanceof Error && error.name === "AbortError") throw new FetchTimeoutError({ url });
|
|
30
|
+
if (error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError")) throw new FetchTimeoutError({ url });
|
|
32
31
|
throw new FetchNetworkError({
|
|
33
32
|
url,
|
|
34
33
|
cause: error
|
|
35
34
|
});
|
|
36
|
-
} finally {
|
|
37
|
-
clearTimeout(timer);
|
|
38
35
|
}
|
|
39
36
|
},
|
|
40
37
|
catch: (error) => {
|
|
@@ -45,19 +42,22 @@ const fetchRawEff = (url, options) => Effect.tryPromise({
|
|
|
45
42
|
});
|
|
46
43
|
}
|
|
47
44
|
});
|
|
48
|
-
const fetchEff = (url, options) => fetchRawEff(url, options).pipe(Effect.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
const fetchEff = (url, options) => fetchRawEff(url, options).pipe(Effect.filterOrFail((response) => response.ok, (response) => new FetchHttpError({
|
|
46
|
+
url,
|
|
47
|
+
status: response.status,
|
|
48
|
+
statusText: response.statusText
|
|
49
|
+
})));
|
|
50
|
+
const retrySchedule = Schedule.exponential(EXPONENTIAL_BASE).pipe(Schedule.upTo({
|
|
51
|
+
duration: EXPONENTIAL_CAP,
|
|
52
|
+
times: DEFAULT_RETRIES
|
|
55
53
|
}));
|
|
56
|
-
const retrySchedule = Schedule.exponential(EXPONENTIAL_BASE).pipe(Schedule.upTo(EXPONENTIAL_CAP), Schedule.intersect(Schedule.recurs(DEFAULT_RETRIES)));
|
|
57
54
|
const fetchWithRetryEff = (url, options) => {
|
|
58
55
|
const retries = options?.retries ?? DEFAULT_RETRIES;
|
|
59
56
|
if (retries <= 0) return fetchEff(url, options);
|
|
60
|
-
const schedule = options?.retries !== void 0 ? Schedule.exponential(EXPONENTIAL_BASE).pipe(Schedule.upTo(
|
|
57
|
+
const schedule = options?.retries !== void 0 ? Schedule.exponential(EXPONENTIAL_BASE).pipe(Schedule.upTo({
|
|
58
|
+
duration: EXPONENTIAL_CAP,
|
|
59
|
+
times: retries
|
|
60
|
+
})) : retrySchedule;
|
|
61
61
|
return fetchEff(url, options).pipe(Effect.retry({
|
|
62
62
|
schedule,
|
|
63
63
|
while: isRetryable
|
package/dist/http-client.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.mjs","names":[],"sources":["../src/http-client.ts"],"sourcesContent":["import { Data, Duration, Effect, Schedule } from \"effect\";\n\n// --- Tagged errors ---\n\nexport class FetchNetworkError extends Data.TaggedError(\"FetchNetworkError\")<{\n url: string;\n cause: unknown;\n}> {}\n\nexport class FetchTimeoutError extends Data.TaggedError(\"FetchTimeoutError\")<{\n url: string;\n}> {}\n\nexport class FetchHttpError extends Data.TaggedError(\"FetchHttpError\")<{\n url: string;\n status: number;\n statusText: string;\n}> {}\n\nexport type FetchError = FetchNetworkError | FetchTimeoutError | FetchHttpError;\n\n// --- Options ---\n\nexport interface FetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit;\n redirect?: RequestRedirect;\n timeout?: Duration.
|
|
1
|
+
{"version":3,"file":"http-client.mjs","names":[],"sources":["../src/http-client.ts"],"sourcesContent":["import { Data, Duration, Effect, Schedule } from \"effect\";\n\n// --- Tagged errors ---\n\nexport class FetchNetworkError extends Data.TaggedError(\"FetchNetworkError\")<{\n url: string;\n cause: unknown;\n}> {}\n\nexport class FetchTimeoutError extends Data.TaggedError(\"FetchTimeoutError\")<{\n url: string;\n}> {}\n\nexport class FetchHttpError extends Data.TaggedError(\"FetchHttpError\")<{\n url: string;\n status: number;\n statusText: string;\n}> {}\n\nexport type FetchError = FetchNetworkError | FetchTimeoutError | FetchHttpError;\n\n// --- Options ---\n\nexport interface FetchOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit;\n redirect?: RequestRedirect;\n timeout?: Duration.Input;\n}\n\nexport interface FetchWithRetryOptions extends FetchOptions {\n retries?: number;\n}\n\n// --- Defaults ---\n\nconst DEFAULT_TIMEOUT = \"10 seconds\";\nconst DEFAULT_RETRIES = 3;\n\nconst EXPONENTIAL_BASE = Duration.seconds(1);\nconst EXPONENTIAL_CAP = Duration.seconds(15);\n\n// --- Helpers ---\n\nconst isRetryable = (error: FetchError): boolean => {\n if (error instanceof FetchNetworkError) return true;\n if (error instanceof FetchTimeoutError) return true;\n if (error instanceof FetchHttpError) return error.status >= 500;\n return false;\n};\n\n// --- Low-level: just timeout + error classification, returns Response regardless of HTTP status ---\n\nconst runFetch = (url: string, init?: RequestInit): Promise<Response> => fetch(url, init);\n\nconst fetchRawEff = (\n url: string,\n options?: FetchOptions,\n): Effect.Effect<Response, FetchNetworkError | FetchTimeoutError> =>\n Effect.tryPromise({\n try: async () => {\n const timeoutMs = Duration.toMillis(options?.timeout ?? DEFAULT_TIMEOUT);\n try {\n return await runFetch(url, {\n method: options?.method ?? \"GET\",\n headers: options?.headers,\n body: options?.body,\n redirect: options?.redirect,\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n if (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n ) {\n throw new FetchTimeoutError({ url });\n }\n throw new FetchNetworkError({ url, cause: error });\n }\n },\n catch: (error) => {\n if (error instanceof FetchNetworkError || error instanceof FetchTimeoutError) {\n return error;\n }\n return new FetchNetworkError({ url, cause: error });\n },\n });\n\n// --- Adds HTTP status checking: non-2xx becomes FetchHttpError ---\n\nconst fetchEff = (url: string, options?: FetchOptions): Effect.Effect<Response, FetchError> =>\n fetchRawEff(url, options).pipe(\n Effect.filterOrFail(\n (response) => response.ok,\n (response) =>\n new FetchHttpError({ url, status: response.status, statusText: response.statusText }),\n ),\n );\n\n// --- With retry ---\n\nconst retrySchedule = Schedule.exponential(EXPONENTIAL_BASE).pipe(\n Schedule.upTo({ duration: EXPONENTIAL_CAP, times: DEFAULT_RETRIES }),\n);\n\nexport const fetchWithRetryEff = (\n url: string,\n options?: FetchWithRetryOptions,\n): Effect.Effect<Response, FetchError> => {\n const retries = options?.retries ?? DEFAULT_RETRIES;\n\n if (retries <= 0) return fetchEff(url, options);\n\n const schedule =\n options?.retries !== undefined\n ? Schedule.exponential(EXPONENTIAL_BASE).pipe(\n Schedule.upTo({ duration: EXPONENTIAL_CAP, times: retries }),\n )\n : retrySchedule;\n\n return fetchEff(url, options).pipe(\n Effect.retry({\n schedule,\n while: isRetryable,\n }),\n );\n};\n\n// --- In-memory GET cache (per-process, prevents duplicate round trips) ---\n\nconst getCache = new Map<string, { data: unknown; expiresAt: number }>();\nconst GET_CACHE_TTL_MS = 30_000;\n\nexport function clearHttpCache(): void {\n getCache.clear();\n}\n\nfunction isCacheable(_url: string, options?: FetchWithRetryOptions): boolean {\n if (options?.method && options.method !== \"GET\") return false;\n if (options?.body) return false;\n return true;\n}\n\n// --- Promise wrappers (bridge for non-Effect code) ---\n\nexport const fetchResponse = (url: string, options?: FetchOptions): Promise<Response> =>\n Effect.runPromise(fetchRawEff(url, options));\n\nexport const fetchJsonOrNull = async <T>(\n url: string,\n options?: FetchWithRetryOptions,\n): Promise<T | null> => {\n if (isCacheable(url, options)) {\n const cached = getCache.get(url);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.data as T;\n }\n }\n\n const retries = options?.retries ?? DEFAULT_RETRIES;\n const eff =\n retries > 0 ? fetchWithRetryEff(url, { ...options, retries }) : fetchEff(url, options);\n\n try {\n const res = await Effect.runPromise(eff);\n const data = (await res.json()) as T;\n if (isCacheable(url, options)) {\n getCache.set(url, { data, expiresAt: Date.now() + GET_CACHE_TTL_MS });\n }\n return data;\n } catch (error) {\n const msg =\n error instanceof FetchNetworkError\n ? `[http] Network error: ${error.url} — ${String(error.cause)}`\n : error instanceof FetchTimeoutError\n ? `[http] Timeout: ${error.url}`\n : error instanceof FetchHttpError\n ? `[http] HTTP ${error.status}: ${error.url}`\n : `[http] Unknown error while fetching ${url}`;\n console.error(msg);\n return null;\n }\n};\n"],"mappings":"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"}
|