@shipfox/api-runners 2.0.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/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +187 -0
- package/LICENSE +21 -0
- package/dist/config.d.ts +30 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +208 -0
- package/dist/config.js.map +1 -0
- package/dist/core/demand.d.ts +33 -0
- package/dist/core/demand.d.ts.map +1 -0
- package/dist/core/demand.js +169 -0
- package/dist/core/demand.js.map +1 -0
- package/dist/core/entities/ephemeral-registration-token.d.ts +14 -0
- package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -0
- package/dist/core/entities/ephemeral-registration-token.js +3 -0
- package/dist/core/entities/ephemeral-registration-token.js.map +1 -0
- package/dist/core/entities/manual-registration-token.d.ts +12 -0
- package/dist/core/entities/manual-registration-token.d.ts.map +1 -0
- package/dist/core/entities/manual-registration-token.js +3 -0
- package/dist/core/entities/manual-registration-token.js.map +1 -0
- package/dist/core/entities/provisioned-runner.d.ts +24 -0
- package/dist/core/entities/provisioned-runner.d.ts.map +1 -0
- package/dist/core/entities/provisioned-runner.js +3 -0
- package/dist/core/entities/provisioned-runner.js.map +1 -0
- package/dist/core/entities/provisioner-token.d.ts +18 -0
- package/dist/core/entities/provisioner-token.d.ts.map +1 -0
- package/dist/core/entities/provisioner-token.js +3 -0
- package/dist/core/entities/provisioner-token.js.map +1 -0
- package/dist/core/entities/reservation.d.ts +10 -0
- package/dist/core/entities/reservation.d.ts.map +1 -0
- package/dist/core/entities/reservation.js +3 -0
- package/dist/core/entities/reservation.js.map +1 -0
- package/dist/core/entities/runner-session.d.ts +18 -0
- package/dist/core/entities/runner-session.d.ts.map +1 -0
- package/dist/core/entities/runner-session.js +3 -0
- package/dist/core/entities/runner-session.js.map +1 -0
- package/dist/core/ephemeral-registration-tokens.d.ts +31 -0
- package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -0
- package/dist/core/ephemeral-registration-tokens.js +61 -0
- package/dist/core/ephemeral-registration-tokens.js.map +1 -0
- package/dist/core/errors.d.ts +62 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +92 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/job-executions.d.ts +14 -0
- package/dist/core/job-executions.d.ts.map +1 -0
- package/dist/core/job-executions.js +37 -0
- package/dist/core/job-executions.js.map +1 -0
- package/dist/core/maintenance-policy.d.ts +2 -0
- package/dist/core/maintenance-policy.d.ts.map +1 -0
- package/dist/core/maintenance-policy.js +3 -0
- package/dist/core/maintenance-policy.js.map +1 -0
- package/dist/core/maintenance.d.ts +33 -0
- package/dist/core/maintenance.d.ts.map +1 -0
- package/dist/core/maintenance.js +55 -0
- package/dist/core/maintenance.js.map +1 -0
- package/dist/core/manual-registration-tokens.d.ts +17 -0
- package/dist/core/manual-registration-tokens.d.ts.map +1 -0
- package/dist/core/manual-registration-tokens.js +28 -0
- package/dist/core/manual-registration-tokens.js.map +1 -0
- package/dist/core/provisioned-runners.d.ts +67 -0
- package/dist/core/provisioned-runners.d.ts.map +1 -0
- package/dist/core/provisioned-runners.js +162 -0
- package/dist/core/provisioned-runners.js.map +1 -0
- package/dist/core/provisioner-tokens.d.ts +20 -0
- package/dist/core/provisioner-tokens.d.ts.map +1 -0
- package/dist/core/provisioner-tokens.js +36 -0
- package/dist/core/provisioner-tokens.js.map +1 -0
- package/dist/core/rate-limit.d.ts +35 -0
- package/dist/core/rate-limit.d.ts.map +1 -0
- package/dist/core/rate-limit.js +74 -0
- package/dist/core/rate-limit.js.map +1 -0
- package/dist/core/runner-sessions.d.ts +26 -0
- package/dist/core/runner-sessions.d.ts.map +1 -0
- package/dist/core/runner-sessions.js +41 -0
- package/dist/core/runner-sessions.js.map +1 -0
- package/dist/core/runner-tool-capabilities.d.ts +24 -0
- package/dist/core/runner-tool-capabilities.d.ts.map +1 -0
- package/dist/core/runner-tool-capabilities.js +43 -0
- package/dist/core/runner-tool-capabilities.js.map +1 -0
- package/dist/db/db.d.ts +4478 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +36 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/ephemeral-registration-tokens.d.ts +47 -0
- package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -0
- package/dist/db/ephemeral-registration-tokens.js +170 -0
- package/dist/db/ephemeral-registration-tokens.js.map +1 -0
- package/dist/db/index.d.ts +19 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +15 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/job-executions.d.ts +128 -0
- package/dist/db/job-executions.d.ts.map +1 -0
- package/dist/db/job-executions.js +354 -0
- package/dist/db/job-executions.js.map +1 -0
- package/dist/db/manual-registration-tokens.d.ts +16 -0
- package/dist/db/manual-registration-tokens.d.ts.map +1 -0
- package/dist/db/manual-registration-tokens.js +37 -0
- package/dist/db/manual-registration-tokens.js.map +1 -0
- package/dist/db/provisioned-runners.d.ts +79 -0
- package/dist/db/provisioned-runners.d.ts.map +1 -0
- package/dist/db/provisioned-runners.js +466 -0
- package/dist/db/provisioned-runners.js.map +1 -0
- package/dist/db/provisioner-tokens.d.ts +26 -0
- package/dist/db/provisioner-tokens.d.ts.map +1 -0
- package/dist/db/provisioner-tokens.js +54 -0
- package/dist/db/provisioner-tokens.js.map +1 -0
- package/dist/db/rate-limits.d.ts +18 -0
- package/dist/db/rate-limits.d.ts.map +1 -0
- package/dist/db/rate-limits.js +44 -0
- package/dist/db/rate-limits.js.map +1 -0
- package/dist/db/reservations.d.ts +48 -0
- package/dist/db/reservations.d.ts.map +1 -0
- package/dist/db/reservations.js +162 -0
- package/dist/db/reservations.js.map +1 -0
- package/dist/db/runner-sessions.d.ts +18 -0
- package/dist/db/runner-sessions.d.ts.map +1 -0
- package/dist/db/runner-sessions.js +38 -0
- package/dist/db/runner-sessions.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/ephemeral-registration-tokens.d.ts +199 -0
- package/dist/db/schema/ephemeral-registration-tokens.d.ts.map +1 -0
- package/dist/db/schema/ephemeral-registration-tokens.js +45 -0
- package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -0
- package/dist/db/schema/manual-registration-tokens.d.ts +165 -0
- package/dist/db/schema/manual-registration-tokens.d.ts.map +1 -0
- package/dist/db/schema/manual-registration-tokens.js +40 -0
- package/dist/db/schema/manual-registration-tokens.js.map +1 -0
- package/dist/db/schema/outbox.d.ts +195 -0
- package/dist/db/schema/outbox.d.ts.map +1 -0
- package/dist/db/schema/outbox.js +5 -0
- package/dist/db/schema/outbox.js.map +1 -0
- package/dist/db/schema/pending-job-executions.d.ts +189 -0
- package/dist/db/schema/pending-job-executions.d.ts.map +1 -0
- package/dist/db/schema/pending-job-executions.js +21 -0
- package/dist/db/schema/pending-job-executions.js.map +1 -0
- package/dist/db/schema/provisioned-runners.d.ts +379 -0
- package/dist/db/schema/provisioned-runners.d.ts.map +1 -0
- package/dist/db/schema/provisioned-runners.js +83 -0
- package/dist/db/schema/provisioned-runners.js.map +1 -0
- package/dist/db/schema/provisioner-tokens.d.ts +216 -0
- package/dist/db/schema/provisioner-tokens.d.ts.map +1 -0
- package/dist/db/schema/provisioner-tokens.js +48 -0
- package/dist/db/schema/provisioner-tokens.js.map +1 -0
- package/dist/db/schema/rate-limits.d.ts +145 -0
- package/dist/db/schema/rate-limits.d.ts.map +1 -0
- package/dist/db/schema/rate-limits.js +25 -0
- package/dist/db/schema/rate-limits.js.map +1 -0
- package/dist/db/schema/reservations.d.ts +157 -0
- package/dist/db/schema/reservations.d.ts.map +1 -0
- package/dist/db/schema/reservations.js +34 -0
- package/dist/db/schema/reservations.js.map +1 -0
- package/dist/db/schema/runner-sessions.d.ts +298 -0
- package/dist/db/schema/runner-sessions.d.ts.map +1 -0
- package/dist/db/schema/runner-sessions.js +61 -0
- package/dist/db/schema/runner-sessions.js.map +1 -0
- package/dist/db/schema/running-job-executions.d.ts +334 -0
- package/dist/db/schema/running-job-executions.d.ts.map +1 -0
- package/dist/db/schema/running-job-executions.js +41 -0
- package/dist/db/schema/running-job-executions.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +4 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +34 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +60 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/metrics/service.d.ts +2 -0
- package/dist/metrics/service.d.ts.map +1 -0
- package/dist/metrics/service.js +21 -0
- package/dist/metrics/service.js.map +1 -0
- package/dist/presentation/auth/index.d.ts +3 -0
- package/dist/presentation/auth/index.d.ts.map +1 -0
- package/dist/presentation/auth/index.js +4 -0
- package/dist/presentation/auth/index.js.map +1 -0
- package/dist/presentation/auth/provisioner-token-auth.d.ts +3 -0
- package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -0
- package/dist/presentation/auth/provisioner-token-auth.js +81 -0
- package/dist/presentation/auth/provisioner-token-auth.js.map +1 -0
- package/dist/presentation/auth/runner-registration-token-auth.d.ts +17 -0
- package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -0
- package/dist/presentation/auth/runner-registration-token-auth.js +77 -0
- package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -0
- package/dist/presentation/dto/active-provisioner.d.ts +8 -0
- package/dist/presentation/dto/active-provisioner.d.ts.map +1 -0
- package/dist/presentation/dto/active-provisioner.js +10 -0
- package/dist/presentation/dto/active-provisioner.js.map +1 -0
- package/dist/presentation/dto/index.d.ts +7 -0
- package/dist/presentation/dto/index.d.ts.map +1 -0
- package/dist/presentation/dto/index.js +8 -0
- package/dist/presentation/dto/index.js.map +1 -0
- package/dist/presentation/dto/manual-registration-token.d.ts +12 -0
- package/dist/presentation/dto/manual-registration-token.d.ts.map +1 -0
- package/dist/presentation/dto/manual-registration-token.js +14 -0
- package/dist/presentation/dto/manual-registration-token.js.map +1 -0
- package/dist/presentation/dto/mint-registration-tokens.d.ts +5 -0
- package/dist/presentation/dto/mint-registration-tokens.d.ts.map +1 -0
- package/dist/presentation/dto/mint-registration-tokens.js +19 -0
- package/dist/presentation/dto/mint-registration-tokens.js.map +1 -0
- package/dist/presentation/dto/poll-demand.d.ts +4 -0
- package/dist/presentation/dto/poll-demand.d.ts.map +1 -0
- package/dist/presentation/dto/poll-demand.js +19 -0
- package/dist/presentation/dto/poll-demand.js.map +1 -0
- package/dist/presentation/dto/provisioned-runners.d.ts +38 -0
- package/dist/presentation/dto/provisioned-runners.d.ts.map +1 -0
- package/dist/presentation/dto/provisioned-runners.js +44 -0
- package/dist/presentation/dto/provisioned-runners.js.map +1 -0
- package/dist/presentation/dto/provisioner-token.d.ts +15 -0
- package/dist/presentation/dto/provisioner-token.d.ts.map +1 -0
- package/dist/presentation/dto/provisioner-token.js +17 -0
- package/dist/presentation/dto/provisioner-token.js.map +1 -0
- package/dist/presentation/index.d.ts +4 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +5 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/routes/create-manual-registration-token.d.ts +2 -0
- package/dist/presentation/routes/create-manual-registration-token.d.ts.map +1 -0
- package/dist/presentation/routes/create-manual-registration-token.js +44 -0
- package/dist/presentation/routes/create-manual-registration-token.js.map +1 -0
- package/dist/presentation/routes/create-provisioner-token.d.ts +2 -0
- package/dist/presentation/routes/create-provisioner-token.d.ts.map +1 -0
- package/dist/presentation/routes/create-provisioner-token.js +42 -0
- package/dist/presentation/routes/create-provisioner-token.js.map +1 -0
- package/dist/presentation/routes/get-provisioner-me.d.ts +2 -0
- package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -0
- package/dist/presentation/routes/get-provisioner-me.js +22 -0
- package/dist/presentation/routes/get-provisioner-me.js.map +1 -0
- package/dist/presentation/routes/heartbeat.d.ts +2 -0
- package/dist/presentation/routes/heartbeat.d.ts.map +1 -0
- package/dist/presentation/routes/heartbeat.js +64 -0
- package/dist/presentation/routes/heartbeat.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +4 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +97 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/list-active-provisioners.d.ts +2 -0
- package/dist/presentation/routes/list-active-provisioners.d.ts.map +1 -0
- package/dist/presentation/routes/list-active-provisioners.js +32 -0
- package/dist/presentation/routes/list-active-provisioners.js.map +1 -0
- package/dist/presentation/routes/list-active-runners.d.ts +2 -0
- package/dist/presentation/routes/list-active-runners.d.ts.map +1 -0
- package/dist/presentation/routes/list-active-runners.js +32 -0
- package/dist/presentation/routes/list-active-runners.js.map +1 -0
- package/dist/presentation/routes/list-manual-registration-tokens.d.ts +2 -0
- package/dist/presentation/routes/list-manual-registration-tokens.d.ts.map +1 -0
- package/dist/presentation/routes/list-manual-registration-tokens.js +32 -0
- package/dist/presentation/routes/list-manual-registration-tokens.js.map +1 -0
- package/dist/presentation/routes/list-provisioner-tokens.d.ts +2 -0
- package/dist/presentation/routes/list-provisioner-tokens.d.ts.map +1 -0
- package/dist/presentation/routes/list-provisioner-tokens.js +32 -0
- package/dist/presentation/routes/list-provisioner-tokens.js.map +1 -0
- package/dist/presentation/routes/mint-registration-tokens.d.ts +2 -0
- package/dist/presentation/routes/mint-registration-tokens.d.ts.map +1 -0
- package/dist/presentation/routes/mint-registration-tokens.js +74 -0
- package/dist/presentation/routes/mint-registration-tokens.js.map +1 -0
- package/dist/presentation/routes/poll-demand.d.ts +2 -0
- package/dist/presentation/routes/poll-demand.d.ts.map +1 -0
- package/dist/presentation/routes/poll-demand.js +53 -0
- package/dist/presentation/routes/poll-demand.js.map +1 -0
- package/dist/presentation/routes/rate-limit.d.ts +4 -0
- package/dist/presentation/routes/rate-limit.d.ts.map +1 -0
- package/dist/presentation/routes/rate-limit.js +94 -0
- package/dist/presentation/routes/rate-limit.js.map +1 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +2 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +1 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.js +27 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.js.map +1 -0
- package/dist/presentation/routes/register.d.ts +2 -0
- package/dist/presentation/routes/register.d.ts.map +1 -0
- package/dist/presentation/routes/register.js +63 -0
- package/dist/presentation/routes/register.js.map +1 -0
- package/dist/presentation/routes/report-provisioned-runners.d.ts +2 -0
- package/dist/presentation/routes/report-provisioned-runners.d.ts.map +1 -0
- package/dist/presentation/routes/report-provisioned-runners.js +37 -0
- package/dist/presentation/routes/report-provisioned-runners.js.map +1 -0
- package/dist/presentation/routes/request-job.d.ts +2 -0
- package/dist/presentation/routes/request-job.d.ts.map +1 -0
- package/dist/presentation/routes/request-job.js +45 -0
- package/dist/presentation/routes/request-job.js.map +1 -0
- package/dist/presentation/routes/revoke-manual-registration-token.d.ts +2 -0
- package/dist/presentation/routes/revoke-manual-registration-token.d.ts.map +1 -0
- package/dist/presentation/routes/revoke-manual-registration-token.js +42 -0
- package/dist/presentation/routes/revoke-manual-registration-token.js.map +1 -0
- package/dist/presentation/routes/revoke-provisioner-token.d.ts +2 -0
- package/dist/presentation/routes/revoke-provisioner-token.d.ts.map +1 -0
- package/dist/presentation/routes/revoke-provisioner-token.js +44 -0
- package/dist/presentation/routes/revoke-provisioner-token.js.map +1 -0
- package/dist/presentation/routes/workspace-membership.d.ts +6 -0
- package/dist/presentation/routes/workspace-membership.d.ts.map +1 -0
- package/dist/presentation/routes/workspace-membership.js +6 -0
- package/dist/presentation/routes/workspace-membership.js.map +1 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.d.ts +3 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.js +14 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +9 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +12 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/maintenance-activities.d.ts +31 -0
- package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -0
- package/dist/temporal/activities/maintenance-activities.js +18 -0
- package/dist/temporal/activities/maintenance-activities.js.map +1 -0
- package/dist/temporal/constants.d.ts +2 -0
- package/dist/temporal/constants.d.ts.map +1 -0
- package/dist/temporal/constants.js +3 -0
- package/dist/temporal/constants.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +2 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +3 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/stuck-job-detector.d.ts +2 -0
- package/dist/temporal/workflows/stuck-job-detector.d.ts.map +1 -0
- package/dist/temporal/workflows/stuck-job-detector.js +61 -0
- package/dist/temporal/workflows/stuck-job-detector.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_initial.sql +185 -0
- package/drizzle/meta/0000_snapshot.json +1582 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +7 -0
- package/package.json +82 -0
- package/src/config.test.ts +374 -0
- package/src/config.ts +330 -0
- package/src/core/demand.test.ts +301 -0
- package/src/core/demand.ts +239 -0
- package/src/core/entities/ephemeral-registration-token.ts +13 -0
- package/src/core/entities/manual-registration-token.ts +11 -0
- package/src/core/entities/provisioned-runner.ts +30 -0
- package/src/core/entities/provisioner-token.ts +16 -0
- package/src/core/entities/reservation.ts +9 -0
- package/src/core/entities/runner-session.ts +18 -0
- package/src/core/ephemeral-registration-tokens.test.ts +108 -0
- package/src/core/ephemeral-registration-tokens.ts +112 -0
- package/src/core/errors.ts +128 -0
- package/src/core/index.ts +56 -0
- package/src/core/job-executions.ts +47 -0
- package/src/core/maintenance-policy.ts +1 -0
- package/src/core/maintenance.test.ts +251 -0
- package/src/core/maintenance.ts +74 -0
- package/src/core/manual-registration-tokens.test.ts +44 -0
- package/src/core/manual-registration-tokens.ts +51 -0
- package/src/core/provisioned-runners.test.ts +101 -0
- package/src/core/provisioned-runners.ts +301 -0
- package/src/core/provisioner-tokens.test.ts +61 -0
- package/src/core/provisioner-tokens.ts +61 -0
- package/src/core/rate-limit.test.ts +158 -0
- package/src/core/rate-limit.ts +121 -0
- package/src/core/runner-sessions.test.ts +209 -0
- package/src/core/runner-sessions.ts +66 -0
- package/src/core/runner-tool-capabilities.test.ts +141 -0
- package/src/core/runner-tool-capabilities.ts +75 -0
- package/src/db/db.ts +38 -0
- package/src/db/ephemeral-registration-tokens.test.ts +332 -0
- package/src/db/ephemeral-registration-tokens.ts +348 -0
- package/src/db/index.ts +90 -0
- package/src/db/job-executions.test.ts +1500 -0
- package/src/db/job-executions.ts +647 -0
- package/src/db/manual-registration-tokens.test.ts +99 -0
- package/src/db/manual-registration-tokens.ts +87 -0
- package/src/db/provisioned-runners.test.ts +1812 -0
- package/src/db/provisioned-runners.ts +886 -0
- package/src/db/provisioner-tokens.test.ts +133 -0
- package/src/db/provisioner-tokens.ts +142 -0
- package/src/db/rate-limits.test.ts +74 -0
- package/src/db/rate-limits.ts +69 -0
- package/src/db/reservations.test.ts +399 -0
- package/src/db/reservations.ts +296 -0
- package/src/db/runner-sessions.test.ts +153 -0
- package/src/db/runner-sessions.ts +97 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/ephemeral-registration-tokens.ts +58 -0
- package/src/db/schema/manual-registration-tokens.ts +40 -0
- package/src/db/schema/outbox.ts +4 -0
- package/src/db/schema/pending-job-executions.ts +25 -0
- package/src/db/schema/provisioned-runners.ts +89 -0
- package/src/db/schema/provisioner-tokens.ts +50 -0
- package/src/db/schema/rate-limits.ts +27 -0
- package/src/db/schema/reservations.ts +38 -0
- package/src/db/schema/runner-sessions.ts +77 -0
- package/src/db/schema/running-job-executions.ts +50 -0
- package/src/index.ts +63 -0
- package/src/metrics/index.ts +13 -0
- package/src/metrics/instance.ts +115 -0
- package/src/metrics/service.ts +22 -0
- package/src/presentation/auth/index.ts +6 -0
- package/src/presentation/auth/provisioner-token-auth.ts +76 -0
- package/src/presentation/auth/runner-registration-token-auth.ts +105 -0
- package/src/presentation/dto/active-provisioner.ts +15 -0
- package/src/presentation/dto/index.ts +13 -0
- package/src/presentation/dto/manual-registration-token.ts +23 -0
- package/src/presentation/dto/mint-registration-tokens.ts +35 -0
- package/src/presentation/dto/poll-demand.ts +20 -0
- package/src/presentation/dto/provisioned-runners.ts +88 -0
- package/src/presentation/dto/provisioner-token.ts +29 -0
- package/src/presentation/index.ts +6 -0
- package/src/presentation/routes/create-manual-registration-token.ts +43 -0
- package/src/presentation/routes/create-provisioner-token.ts +41 -0
- package/src/presentation/routes/get-provisioner-me.ts +22 -0
- package/src/presentation/routes/heartbeat.test.ts +325 -0
- package/src/presentation/routes/heartbeat.ts +80 -0
- package/src/presentation/routes/index.ts +86 -0
- package/src/presentation/routes/list-active-provisioners.ts +25 -0
- package/src/presentation/routes/list-active-runners.test.ts +366 -0
- package/src/presentation/routes/list-active-runners.ts +25 -0
- package/src/presentation/routes/list-manual-registration-tokens.ts +25 -0
- package/src/presentation/routes/list-provisioner-tokens.ts +25 -0
- package/src/presentation/routes/manual-registration-tokens.test.ts +213 -0
- package/src/presentation/routes/mint-registration-tokens.test.ts +453 -0
- package/src/presentation/routes/mint-registration-tokens.ts +82 -0
- package/src/presentation/routes/poll-demand-release.test.ts +80 -0
- package/src/presentation/routes/poll-demand.test.ts +323 -0
- package/src/presentation/routes/poll-demand.ts +56 -0
- package/src/presentation/routes/provisioner-me.test.ts +172 -0
- package/src/presentation/routes/provisioner-tokens.test.ts +219 -0
- package/src/presentation/routes/rate-limit.ts +115 -0
- package/src/presentation/routes/reconcile-provisioned-runners.test.ts +380 -0
- package/src/presentation/routes/reconcile-provisioned-runners.ts +30 -0
- package/src/presentation/routes/register.test.ts +453 -0
- package/src/presentation/routes/register.ts +75 -0
- package/src/presentation/routes/report-provisioned-runners.test.ts +249 -0
- package/src/presentation/routes/report-provisioned-runners.ts +40 -0
- package/src/presentation/routes/request-job.test.ts +222 -0
- package/src/presentation/routes/request-job.ts +47 -0
- package/src/presentation/routes/revoke-manual-registration-token.ts +35 -0
- package/src/presentation/routes/revoke-provisioner-token.ts +37 -0
- package/src/presentation/routes/workspace-membership.ts +9 -0
- package/src/presentation/subscribers/on-workflows-job-execution-timed-out.test.ts +147 -0
- package/src/presentation/subscribers/on-workflows-job-execution-timed-out.ts +17 -0
- package/src/temporal/activities/index.ts +17 -0
- package/src/temporal/activities/maintenance-activities.test.ts +104 -0
- package/src/temporal/activities/maintenance-activities.ts +41 -0
- package/src/temporal/constants.ts +1 -0
- package/src/temporal/workflows/index.ts +1 -0
- package/src/temporal/workflows/stuck-job-detector.test.ts +93 -0
- package/src/temporal/workflows/stuck-job-detector.ts +67 -0
- package/test/env.ts +11 -0
- package/test/factories/ephemeral-registration-token.ts +41 -0
- package/test/factories/manual-registration-token.ts +37 -0
- package/test/factories/pending-job.ts +44 -0
- package/test/factories/provisioned-runner.ts +78 -0
- package/test/factories/provisioner-token.ts +41 -0
- package/test/factories/reservation.ts +33 -0
- package/test/factories/runner-session.ts +32 -0
- package/test/globalSetup.ts +23 -0
- package/test/index.ts +16 -0
- package/test/setup.ts +17 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { requireProvisionerContext } from '@shipfox/api-auth-context';
|
|
2
|
+
import { mintRegistrationTokensBatchBodySchema, mintRegistrationTokensBatchResponseSchema } from '@shipfox/api-runners-dto';
|
|
3
|
+
import { ClientError, defineRoute } from '@shipfox/node-fastify';
|
|
4
|
+
import { config } from '#config.js';
|
|
5
|
+
import { mintEphemeralRegistrationTokensBatch } from '#core/ephemeral-registration-tokens.js';
|
|
6
|
+
import { ActiveEphemeralRegistrationTokensExistError, RegistrationTokenBatchExceedsReservationError, RegistrationTokenBatchTooLargeError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
|
|
7
|
+
import { toMintRegistrationTokensProvisionedRunners, toMintRegistrationTokensResponseDto } from '#presentation/dto/index.js';
|
|
8
|
+
import { createProvisionerMintRateLimitPreHandler } from './rate-limit.js';
|
|
9
|
+
export const mintRegistrationTokensRoute = defineRoute({
|
|
10
|
+
method: 'POST',
|
|
11
|
+
path: '/runner-registration-tokens/batch',
|
|
12
|
+
description: 'Mint ephemeral runner registration tokens for reserved provisioned runners',
|
|
13
|
+
schema: {
|
|
14
|
+
body: mintRegistrationTokensBatchBodySchema,
|
|
15
|
+
response: {
|
|
16
|
+
200: mintRegistrationTokensBatchResponseSchema
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
preHandler: createProvisionerMintRateLimitPreHandler(),
|
|
20
|
+
errorHandler: (error)=>{
|
|
21
|
+
if (error instanceof ReservationNotFoundError) {
|
|
22
|
+
throw new ClientError('Reservation not found', 'reservation-not-found', {
|
|
23
|
+
status: 404
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (error instanceof ReservationExpiredError) {
|
|
27
|
+
throw new ClientError('Reservation has expired', 'reservation-expired', {
|
|
28
|
+
status: 409
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (error instanceof RegistrationTokenBatchExceedsReservationError) {
|
|
32
|
+
throw new ClientError('Batch exceeds reservation count', 'batch-exceeds-reservation', {
|
|
33
|
+
status: 409,
|
|
34
|
+
details: {
|
|
35
|
+
requested: error.requested,
|
|
36
|
+
reservation_count: error.reservationCount,
|
|
37
|
+
already_minted: error.alreadyMinted
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (error instanceof ActiveEphemeralRegistrationTokensExistError) {
|
|
42
|
+
throw new ClientError('Registration token already active', 'registration-token-active', {
|
|
43
|
+
status: 409,
|
|
44
|
+
details: {
|
|
45
|
+
provisioned_runner_ids: error.provisionedRunnerIds
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (error instanceof RegistrationTokenBatchTooLargeError) {
|
|
50
|
+
throw new ClientError('Registration token batch is too large', 'batch-too-large', {
|
|
51
|
+
status: 400,
|
|
52
|
+
details: {
|
|
53
|
+
requested: error.requested,
|
|
54
|
+
max: error.max
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
},
|
|
60
|
+
handler: async (request)=>{
|
|
61
|
+
const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
|
|
62
|
+
const result = await mintEphemeralRegistrationTokensBatch({
|
|
63
|
+
workspaceId,
|
|
64
|
+
provisionerId: provisionerTokenId,
|
|
65
|
+
reservationId: request.body.reservation_id,
|
|
66
|
+
provisionedRunners: toMintRegistrationTokensProvisionedRunners(request.body.provisioned_runners),
|
|
67
|
+
ttlSeconds: config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS,
|
|
68
|
+
maxBatchSize: config.REGISTRATION_TOKEN_BATCH_MAX
|
|
69
|
+
});
|
|
70
|
+
return toMintRegistrationTokensResponseDto(result);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=mint-registration-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/mint-registration-tokens.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n mintRegistrationTokensBatchBodySchema,\n mintRegistrationTokensBatchResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {config} from '#config.js';\nimport {mintEphemeralRegistrationTokensBatch} from '#core/ephemeral-registration-tokens.js';\nimport {\n ActiveEphemeralRegistrationTokensExistError,\n RegistrationTokenBatchExceedsReservationError,\n RegistrationTokenBatchTooLargeError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\nimport {\n toMintRegistrationTokensProvisionedRunners,\n toMintRegistrationTokensResponseDto,\n} from '#presentation/dto/index.js';\nimport {createProvisionerMintRateLimitPreHandler} from './rate-limit.js';\n\nexport const mintRegistrationTokensRoute = defineRoute({\n method: 'POST',\n path: '/runner-registration-tokens/batch',\n description: 'Mint ephemeral runner registration tokens for reserved provisioned runners',\n schema: {\n body: mintRegistrationTokensBatchBodySchema,\n response: {\n 200: mintRegistrationTokensBatchResponseSchema,\n },\n },\n preHandler: createProvisionerMintRateLimitPreHandler(),\n errorHandler: (error) => {\n if (error instanceof ReservationNotFoundError) {\n throw new ClientError('Reservation not found', 'reservation-not-found', {status: 404});\n }\n if (error instanceof ReservationExpiredError) {\n throw new ClientError('Reservation has expired', 'reservation-expired', {status: 409});\n }\n if (error instanceof RegistrationTokenBatchExceedsReservationError) {\n throw new ClientError('Batch exceeds reservation count', 'batch-exceeds-reservation', {\n status: 409,\n details: {\n requested: error.requested,\n reservation_count: error.reservationCount,\n already_minted: error.alreadyMinted,\n },\n });\n }\n if (error instanceof ActiveEphemeralRegistrationTokensExistError) {\n throw new ClientError('Registration token already active', 'registration-token-active', {\n status: 409,\n details: {provisioned_runner_ids: error.provisionedRunnerIds},\n });\n }\n if (error instanceof RegistrationTokenBatchTooLargeError) {\n throw new ClientError('Registration token batch is too large', 'batch-too-large', {\n status: 400,\n details: {\n requested: error.requested,\n max: error.max,\n },\n });\n }\n throw error;\n },\n handler: async (request) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const result = await mintEphemeralRegistrationTokensBatch({\n workspaceId,\n provisionerId: provisionerTokenId,\n reservationId: request.body.reservation_id,\n provisionedRunners: toMintRegistrationTokensProvisionedRunners(\n request.body.provisioned_runners,\n ),\n ttlSeconds: config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS,\n maxBatchSize: config.REGISTRATION_TOKEN_BATCH_MAX,\n });\n\n return toMintRegistrationTokensResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","mintRegistrationTokensBatchBodySchema","mintRegistrationTokensBatchResponseSchema","ClientError","defineRoute","config","mintEphemeralRegistrationTokensBatch","ActiveEphemeralRegistrationTokensExistError","RegistrationTokenBatchExceedsReservationError","RegistrationTokenBatchTooLargeError","ReservationExpiredError","ReservationNotFoundError","toMintRegistrationTokensProvisionedRunners","toMintRegistrationTokensResponseDto","createProvisionerMintRateLimitPreHandler","mintRegistrationTokensRoute","method","path","description","schema","body","response","preHandler","errorHandler","error","status","details","requested","reservation_count","reservationCount","already_minted","alreadyMinted","provisioned_runner_ids","provisionedRunnerIds","max","handler","request","provisionerTokenId","workspaceId","result","provisionerId","reservationId","reservation_id","provisionedRunners","provisioned_runners","ttlSeconds","EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS","maxBatchSize","REGISTRATION_TOKEN_BATCH_MAX"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,qCAAqC,EACrCC,yCAAyC,QACpC,2BAA2B;AAClC,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,oCAAoC,QAAO,yCAAyC;AAC5F,SACEC,2CAA2C,EAC3CC,6CAA6C,EAC7CC,mCAAmC,EACnCC,uBAAuB,EACvBC,wBAAwB,QACnB,kBAAkB;AACzB,SACEC,0CAA0C,EAC1CC,mCAAmC,QAC9B,6BAA6B;AACpC,SAAQC,wCAAwC,QAAO,kBAAkB;AAEzE,OAAO,MAAMC,8BAA8BX,YAAY;IACrDY,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMnB;QACNoB,UAAU;YACR,KAAKnB;QACP;IACF;IACAoB,YAAYR;IACZS,cAAc,CAACC;QACb,IAAIA,iBAAiBb,0BAA0B;YAC7C,MAAM,IAAIR,YAAY,yBAAyB,yBAAyB;gBAACsB,QAAQ;YAAG;QACtF;QACA,IAAID,iBAAiBd,yBAAyB;YAC5C,MAAM,IAAIP,YAAY,2BAA2B,uBAAuB;gBAACsB,QAAQ;YAAG;QACtF;QACA,IAAID,iBAAiBhB,+CAA+C;YAClE,MAAM,IAAIL,YAAY,mCAAmC,6BAA6B;gBACpFsB,QAAQ;gBACRC,SAAS;oBACPC,WAAWH,MAAMG,SAAS;oBAC1BC,mBAAmBJ,MAAMK,gBAAgB;oBACzCC,gBAAgBN,MAAMO,aAAa;gBACrC;YACF;QACF;QACA,IAAIP,iBAAiBjB,6CAA6C;YAChE,MAAM,IAAIJ,YAAY,qCAAqC,6BAA6B;gBACtFsB,QAAQ;gBACRC,SAAS;oBAACM,wBAAwBR,MAAMS,oBAAoB;gBAAA;YAC9D;QACF;QACA,IAAIT,iBAAiBf,qCAAqC;YACxD,MAAM,IAAIN,YAAY,yCAAyC,mBAAmB;gBAChFsB,QAAQ;gBACRC,SAAS;oBACPC,WAAWH,MAAMG,SAAS;oBAC1BO,KAAKV,MAAMU,GAAG;gBAChB;YACF;QACF;QACA,MAAMV;IACR;IACAW,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGtC,0BAA0BoC;QACpE,MAAMG,SAAS,MAAMjC,qCAAqC;YACxDgC;YACAE,eAAeH;YACfI,eAAeL,QAAQhB,IAAI,CAACsB,cAAc;YAC1CC,oBAAoB/B,2CAClBwB,QAAQhB,IAAI,CAACwB,mBAAmB;YAElCC,YAAYxC,OAAOyC,wCAAwC;YAC3DC,cAAc1C,OAAO2C,4BAA4B;QACnD;QAEA,OAAOnC,oCAAoC0B;IAC7C;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll-demand.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/poll-demand.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe,iDA6C1B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { requireProvisionerContext } from '@shipfox/api-auth-context';
|
|
2
|
+
import { pollDemandBodySchema, pollDemandResponseSchema } from '@shipfox/api-runners-dto';
|
|
3
|
+
import { defineRoute } from '@shipfox/node-fastify';
|
|
4
|
+
import { config } from '#config.js';
|
|
5
|
+
import { pollDemand, releaseReservationGrants } from '#core/demand.js';
|
|
6
|
+
import { toPollDemandResponseDto } from '#presentation/dto/index.js';
|
|
7
|
+
const TERMINATE_INTENT_LIMIT = 1000;
|
|
8
|
+
export const pollDemandRoute = defineRoute({
|
|
9
|
+
method: 'POST',
|
|
10
|
+
path: '/demand/poll',
|
|
11
|
+
description: 'Poll aggregate runner demand and reserve capacity for a provisioner',
|
|
12
|
+
schema: {
|
|
13
|
+
body: pollDemandBodySchema,
|
|
14
|
+
response: {
|
|
15
|
+
200: pollDemandResponseSchema
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
handler: async (request, reply)=>{
|
|
19
|
+
const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
|
|
20
|
+
const abortController = new AbortController();
|
|
21
|
+
let responseFinished = false;
|
|
22
|
+
let responseReservations = [];
|
|
23
|
+
reply.raw.on('finish', ()=>{
|
|
24
|
+
responseFinished = true;
|
|
25
|
+
});
|
|
26
|
+
reply.raw.on('close', ()=>{
|
|
27
|
+
if (!responseFinished) {
|
|
28
|
+
abortController.abort();
|
|
29
|
+
void releaseReservationGrants(responseReservations).catch(()=>undefined);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const result = await pollDemand({
|
|
33
|
+
workspaceId,
|
|
34
|
+
provisionerId: provisionerTokenId,
|
|
35
|
+
maxReservations: request.body.max_reservations,
|
|
36
|
+
waitSeconds: request.body.wait_seconds,
|
|
37
|
+
ttlSeconds: config.RESERVATION_TTL_SECONDS,
|
|
38
|
+
terminateIntentLimit: TERMINATE_INTENT_LIMIT,
|
|
39
|
+
templates: request.body.templates.map((template)=>({
|
|
40
|
+
templateKey: template.template_key,
|
|
41
|
+
labels: template.labels,
|
|
42
|
+
availableSlots: template.available_slots,
|
|
43
|
+
starting: template.starting,
|
|
44
|
+
running: template.running
|
|
45
|
+
})),
|
|
46
|
+
signal: abortController.signal
|
|
47
|
+
});
|
|
48
|
+
responseReservations = result.reservations;
|
|
49
|
+
return toPollDemandResponseDto(result);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=poll-demand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/poll-demand.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {pollDemandBodySchema, pollDemandResponseSchema} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {config} from '#config.js';\nimport {pollDemand, releaseReservationGrants} from '#core/demand.js';\nimport type {ReservationGrant} from '#db/reservations.js';\nimport {toPollDemandResponseDto} from '#presentation/dto/index.js';\n\nconst TERMINATE_INTENT_LIMIT = 1000;\n\nexport const pollDemandRoute = defineRoute({\n method: 'POST',\n path: '/demand/poll',\n description: 'Poll aggregate runner demand and reserve capacity for a provisioner',\n schema: {\n body: pollDemandBodySchema,\n response: {\n 200: pollDemandResponseSchema,\n },\n },\n handler: async (request, reply) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const abortController = new AbortController();\n let responseFinished = false;\n let responseReservations: ReservationGrant[] = [];\n reply.raw.on('finish', () => {\n responseFinished = true;\n });\n reply.raw.on('close', () => {\n if (!responseFinished) {\n abortController.abort();\n void releaseReservationGrants(responseReservations).catch(() => undefined);\n }\n });\n\n const result = await pollDemand({\n workspaceId,\n provisionerId: provisionerTokenId,\n maxReservations: request.body.max_reservations,\n waitSeconds: request.body.wait_seconds,\n ttlSeconds: config.RESERVATION_TTL_SECONDS,\n terminateIntentLimit: TERMINATE_INTENT_LIMIT,\n templates: request.body.templates.map((template) => ({\n templateKey: template.template_key,\n labels: template.labels,\n availableSlots: template.available_slots,\n starting: template.starting,\n running: template.running,\n })),\n signal: abortController.signal,\n });\n responseReservations = result.reservations;\n\n return toPollDemandResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","pollDemandBodySchema","pollDemandResponseSchema","defineRoute","config","pollDemand","releaseReservationGrants","toPollDemandResponseDto","TERMINATE_INTENT_LIMIT","pollDemandRoute","method","path","description","schema","body","response","handler","request","reply","provisionerTokenId","workspaceId","abortController","AbortController","responseFinished","responseReservations","raw","on","abort","catch","undefined","result","provisionerId","maxReservations","max_reservations","waitSeconds","wait_seconds","ttlSeconds","RESERVATION_TTL_SECONDS","terminateIntentLimit","templates","map","template","templateKey","template_key","labels","availableSlots","available_slots","starting","running","signal","reservations"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SAAQC,oBAAoB,EAAEC,wBAAwB,QAAO,2BAA2B;AACxF,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,UAAU,EAAEC,wBAAwB,QAAO,kBAAkB;AAErE,SAAQC,uBAAuB,QAAO,6BAA6B;AAEnE,MAAMC,yBAAyB;AAE/B,OAAO,MAAMC,kBAAkBN,YAAY;IACzCO,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMb;QACNc,UAAU;YACR,KAAKb;QACP;IACF;IACAc,SAAS,OAAOC,SAASC;QACvB,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGpB,0BAA0BiB;QACpE,MAAMI,kBAAkB,IAAIC;QAC5B,IAAIC,mBAAmB;QACvB,IAAIC,uBAA2C,EAAE;QACjDN,MAAMO,GAAG,CAACC,EAAE,CAAC,UAAU;YACrBH,mBAAmB;QACrB;QACAL,MAAMO,GAAG,CAACC,EAAE,CAAC,SAAS;YACpB,IAAI,CAACH,kBAAkB;gBACrBF,gBAAgBM,KAAK;gBACrB,KAAKrB,yBAAyBkB,sBAAsBI,KAAK,CAAC,IAAMC;YAClE;QACF;QAEA,MAAMC,SAAS,MAAMzB,WAAW;YAC9Be;YACAW,eAAeZ;YACfa,iBAAiBf,QAAQH,IAAI,CAACmB,gBAAgB;YAC9CC,aAAajB,QAAQH,IAAI,CAACqB,YAAY;YACtCC,YAAYhC,OAAOiC,uBAAuB;YAC1CC,sBAAsB9B;YACtB+B,WAAWtB,QAAQH,IAAI,CAACyB,SAAS,CAACC,GAAG,CAAC,CAACC,WAAc,CAAA;oBACnDC,aAAaD,SAASE,YAAY;oBAClCC,QAAQH,SAASG,MAAM;oBACvBC,gBAAgBJ,SAASK,eAAe;oBACxCC,UAAUN,SAASM,QAAQ;oBAC3BC,SAASP,SAASO,OAAO;gBAC3B,CAAA;YACAC,QAAQ5B,gBAAgB4B,MAAM;QAChC;QACAzB,uBAAuBM,OAAOoB,YAAY;QAE1C,OAAO3C,wBAAwBuB;IACjC;AACF,GAAG"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type FastifyReply, type FastifyRequest } from '@shipfox/node-fastify';
|
|
2
|
+
export declare function createProvisionerMintRateLimitPreHandler(): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
3
|
+
export declare function createEphemeralRegisterRateLimitPreHandler(): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
4
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/rate-limit.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAmF1F,wBAAgB,wCAAwC,KACxC,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAY3E;AAED,wBAAgB,0CAA0C,KAC1C,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAc3E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { requireProvisionerContext } from '@shipfox/api-auth-context';
|
|
2
|
+
import { ClientError } from '@shipfox/node-fastify';
|
|
3
|
+
import { config } from '#config.js';
|
|
4
|
+
import { checkRunnersRateLimit, RunnersRateLimitExceededError, RunnersRateLimitUnavailableError } from '#core/rate-limit.js';
|
|
5
|
+
import { getRunnerContext } from '#presentation/auth/index.js';
|
|
6
|
+
function routeName(request) {
|
|
7
|
+
return request.routeOptions.url ?? request.url.split('?')[0] ?? 'unknown';
|
|
8
|
+
}
|
|
9
|
+
async function enforceRateLimit(params) {
|
|
10
|
+
try {
|
|
11
|
+
await checkRunnersRateLimit({
|
|
12
|
+
action: params.action,
|
|
13
|
+
scope: params.scope,
|
|
14
|
+
identifier: params.identifier,
|
|
15
|
+
limit: params.limit,
|
|
16
|
+
windowSeconds: params.windowSeconds
|
|
17
|
+
});
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (error instanceof RunnersRateLimitExceededError) {
|
|
20
|
+
params.request.log.warn({
|
|
21
|
+
action: error.action,
|
|
22
|
+
scope: error.scope,
|
|
23
|
+
route: routeName(params.request),
|
|
24
|
+
retryAfterSeconds: error.retryAfterSeconds,
|
|
25
|
+
identifierHmacPrefix: error.identifierHmacPrefix
|
|
26
|
+
}, 'Runners rate limit blocked request');
|
|
27
|
+
params.reply.header('Retry-After', String(error.retryAfterSeconds));
|
|
28
|
+
throw new ClientError('Rate limit exceeded', 'rate-limited', {
|
|
29
|
+
status: 429,
|
|
30
|
+
details: {
|
|
31
|
+
retry_after_seconds: error.retryAfterSeconds
|
|
32
|
+
},
|
|
33
|
+
data: {
|
|
34
|
+
action: error.action,
|
|
35
|
+
scope: error.scope,
|
|
36
|
+
route: routeName(params.request),
|
|
37
|
+
identifierHmacPrefix: error.identifierHmacPrefix
|
|
38
|
+
},
|
|
39
|
+
cause: error
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (error instanceof RunnersRateLimitUnavailableError) {
|
|
43
|
+
params.request.log.error({
|
|
44
|
+
action: error.action,
|
|
45
|
+
scope: error.scope,
|
|
46
|
+
route: routeName(params.request),
|
|
47
|
+
identifierHmacPrefix: error.identifierHmacPrefix,
|
|
48
|
+
err: error
|
|
49
|
+
}, 'Runners rate limiter unavailable');
|
|
50
|
+
throw new ClientError('Runners rate limiter unavailable', 'runners-rate-limit-unavailable', {
|
|
51
|
+
status: 503,
|
|
52
|
+
data: {
|
|
53
|
+
action: error.action,
|
|
54
|
+
scope: error.scope,
|
|
55
|
+
route: routeName(params.request),
|
|
56
|
+
identifierHmacPrefix: error.identifierHmacPrefix
|
|
57
|
+
},
|
|
58
|
+
cause: error
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function createProvisionerMintRateLimitPreHandler() {
|
|
65
|
+
return async (request, reply)=>{
|
|
66
|
+
const { provisionerTokenId } = requireProvisionerContext(request);
|
|
67
|
+
await enforceRateLimit({
|
|
68
|
+
request,
|
|
69
|
+
reply,
|
|
70
|
+
action: 'provisioner-mint',
|
|
71
|
+
scope: 'provisioner',
|
|
72
|
+
identifier: provisionerTokenId,
|
|
73
|
+
limit: config.PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS,
|
|
74
|
+
windowSeconds: config.PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function createEphemeralRegisterRateLimitPreHandler() {
|
|
79
|
+
return async (request, reply)=>{
|
|
80
|
+
const runner = getRunnerContext(request);
|
|
81
|
+
if (runner.kind !== 'ephemeral') return;
|
|
82
|
+
await enforceRateLimit({
|
|
83
|
+
request,
|
|
84
|
+
reply,
|
|
85
|
+
action: 'ephemeral-register',
|
|
86
|
+
scope: 'ephemeral-token',
|
|
87
|
+
identifier: runner.ephemeralTokenId,
|
|
88
|
+
limit: config.EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS,
|
|
89
|
+
windowSeconds: config.EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/rate-limit.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {ClientError, type FastifyReply, type FastifyRequest} from '@shipfox/node-fastify';\nimport {config} from '#config.js';\nimport {\n checkRunnersRateLimit,\n RunnersRateLimitExceededError,\n RunnersRateLimitUnavailableError,\n} from '#core/rate-limit.js';\nimport {getRunnerContext} from '#presentation/auth/index.js';\n\nfunction routeName(request: FastifyRequest): string {\n return request.routeOptions.url ?? request.url.split('?')[0] ?? 'unknown';\n}\n\nasync function enforceRateLimit(params: {\n request: FastifyRequest;\n reply: FastifyReply;\n action: 'provisioner-mint' | 'ephemeral-register';\n scope: 'provisioner' | 'ephemeral-token';\n identifier: string;\n limit: number;\n windowSeconds: number;\n}): Promise<void> {\n try {\n await checkRunnersRateLimit({\n action: params.action,\n scope: params.scope,\n identifier: params.identifier,\n limit: params.limit,\n windowSeconds: params.windowSeconds,\n });\n } catch (error) {\n if (error instanceof RunnersRateLimitExceededError) {\n params.request.log.warn(\n {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n retryAfterSeconds: error.retryAfterSeconds,\n identifierHmacPrefix: error.identifierHmacPrefix,\n },\n 'Runners rate limit blocked request',\n );\n params.reply.header('Retry-After', String(error.retryAfterSeconds));\n throw new ClientError('Rate limit exceeded', 'rate-limited', {\n status: 429,\n details: {retry_after_seconds: error.retryAfterSeconds},\n data: {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n identifierHmacPrefix: error.identifierHmacPrefix,\n },\n cause: error,\n });\n }\n\n if (error instanceof RunnersRateLimitUnavailableError) {\n params.request.log.error(\n {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n identifierHmacPrefix: error.identifierHmacPrefix,\n err: error,\n },\n 'Runners rate limiter unavailable',\n );\n throw new ClientError('Runners rate limiter unavailable', 'runners-rate-limit-unavailable', {\n status: 503,\n data: {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n identifierHmacPrefix: error.identifierHmacPrefix,\n },\n cause: error,\n });\n }\n\n throw error;\n }\n}\n\nexport function createProvisionerMintRateLimitPreHandler() {\n return async (request: FastifyRequest, reply: FastifyReply): Promise<void> => {\n const {provisionerTokenId} = requireProvisionerContext(request);\n await enforceRateLimit({\n request,\n reply,\n action: 'provisioner-mint',\n scope: 'provisioner',\n identifier: provisionerTokenId,\n limit: config.PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS,\n windowSeconds: config.PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS,\n });\n };\n}\n\nexport function createEphemeralRegisterRateLimitPreHandler() {\n return async (request: FastifyRequest, reply: FastifyReply): Promise<void> => {\n const runner = getRunnerContext(request);\n if (runner.kind !== 'ephemeral') return;\n\n await enforceRateLimit({\n request,\n reply,\n action: 'ephemeral-register',\n scope: 'ephemeral-token',\n identifier: runner.ephemeralTokenId,\n limit: config.EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS,\n windowSeconds: config.EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS,\n });\n };\n}\n"],"names":["requireProvisionerContext","ClientError","config","checkRunnersRateLimit","RunnersRateLimitExceededError","RunnersRateLimitUnavailableError","getRunnerContext","routeName","request","routeOptions","url","split","enforceRateLimit","params","action","scope","identifier","limit","windowSeconds","error","log","warn","route","retryAfterSeconds","identifierHmacPrefix","reply","header","String","status","details","retry_after_seconds","data","cause","err","createProvisionerMintRateLimitPreHandler","provisionerTokenId","PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS","PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS","createEphemeralRegisterRateLimitPreHandler","runner","kind","ephemeralTokenId","EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS","EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SAAQC,WAAW,QAA+C,wBAAwB;AAC1F,SAAQC,MAAM,QAAO,aAAa;AAClC,SACEC,qBAAqB,EACrBC,6BAA6B,EAC7BC,gCAAgC,QAC3B,sBAAsB;AAC7B,SAAQC,gBAAgB,QAAO,8BAA8B;AAE7D,SAASC,UAAUC,OAAuB;IACxC,OAAOA,QAAQC,YAAY,CAACC,GAAG,IAAIF,QAAQE,GAAG,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI;AAClE;AAEA,eAAeC,iBAAiBC,MAQ/B;IACC,IAAI;QACF,MAAMV,sBAAsB;YAC1BW,QAAQD,OAAOC,MAAM;YACrBC,OAAOF,OAAOE,KAAK;YACnBC,YAAYH,OAAOG,UAAU;YAC7BC,OAAOJ,OAAOI,KAAK;YACnBC,eAAeL,OAAOK,aAAa;QACrC;IACF,EAAE,OAAOC,OAAO;QACd,IAAIA,iBAAiBf,+BAA+B;YAClDS,OAAOL,OAAO,CAACY,GAAG,CAACC,IAAI,CACrB;gBACEP,QAAQK,MAAML,MAAM;gBACpBC,OAAOI,MAAMJ,KAAK;gBAClBO,OAAOf,UAAUM,OAAOL,OAAO;gBAC/Be,mBAAmBJ,MAAMI,iBAAiB;gBAC1CC,sBAAsBL,MAAMK,oBAAoB;YAClD,GACA;YAEFX,OAAOY,KAAK,CAACC,MAAM,CAAC,eAAeC,OAAOR,MAAMI,iBAAiB;YACjE,MAAM,IAAItB,YAAY,uBAAuB,gBAAgB;gBAC3D2B,QAAQ;gBACRC,SAAS;oBAACC,qBAAqBX,MAAMI,iBAAiB;gBAAA;gBACtDQ,MAAM;oBACJjB,QAAQK,MAAML,MAAM;oBACpBC,OAAOI,MAAMJ,KAAK;oBAClBO,OAAOf,UAAUM,OAAOL,OAAO;oBAC/BgB,sBAAsBL,MAAMK,oBAAoB;gBAClD;gBACAQ,OAAOb;YACT;QACF;QAEA,IAAIA,iBAAiBd,kCAAkC;YACrDQ,OAAOL,OAAO,CAACY,GAAG,CAACD,KAAK,CACtB;gBACEL,QAAQK,MAAML,MAAM;gBACpBC,OAAOI,MAAMJ,KAAK;gBAClBO,OAAOf,UAAUM,OAAOL,OAAO;gBAC/BgB,sBAAsBL,MAAMK,oBAAoB;gBAChDS,KAAKd;YACP,GACA;YAEF,MAAM,IAAIlB,YAAY,oCAAoC,kCAAkC;gBAC1F2B,QAAQ;gBACRG,MAAM;oBACJjB,QAAQK,MAAML,MAAM;oBACpBC,OAAOI,MAAMJ,KAAK;oBAClBO,OAAOf,UAAUM,OAAOL,OAAO;oBAC/BgB,sBAAsBL,MAAMK,oBAAoB;gBAClD;gBACAQ,OAAOb;YACT;QACF;QAEA,MAAMA;IACR;AACF;AAEA,OAAO,SAASe;IACd,OAAO,OAAO1B,SAAyBiB;QACrC,MAAM,EAACU,kBAAkB,EAAC,GAAGnC,0BAA0BQ;QACvD,MAAMI,iBAAiB;YACrBJ;YACAiB;YACAX,QAAQ;YACRC,OAAO;YACPC,YAAYmB;YACZlB,OAAOf,OAAOkC,wCAAwC;YACtDlB,eAAehB,OAAOmC,0CAA0C;QAClE;IACF;AACF;AAEA,OAAO,SAASC;IACd,OAAO,OAAO9B,SAAyBiB;QACrC,MAAMc,SAASjC,iBAAiBE;QAChC,IAAI+B,OAAOC,IAAI,KAAK,aAAa;QAEjC,MAAM5B,iBAAiB;YACrBJ;YACAiB;YACAX,QAAQ;YACRC,OAAO;YACPC,YAAYuB,OAAOE,gBAAgB;YACnCxB,OAAOf,OAAOwC,0CAA0C;YACxDxB,eAAehB,OAAOyC,4CAA4C;QACpE;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-provisioned-runners.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/reconcile-provisioned-runners.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gCAAgC,iDAoB3C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { requireProvisionerContext } from '@shipfox/api-auth-context';
|
|
2
|
+
import { reconcileProvisionedRunnersBodySchema, reconcileProvisionedRunnersResponseSchema } from '@shipfox/api-runners-dto';
|
|
3
|
+
import { defineRoute } from '@shipfox/node-fastify';
|
|
4
|
+
import { reconcileProvisionedRunners } from '#core/index.js';
|
|
5
|
+
import { toReconcileProvisionedRunnersResponseDto } from '#presentation/dto/index.js';
|
|
6
|
+
export const reconcileProvisionedRunnersRoute = defineRoute({
|
|
7
|
+
method: 'POST',
|
|
8
|
+
path: '/provisioned-runners/reconcile',
|
|
9
|
+
description: 'Reconcile provisioned runner state for a provisioner',
|
|
10
|
+
schema: {
|
|
11
|
+
body: reconcileProvisionedRunnersBodySchema,
|
|
12
|
+
response: {
|
|
13
|
+
200: reconcileProvisionedRunnersResponseSchema
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
handler: async (request)=>{
|
|
17
|
+
const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
|
|
18
|
+
const result = await reconcileProvisionedRunners({
|
|
19
|
+
workspaceId,
|
|
20
|
+
provisionerId: provisionerTokenId,
|
|
21
|
+
observedProvisionedRunnerIds: request.body.observed_provisioned_runner_ids
|
|
22
|
+
});
|
|
23
|
+
return toReconcileProvisionedRunnersResponseDto(result);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=reconcile-provisioned-runners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/reconcile-provisioned-runners.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n reconcileProvisionedRunnersBodySchema,\n reconcileProvisionedRunnersResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {reconcileProvisionedRunners} from '#core/index.js';\nimport {toReconcileProvisionedRunnersResponseDto} from '#presentation/dto/index.js';\n\nexport const reconcileProvisionedRunnersRoute = defineRoute({\n method: 'POST',\n path: '/provisioned-runners/reconcile',\n description: 'Reconcile provisioned runner state for a provisioner',\n schema: {\n body: reconcileProvisionedRunnersBodySchema,\n response: {\n 200: reconcileProvisionedRunnersResponseSchema,\n },\n },\n handler: async (request) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const result = await reconcileProvisionedRunners({\n workspaceId,\n provisionerId: provisionerTokenId,\n observedProvisionedRunnerIds: request.body.observed_provisioned_runner_ids,\n });\n\n return toReconcileProvisionedRunnersResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","reconcileProvisionedRunnersBodySchema","reconcileProvisionedRunnersResponseSchema","defineRoute","reconcileProvisionedRunners","toReconcileProvisionedRunnersResponseDto","reconcileProvisionedRunnersRoute","method","path","description","schema","body","response","handler","request","provisionerTokenId","workspaceId","result","provisionerId","observedProvisionedRunnerIds","observed_provisioned_runner_ids"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,qCAAqC,EACrCC,yCAAyC,QACpC,2BAA2B;AAClC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,2BAA2B,QAAO,iBAAiB;AAC3D,SAAQC,wCAAwC,QAAO,6BAA6B;AAEpF,OAAO,MAAMC,mCAAmCH,YAAY;IAC1DI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGhB,0BAA0Bc;QACpE,MAAMG,SAAS,MAAMb,4BAA4B;YAC/CY;YACAE,eAAeH;YACfI,8BAA8BL,QAAQH,IAAI,CAACS,+BAA+B;QAC5E;QAEA,OAAOf,yCAAyCY;IAClD;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/register.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa,iDA+DxB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { registerRunnerBodySchema, registerRunnerResponseSchema } from '@shipfox/api-runners-dto';
|
|
2
|
+
import { ClientError, defineRoute } from '@shipfox/node-fastify';
|
|
3
|
+
import { EmptyRunnerLabelsError, RegistrationTokenConsumedError, RegistrationTokenExpiredError } from '#core/errors.js';
|
|
4
|
+
import { registerRunnerSession } from '#core/runner-sessions.js';
|
|
5
|
+
import { getRunnerContext } from '#presentation/auth/index.js';
|
|
6
|
+
import { createEphemeralRegisterRateLimitPreHandler } from './rate-limit.js';
|
|
7
|
+
export const registerRoute = defineRoute({
|
|
8
|
+
method: 'POST',
|
|
9
|
+
path: '/register',
|
|
10
|
+
description: 'Exchange a runner registration token for a runner session token',
|
|
11
|
+
schema: {
|
|
12
|
+
body: registerRunnerBodySchema,
|
|
13
|
+
response: {
|
|
14
|
+
200: registerRunnerResponseSchema
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
preHandler: createEphemeralRegisterRateLimitPreHandler(),
|
|
18
|
+
errorHandler: (error, request)=>{
|
|
19
|
+
if (error instanceof EmptyRunnerLabelsError) {
|
|
20
|
+
throw new ClientError(error.message, 'empty-runner-labels', {
|
|
21
|
+
status: 400
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (error instanceof RegistrationTokenConsumedError) {
|
|
25
|
+
const runner = getRunnerContext(request);
|
|
26
|
+
if (runner.kind === 'ephemeral') {
|
|
27
|
+
request.log.warn({
|
|
28
|
+
ephemeralTokenId: error.ephemeralTokenId,
|
|
29
|
+
provisionerId: runner.provisionerId
|
|
30
|
+
}, 'Ephemeral registration token reuse rejected');
|
|
31
|
+
}
|
|
32
|
+
throw new ClientError('Registration token has already been consumed', 'registration-token-consumed', {
|
|
33
|
+
status: 409
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (error instanceof RegistrationTokenExpiredError) {
|
|
37
|
+
throw new ClientError('Registration token has expired', 'registration-token-expired', {
|
|
38
|
+
status: 401
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
},
|
|
43
|
+
handler: async (request)=>{
|
|
44
|
+
const runner = getRunnerContext(request);
|
|
45
|
+
const result = await registerRunnerSession({
|
|
46
|
+
credential: runner.kind === 'manual' ? {
|
|
47
|
+
kind: 'manual',
|
|
48
|
+
registrationTokenId: runner.registrationTokenId,
|
|
49
|
+
workspaceId: runner.workspaceId
|
|
50
|
+
} : runner,
|
|
51
|
+
labels: request.body.labels,
|
|
52
|
+
toolCapabilities: request.body.capabilities ?? null
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
session_token: result.sessionToken,
|
|
56
|
+
session_id: result.session.id,
|
|
57
|
+
mode: result.mode,
|
|
58
|
+
max_claims: result.maxClaims
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/register.ts"],"sourcesContent":["import {registerRunnerBodySchema, registerRunnerResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {\n EmptyRunnerLabelsError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n} from '#core/errors.js';\nimport {registerRunnerSession} from '#core/runner-sessions.js';\nimport {getRunnerContext} from '#presentation/auth/index.js';\nimport {createEphemeralRegisterRateLimitPreHandler} from './rate-limit.js';\n\nexport const registerRoute = defineRoute({\n method: 'POST',\n path: '/register',\n description: 'Exchange a runner registration token for a runner session token',\n schema: {\n body: registerRunnerBodySchema,\n response: {\n 200: registerRunnerResponseSchema,\n },\n },\n preHandler: createEphemeralRegisterRateLimitPreHandler(),\n errorHandler: (error, request) => {\n if (error instanceof EmptyRunnerLabelsError) {\n throw new ClientError(error.message, 'empty-runner-labels', {status: 400});\n }\n if (error instanceof RegistrationTokenConsumedError) {\n const runner = getRunnerContext(request);\n if (runner.kind === 'ephemeral') {\n request.log.warn(\n {\n ephemeralTokenId: error.ephemeralTokenId,\n provisionerId: runner.provisionerId,\n },\n 'Ephemeral registration token reuse rejected',\n );\n }\n throw new ClientError(\n 'Registration token has already been consumed',\n 'registration-token-consumed',\n {\n status: 409,\n },\n );\n }\n if (error instanceof RegistrationTokenExpiredError) {\n throw new ClientError('Registration token has expired', 'registration-token-expired', {\n status: 401,\n });\n }\n throw error;\n },\n handler: async (request) => {\n const runner = getRunnerContext(request);\n const result = await registerRunnerSession({\n credential:\n runner.kind === 'manual'\n ? {\n kind: 'manual',\n registrationTokenId: runner.registrationTokenId,\n workspaceId: runner.workspaceId,\n }\n : runner,\n labels: request.body.labels,\n toolCapabilities: request.body.capabilities ?? null,\n });\n\n return {\n session_token: result.sessionToken,\n session_id: result.session.id,\n mode: result.mode,\n max_claims: result.maxClaims,\n };\n },\n});\n"],"names":["registerRunnerBodySchema","registerRunnerResponseSchema","ClientError","defineRoute","EmptyRunnerLabelsError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","registerRunnerSession","getRunnerContext","createEphemeralRegisterRateLimitPreHandler","registerRoute","method","path","description","schema","body","response","preHandler","errorHandler","error","request","message","status","runner","kind","log","warn","ephemeralTokenId","provisionerId","handler","result","credential","registrationTokenId","workspaceId","labels","toolCapabilities","capabilities","session_token","sessionToken","session_id","session","id","mode","max_claims","maxClaims"],"mappings":"AAAA,SAAQA,wBAAwB,EAAEC,4BAA4B,QAAO,2BAA2B;AAChG,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SACEC,sBAAsB,EACtBC,8BAA8B,EAC9BC,6BAA6B,QACxB,kBAAkB;AACzB,SAAQC,qBAAqB,QAAO,2BAA2B;AAC/D,SAAQC,gBAAgB,QAAO,8BAA8B;AAC7D,SAAQC,0CAA0C,QAAO,kBAAkB;AAE3E,OAAO,MAAMC,gBAAgBP,YAAY;IACvCQ,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMf;QACNgB,UAAU;YACR,KAAKf;QACP;IACF;IACAgB,YAAYR;IACZS,cAAc,CAACC,OAAOC;QACpB,IAAID,iBAAiBf,wBAAwB;YAC3C,MAAM,IAAIF,YAAYiB,MAAME,OAAO,EAAE,uBAAuB;gBAACC,QAAQ;YAAG;QAC1E;QACA,IAAIH,iBAAiBd,gCAAgC;YACnD,MAAMkB,SAASf,iBAAiBY;YAChC,IAAIG,OAAOC,IAAI,KAAK,aAAa;gBAC/BJ,QAAQK,GAAG,CAACC,IAAI,CACd;oBACEC,kBAAkBR,MAAMQ,gBAAgB;oBACxCC,eAAeL,OAAOK,aAAa;gBACrC,GACA;YAEJ;YACA,MAAM,IAAI1B,YACR,gDACA,+BACA;gBACEoB,QAAQ;YACV;QAEJ;QACA,IAAIH,iBAAiBb,+BAA+B;YAClD,MAAM,IAAIJ,YAAY,kCAAkC,8BAA8B;gBACpFoB,QAAQ;YACV;QACF;QACA,MAAMH;IACR;IACAU,SAAS,OAAOT;QACd,MAAMG,SAASf,iBAAiBY;QAChC,MAAMU,SAAS,MAAMvB,sBAAsB;YACzCwB,YACER,OAAOC,IAAI,KAAK,WACZ;gBACEA,MAAM;gBACNQ,qBAAqBT,OAAOS,mBAAmB;gBAC/CC,aAAaV,OAAOU,WAAW;YACjC,IACAV;YACNW,QAAQd,QAAQL,IAAI,CAACmB,MAAM;YAC3BC,kBAAkBf,QAAQL,IAAI,CAACqB,YAAY,IAAI;QACjD;QAEA,OAAO;YACLC,eAAeP,OAAOQ,YAAY;YAClCC,YAAYT,OAAOU,OAAO,CAACC,EAAE;YAC7BC,MAAMZ,OAAOY,IAAI;YACjBC,YAAYb,OAAOc,SAAS;QAC9B;IACF;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-provisioned-runners.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/report-provisioned-runners.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,6BAA6B,iDA8BxC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { requireProvisionerContext } from '@shipfox/api-auth-context';
|
|
2
|
+
import { reportProvisionedRunnersBodySchema, reportProvisionedRunnersResponseSchema } from '@shipfox/api-runners-dto';
|
|
3
|
+
import { defineRoute } from '@shipfox/node-fastify';
|
|
4
|
+
import { reportProvisionedRunners } from '#core/index.js';
|
|
5
|
+
import { toReportProvisionedRunnersResponseDto } from '#presentation/dto/index.js';
|
|
6
|
+
export const reportProvisionedRunnersRoute = defineRoute({
|
|
7
|
+
method: 'POST',
|
|
8
|
+
path: '/provisioned-runners/report',
|
|
9
|
+
description: 'Report provisioned runner lifecycle state',
|
|
10
|
+
schema: {
|
|
11
|
+
body: reportProvisionedRunnersBodySchema,
|
|
12
|
+
response: {
|
|
13
|
+
200: reportProvisionedRunnersResponseSchema
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
handler: async (request)=>{
|
|
17
|
+
const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
|
|
18
|
+
const result = await reportProvisionedRunners({
|
|
19
|
+
workspaceId,
|
|
20
|
+
provisionerId: provisionerTokenId,
|
|
21
|
+
events: request.body.events.map((event)=>({
|
|
22
|
+
provisionedRunnerId: event.provisioned_runner_id,
|
|
23
|
+
reservationId: event.reservation_id ?? null,
|
|
24
|
+
templateKey: event.template_key ?? null,
|
|
25
|
+
labels: event.labels,
|
|
26
|
+
state: event.state,
|
|
27
|
+
reason: event.reason ?? null,
|
|
28
|
+
runnerSessionId: event.runner_session_id ?? null,
|
|
29
|
+
providerKind: event.provider_kind ?? null,
|
|
30
|
+
reportedAt: new Date(event.reported_at)
|
|
31
|
+
}))
|
|
32
|
+
});
|
|
33
|
+
return toReportProvisionedRunnersResponseDto(result);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=report-provisioned-runners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/report-provisioned-runners.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n reportProvisionedRunnersBodySchema,\n reportProvisionedRunnersResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {reportProvisionedRunners} from '#core/index.js';\nimport {toReportProvisionedRunnersResponseDto} from '#presentation/dto/index.js';\n\nexport const reportProvisionedRunnersRoute = defineRoute({\n method: 'POST',\n path: '/provisioned-runners/report',\n description: 'Report provisioned runner lifecycle state',\n schema: {\n body: reportProvisionedRunnersBodySchema,\n response: {\n 200: reportProvisionedRunnersResponseSchema,\n },\n },\n handler: async (request) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const result = await reportProvisionedRunners({\n workspaceId,\n provisionerId: provisionerTokenId,\n events: request.body.events.map((event) => ({\n provisionedRunnerId: event.provisioned_runner_id,\n reservationId: event.reservation_id ?? null,\n templateKey: event.template_key ?? null,\n labels: event.labels,\n state: event.state,\n reason: event.reason ?? null,\n runnerSessionId: event.runner_session_id ?? null,\n providerKind: event.provider_kind ?? null,\n reportedAt: new Date(event.reported_at),\n })),\n });\n\n return toReportProvisionedRunnersResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","reportProvisionedRunnersBodySchema","reportProvisionedRunnersResponseSchema","defineRoute","reportProvisionedRunners","toReportProvisionedRunnersResponseDto","reportProvisionedRunnersRoute","method","path","description","schema","body","response","handler","request","provisionerTokenId","workspaceId","result","provisionerId","events","map","event","provisionedRunnerId","provisioned_runner_id","reservationId","reservation_id","templateKey","template_key","labels","state","reason","runnerSessionId","runner_session_id","providerKind","provider_kind","reportedAt","Date","reported_at"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,kCAAkC,EAClCC,sCAAsC,QACjC,2BAA2B;AAClC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,wBAAwB,QAAO,iBAAiB;AACxD,SAAQC,qCAAqC,QAAO,6BAA6B;AAEjF,OAAO,MAAMC,gCAAgCH,YAAY;IACvDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGhB,0BAA0Bc;QACpE,MAAMG,SAAS,MAAMb,yBAAyB;YAC5CY;YACAE,eAAeH;YACfI,QAAQL,QAAQH,IAAI,CAACQ,MAAM,CAACC,GAAG,CAAC,CAACC,QAAW,CAAA;oBAC1CC,qBAAqBD,MAAME,qBAAqB;oBAChDC,eAAeH,MAAMI,cAAc,IAAI;oBACvCC,aAAaL,MAAMM,YAAY,IAAI;oBACnCC,QAAQP,MAAMO,MAAM;oBACpBC,OAAOR,MAAMQ,KAAK;oBAClBC,QAAQT,MAAMS,MAAM,IAAI;oBACxBC,iBAAiBV,MAAMW,iBAAiB,IAAI;oBAC5CC,cAAcZ,MAAMa,aAAa,IAAI;oBACrCC,YAAY,IAAIC,KAAKf,MAAMgB,WAAW;gBACxC,CAAA;QACF;QAEA,OAAOhC,sCAAsCY;IAC/C;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-job.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/request-job.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,iDAwC1B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { requireRunnerSessionContext } from '@shipfox/api-auth-context';
|
|
2
|
+
import { claimedJobResponseSchema } from '@shipfox/api-runners-dto';
|
|
3
|
+
import { ClientError, defineRoute } from '@shipfox/node-fastify';
|
|
4
|
+
import { RunnerSessionExhaustedError } from '#core/errors.js';
|
|
5
|
+
import { claimJobExecution } from '#core/job-executions.js';
|
|
6
|
+
export const requestJobRoute = defineRoute({
|
|
7
|
+
method: 'POST',
|
|
8
|
+
path: '/request',
|
|
9
|
+
description: 'Claim the next available job execution and receive its lease token',
|
|
10
|
+
schema: {
|
|
11
|
+
response: {
|
|
12
|
+
200: claimedJobResponseSchema
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
errorHandler: (error)=>{
|
|
16
|
+
if (error instanceof RunnerSessionExhaustedError) {
|
|
17
|
+
throw new ClientError('Runner session claim limit exhausted', 'runner-session-exhausted', {
|
|
18
|
+
status: 409
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
},
|
|
23
|
+
handler: async (_request, reply)=>{
|
|
24
|
+
const runner = requireRunnerSessionContext(_request);
|
|
25
|
+
const jobExecution = await claimJobExecution({
|
|
26
|
+
workspaceId: runner.workspaceId,
|
|
27
|
+
runnerSessionId: runner.runnerSessionId,
|
|
28
|
+
sessionLabels: runner.labels,
|
|
29
|
+
maxClaims: runner.maxClaims
|
|
30
|
+
});
|
|
31
|
+
if (!jobExecution) {
|
|
32
|
+
reply.status(204);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
workflow_run_id: jobExecution.workflowRunId,
|
|
37
|
+
workflow_run_attempt_id: jobExecution.workflowRunAttemptId,
|
|
38
|
+
job_id: jobExecution.jobId,
|
|
39
|
+
job_execution_id: jobExecution.jobExecutionId,
|
|
40
|
+
lease_token: jobExecution.leaseToken
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=request-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/request-job.ts"],"sourcesContent":["import {requireRunnerSessionContext} from '@shipfox/api-auth-context';\nimport {claimedJobResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {RunnerSessionExhaustedError} from '#core/errors.js';\nimport {claimJobExecution} from '#core/job-executions.js';\n\nexport const requestJobRoute = defineRoute({\n method: 'POST',\n path: '/request',\n description: 'Claim the next available job execution and receive its lease token',\n schema: {\n response: {\n 200: claimedJobResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof RunnerSessionExhaustedError) {\n throw new ClientError('Runner session claim limit exhausted', 'runner-session-exhausted', {\n status: 409,\n });\n }\n throw error;\n },\n handler: async (_request, reply) => {\n const runner = requireRunnerSessionContext(_request);\n\n const jobExecution = await claimJobExecution({\n workspaceId: runner.workspaceId,\n runnerSessionId: runner.runnerSessionId,\n sessionLabels: runner.labels,\n maxClaims: runner.maxClaims,\n });\n\n if (!jobExecution) {\n reply.status(204);\n return;\n }\n\n return {\n workflow_run_id: jobExecution.workflowRunId,\n workflow_run_attempt_id: jobExecution.workflowRunAttemptId,\n job_id: jobExecution.jobId,\n job_execution_id: jobExecution.jobExecutionId,\n lease_token: jobExecution.leaseToken,\n };\n },\n});\n"],"names":["requireRunnerSessionContext","claimedJobResponseSchema","ClientError","defineRoute","RunnerSessionExhaustedError","claimJobExecution","requestJobRoute","method","path","description","schema","response","errorHandler","error","status","handler","_request","reply","runner","jobExecution","workspaceId","runnerSessionId","sessionLabels","labels","maxClaims","workflow_run_id","workflowRunId","workflow_run_attempt_id","workflowRunAttemptId","job_id","jobId","job_execution_id","jobExecutionId","lease_token","leaseToken"],"mappings":"AAAA,SAAQA,2BAA2B,QAAO,4BAA4B;AACtE,SAAQC,wBAAwB,QAAO,2BAA2B;AAClE,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,2BAA2B,QAAO,kBAAkB;AAC5D,SAAQC,iBAAiB,QAAO,0BAA0B;AAE1D,OAAO,MAAMC,kBAAkBH,YAAY;IACzCI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,UAAU;YACR,KAAKV;QACP;IACF;IACAW,cAAc,CAACC;QACb,IAAIA,iBAAiBT,6BAA6B;YAChD,MAAM,IAAIF,YAAY,wCAAwC,4BAA4B;gBACxFY,QAAQ;YACV;QACF;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC,UAAUC;QACxB,MAAMC,SAASlB,4BAA4BgB;QAE3C,MAAMG,eAAe,MAAMd,kBAAkB;YAC3Ce,aAAaF,OAAOE,WAAW;YAC/BC,iBAAiBH,OAAOG,eAAe;YACvCC,eAAeJ,OAAOK,MAAM;YAC5BC,WAAWN,OAAOM,SAAS;QAC7B;QAEA,IAAI,CAACL,cAAc;YACjBF,MAAMH,MAAM,CAAC;YACb;QACF;QAEA,OAAO;YACLW,iBAAiBN,aAAaO,aAAa;YAC3CC,yBAAyBR,aAAaS,oBAAoB;YAC1DC,QAAQV,aAAaW,KAAK;YAC1BC,kBAAkBZ,aAAaa,cAAc;YAC7CC,aAAad,aAAae,UAAU;QACtC;IACF;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revoke-manual-registration-token.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/revoke-manual-registration-token.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kCAAkC,iDAwB7C,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { revokeManualRegistrationTokenResponseSchema } from '@shipfox/api-runners-dto';
|
|
2
|
+
import { ClientError, defineRoute } from '@shipfox/node-fastify';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { ManualRegistrationTokenNotFoundError, revokeWorkspaceManualRegistrationToken } from '#core/index.js';
|
|
5
|
+
import { toManualRegistrationTokenDto } from '#presentation/dto/index.js';
|
|
6
|
+
import { requireManualRegistrationTokenWorkspaceMembership } from './workspace-membership.js';
|
|
7
|
+
export const revokeManualRegistrationTokenRoute = defineRoute({
|
|
8
|
+
method: 'POST',
|
|
9
|
+
path: '/:tokenId/revoke',
|
|
10
|
+
description: 'Stop a manual registration token from being used to connect to your account',
|
|
11
|
+
schema: {
|
|
12
|
+
params: z.object({
|
|
13
|
+
workspaceId: z.string().uuid(),
|
|
14
|
+
tokenId: z.string().uuid()
|
|
15
|
+
}),
|
|
16
|
+
response: {
|
|
17
|
+
200: revokeManualRegistrationTokenResponseSchema
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
errorHandler: (error)=>{
|
|
21
|
+
if (error instanceof ManualRegistrationTokenNotFoundError) {
|
|
22
|
+
throw new ClientError('Manual registration token not found', 'not-found', {
|
|
23
|
+
status: 404
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
},
|
|
28
|
+
handler: async (request)=>{
|
|
29
|
+
const { workspaceId, tokenId } = request.params;
|
|
30
|
+
requireManualRegistrationTokenWorkspaceMembership({
|
|
31
|
+
request,
|
|
32
|
+
workspaceId
|
|
33
|
+
});
|
|
34
|
+
const revoked = await revokeWorkspaceManualRegistrationToken({
|
|
35
|
+
tokenId,
|
|
36
|
+
workspaceId
|
|
37
|
+
});
|
|
38
|
+
return toManualRegistrationTokenDto(revoked);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=revoke-manual-registration-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/revoke-manual-registration-token.ts"],"sourcesContent":["import {revokeManualRegistrationTokenResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {\n ManualRegistrationTokenNotFoundError,\n revokeWorkspaceManualRegistrationToken,\n} from '#core/index.js';\nimport {toManualRegistrationTokenDto} from '#presentation/dto/index.js';\nimport {requireManualRegistrationTokenWorkspaceMembership} from './workspace-membership.js';\n\nexport const revokeManualRegistrationTokenRoute = defineRoute({\n method: 'POST',\n path: '/:tokenId/revoke',\n description: 'Stop a manual registration token from being used to connect to your account',\n schema: {\n params: z.object({workspaceId: z.string().uuid(), tokenId: z.string().uuid()}),\n response: {\n 200: revokeManualRegistrationTokenResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof ManualRegistrationTokenNotFoundError) {\n throw new ClientError('Manual registration token not found', 'not-found', {status: 404});\n }\n throw error;\n },\n handler: async (request) => {\n const {workspaceId, tokenId} = request.params;\n requireManualRegistrationTokenWorkspaceMembership({request, workspaceId});\n\n const revoked = await revokeWorkspaceManualRegistrationToken({tokenId, workspaceId});\n\n return toManualRegistrationTokenDto(revoked);\n },\n});\n"],"names":["revokeManualRegistrationTokenResponseSchema","ClientError","defineRoute","z","ManualRegistrationTokenNotFoundError","revokeWorkspaceManualRegistrationToken","toManualRegistrationTokenDto","requireManualRegistrationTokenWorkspaceMembership","revokeManualRegistrationTokenRoute","method","path","description","schema","params","object","workspaceId","string","uuid","tokenId","response","errorHandler","error","status","handler","request","revoked"],"mappings":"AAAA,SAAQA,2CAA2C,QAAO,2BAA2B;AACrF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SACEC,oCAAoC,EACpCC,sCAAsC,QACjC,iBAAiB;AACxB,SAAQC,4BAA4B,QAAO,6BAA6B;AACxE,SAAQC,iDAAiD,QAAO,4BAA4B;AAE5F,OAAO,MAAMC,qCAAqCN,YAAY;IAC5DO,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,QAAQV,EAAEW,MAAM,CAAC;YAACC,aAAaZ,EAAEa,MAAM,GAAGC,IAAI;YAAIC,SAASf,EAAEa,MAAM,GAAGC,IAAI;QAAE;QAC5EE,UAAU;YACR,KAAKnB;QACP;IACF;IACAoB,cAAc,CAACC;QACb,IAAIA,iBAAiBjB,sCAAsC;YACzD,MAAM,IAAIH,YAAY,uCAAuC,aAAa;gBAACqB,QAAQ;YAAG;QACxF;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC;QACd,MAAM,EAACT,WAAW,EAAEG,OAAO,EAAC,GAAGM,QAAQX,MAAM;QAC7CN,kDAAkD;YAACiB;YAAST;QAAW;QAEvE,MAAMU,UAAU,MAAMpB,uCAAuC;YAACa;YAASH;QAAW;QAElF,OAAOT,6BAA6BmB;IACtC;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revoke-provisioner-token.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/revoke-provisioner-token.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,2BAA2B,iDA6BtC,CAAC"}
|