@shipfox/api-runners 5.0.0 → 7.0.1
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 +6 -6
- package/CHANGELOG.md +80 -0
- package/dist/config.d.ts +5 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +54 -7
- package/dist/config.js.map +1 -1
- package/dist/core/demand.d.ts +6 -6
- package/dist/core/demand.d.ts.map +1 -1
- package/dist/core/demand.js +10 -10
- package/dist/core/demand.js.map +1 -1
- package/dist/core/entities/ephemeral-registration-token.d.ts +1 -1
- package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -1
- package/dist/core/entities/ephemeral-registration-token.js.map +1 -1
- package/dist/core/entities/provisioner-capability-snapshot.d.ts +13 -0
- package/dist/core/entities/provisioner-capability-snapshot.d.ts.map +1 -0
- package/dist/core/entities/provisioner-capability-snapshot.js +3 -0
- package/dist/core/entities/provisioner-capability-snapshot.js.map +1 -0
- package/dist/core/entities/provisioner-token.d.ts +10 -2
- package/dist/core/entities/provisioner-token.d.ts.map +1 -1
- package/dist/core/entities/provisioner-token.js.map +1 -1
- package/dist/core/entities/{provisioned-runner.d.ts → runner-instance.d.ts} +7 -6
- package/dist/core/entities/runner-instance.d.ts.map +1 -0
- package/dist/core/entities/runner-instance.js +3 -0
- package/dist/core/entities/runner-instance.js.map +1 -0
- package/dist/core/entities/runner-session.d.ts +4 -2
- package/dist/core/entities/runner-session.d.ts.map +1 -1
- package/dist/core/entities/runner-session.js.map +1 -1
- package/dist/core/ephemeral-registration-tokens.d.ts +5 -5
- package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/core/ephemeral-registration-tokens.js +12 -12
- package/dist/core/ephemeral-registration-tokens.js.map +1 -1
- package/dist/core/errors.d.ts +16 -4
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +22 -4
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +9 -5
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/job-executions.d.ts +2 -0
- package/dist/core/job-executions.d.ts.map +1 -1
- package/dist/core/job-executions.js +1 -2
- package/dist/core/job-executions.js.map +1 -1
- package/dist/core/maintenance.d.ts +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +5 -5
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/provisioner-capability-snapshots.d.ts +5 -0
- package/dist/core/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/core/provisioner-capability-snapshots.js +10 -0
- package/dist/core/provisioner-capability-snapshots.js.map +1 -0
- package/dist/core/provisioner-tokens.d.ts +10 -0
- package/dist/core/provisioner-tokens.d.ts.map +1 -1
- package/dist/core/provisioner-tokens.js +23 -1
- package/dist/core/provisioner-tokens.js.map +1 -1
- package/dist/core/rate-limit.d.ts.map +1 -1
- package/dist/core/rate-limit.js +2 -7
- package/dist/core/rate-limit.js.map +1 -1
- package/dist/core/runner-activation.d.ts +13 -0
- package/dist/core/runner-activation.d.ts.map +1 -0
- package/dist/core/runner-activation.js +36 -0
- package/dist/core/runner-activation.js.map +1 -0
- package/dist/core/runner-assignments.d.ts +6 -0
- package/dist/core/runner-assignments.d.ts.map +1 -0
- package/dist/core/runner-assignments.js +6 -0
- package/dist/core/runner-assignments.js.map +1 -0
- package/dist/core/runner-control-sessions.d.ts +46 -0
- package/dist/core/runner-control-sessions.d.ts.map +1 -0
- package/dist/core/runner-control-sessions.js +121 -0
- package/dist/core/runner-control-sessions.js.map +1 -0
- package/dist/core/runner-instances.d.ts +72 -0
- package/dist/core/runner-instances.d.ts.map +1 -0
- package/dist/core/runner-instances.js +165 -0
- package/dist/core/runner-instances.js.map +1 -0
- package/dist/core/runner-sessions.d.ts +8 -2
- package/dist/core/runner-sessions.d.ts.map +1 -1
- package/dist/core/runner-sessions.js +8 -5
- package/dist/core/runner-sessions.js.map +1 -1
- package/dist/db/db.d.ts +2698 -1054
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +9 -2
- package/dist/db/db.js.map +1 -1
- package/dist/db/ephemeral-registration-tokens.d.ts +2 -2
- package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/db/ephemeral-registration-tokens.js +21 -21
- package/dist/db/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/index.d.ts +7 -4
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +5 -2
- package/dist/db/index.js.map +1 -1
- package/dist/db/job-executions.d.ts +6 -6
- package/dist/db/job-executions.d.ts.map +1 -1
- package/dist/db/job-executions.js +20 -19
- package/dist/db/job-executions.js.map +1 -1
- package/dist/db/provisioner-capability-snapshots.d.ts +21 -0
- package/dist/db/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/db/provisioner-capability-snapshots.js +57 -0
- package/dist/db/provisioner-capability-snapshots.js.map +1 -0
- package/dist/db/provisioner-tokens.d.ts +7 -2
- package/dist/db/provisioner-tokens.d.ts.map +1 -1
- package/dist/db/provisioner-tokens.js +59 -10
- package/dist/db/provisioner-tokens.js.map +1 -1
- package/dist/db/reservations.d.ts +18 -0
- package/dist/db/reservations.d.ts.map +1 -1
- package/dist/db/reservations.js +88 -1
- package/dist/db/reservations.js.map +1 -1
- package/dist/db/runner-assignments.d.ts +7 -0
- package/dist/db/runner-assignments.d.ts.map +1 -0
- package/dist/db/runner-assignments.js +55 -0
- package/dist/db/runner-assignments.js.map +1 -0
- package/dist/db/runner-instances.d.ts +84 -0
- package/dist/db/runner-instances.d.ts.map +1 -0
- package/dist/db/runner-instances.js +497 -0
- package/dist/db/runner-instances.js.map +1 -0
- package/dist/db/runner-sessions.d.ts +5 -0
- package/dist/db/runner-sessions.d.ts.map +1 -1
- package/dist/db/runner-sessions.js +48 -2
- package/dist/db/runner-sessions.js.map +1 -1
- package/dist/db/schema/ephemeral-registration-tokens.d.ts +2 -2
- package/dist/db/schema/ephemeral-registration-tokens.js +3 -3
- package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/schema/provisioner-capability-snapshots.d.ts +207 -0
- package/dist/db/schema/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/db/schema/provisioner-capability-snapshots.js +38 -0
- package/dist/db/schema/provisioner-capability-snapshots.js.map +1 -0
- package/dist/db/schema/provisioner-tokens.d.ts +19 -1
- package/dist/db/schema/provisioner-tokens.d.ts.map +1 -1
- package/dist/db/schema/provisioner-tokens.js +29 -3
- package/dist/db/schema/provisioner-tokens.js.map +1 -1
- package/dist/db/schema/runner-activation-tokens.d.ts +161 -0
- package/dist/db/schema/runner-activation-tokens.d.ts.map +1 -0
- package/dist/db/schema/runner-activation-tokens.js +27 -0
- package/dist/db/schema/runner-activation-tokens.js.map +1 -0
- package/dist/db/schema/runner-control-sessions.d.ts +338 -0
- package/dist/db/schema/runner-control-sessions.d.ts.map +1 -0
- package/dist/db/schema/runner-control-sessions.js +52 -0
- package/dist/db/schema/runner-control-sessions.js.map +1 -0
- package/dist/db/schema/{provisioned-runners.d.ts → runner-instances.d.ts} +105 -34
- package/dist/db/schema/runner-instances.d.ts.map +1 -0
- package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +23 -14
- package/dist/db/schema/runner-instances.js.map +1 -0
- package/dist/db/schema/runner-sessions.d.ts +39 -5
- package/dist/db/schema/runner-sessions.d.ts.map +1 -1
- package/dist/db/schema/runner-sessions.js +13 -6
- package/dist/db/schema/runner-sessions.js.map +1 -1
- package/dist/db/schema/running-job-executions.d.ts +2 -2
- package/dist/db/schema/running-job-executions.js +4 -4
- package/dist/db/schema/running-job-executions.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -39
- package/dist/index.js.map +1 -1
- package/dist/installation-provisioning.d.ts +14 -0
- package/dist/installation-provisioning.d.ts.map +1 -0
- package/dist/installation-provisioning.js +7 -0
- package/dist/installation-provisioning.js.map +1 -0
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/instance.d.ts +11 -7
- package/dist/metrics/instance.d.ts.map +1 -1
- package/dist/metrics/instance.js +13 -7
- package/dist/metrics/instance.js.map +1 -1
- package/dist/presentation/auth/index.d.ts +1 -0
- package/dist/presentation/auth/index.d.ts.map +1 -1
- package/dist/presentation/auth/index.js +1 -0
- package/dist/presentation/auth/index.js.map +1 -1
- package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -1
- package/dist/presentation/auth/provisioner-token-auth.js +5 -1
- package/dist/presentation/auth/provisioner-token-auth.js.map +1 -1
- package/dist/presentation/auth/runner-control-session-auth.d.ts +4 -0
- package/dist/presentation/auth/runner-control-session-auth.d.ts.map +1 -0
- package/dist/presentation/auth/runner-control-session-auth.js +29 -0
- package/dist/presentation/auth/runner-control-session-auth.js.map +1 -0
- package/dist/presentation/auth/runner-registration-token-auth.d.ts +5 -1
- package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -1
- package/dist/presentation/auth/runner-registration-token-auth.js +21 -1
- package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -1
- package/dist/presentation/dto/index.d.ts +1 -2
- package/dist/presentation/dto/index.d.ts.map +1 -1
- package/dist/presentation/dto/index.js +1 -2
- package/dist/presentation/dto/index.js.map +1 -1
- package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
- package/dist/presentation/dto/poll-demand.js +7 -1
- package/dist/presentation/dto/poll-demand.js.map +1 -1
- package/dist/presentation/dto/provisioner-token.d.ts +1 -0
- package/dist/presentation/dto/provisioner-token.d.ts.map +1 -1
- package/dist/presentation/dto/provisioner-token.js +5 -1
- package/dist/presentation/dto/provisioner-token.js.map +1 -1
- package/dist/presentation/dto/{provisioned-runners.d.ts → runner-instances.d.ts} +9 -9
- package/dist/presentation/dto/runner-instances.d.ts.map +1 -0
- package/dist/presentation/dto/{provisioned-runners.js → runner-instances.js} +6 -6
- package/dist/presentation/dto/runner-instances.js.map +1 -0
- package/dist/presentation/index.d.ts +2 -2
- package/dist/presentation/index.d.ts.map +1 -1
- package/dist/presentation/index.js +2 -2
- package/dist/presentation/index.js.map +1 -1
- package/dist/presentation/inter-module.d.ts +5 -0
- package/dist/presentation/inter-module.d.ts.map +1 -0
- package/dist/presentation/inter-module.js +43 -0
- package/dist/presentation/inter-module.js.map +1 -0
- package/dist/presentation/routes/assign-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/assign-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/assign-runner-instances.js +40 -0
- package/dist/presentation/routes/assign-runner-instances.js.map +1 -0
- package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -1
- package/dist/presentation/routes/get-provisioner-me.js +5 -1
- package/dist/presentation/routes/get-provisioner-me.js.map +1 -1
- package/dist/presentation/routes/heartbeat.d.ts +2 -1
- package/dist/presentation/routes/heartbeat.d.ts.map +1 -1
- package/dist/presentation/routes/heartbeat.js +60 -50
- package/dist/presentation/routes/heartbeat.js.map +1 -1
- package/dist/presentation/routes/index.d.ts +3 -1
- package/dist/presentation/routes/index.d.ts.map +1 -1
- package/dist/presentation/routes/index.js +80 -51
- package/dist/presentation/routes/index.js.map +1 -1
- package/dist/presentation/routes/poll-demand.d.ts +2 -0
- package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
- package/dist/presentation/routes/poll-demand.js +86 -45
- package/dist/presentation/routes/poll-demand.js.map +1 -1
- package/dist/presentation/routes/reconcile-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/reconcile-runner-instances.js +27 -0
- package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -0
- package/dist/presentation/routes/register.d.ts +2 -1
- package/dist/presentation/routes/register.d.ts.map +1 -1
- package/dist/presentation/routes/register.js +55 -52
- package/dist/presentation/routes/register.js.map +1 -1
- package/dist/presentation/routes/report-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/report-runner-instances.js +37 -0
- package/dist/presentation/routes/report-runner-instances.js.map +1 -0
- package/dist/presentation/routes/request-job.d.ts +2 -1
- package/dist/presentation/routes/request-job.d.ts.map +1 -1
- package/dist/presentation/routes/request-job.js +39 -36
- package/dist/presentation/routes/request-job.js.map +1 -1
- package/dist/presentation/routes/runner-enrollment.d.ts +8 -0
- package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
- package/dist/presentation/routes/runner-enrollment.js +212 -0
- package/dist/presentation/routes/runner-enrollment.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +2 -2
- package/dist/temporal/activities/index.d.ts.map +1 -1
- package/dist/temporal/activities/index.js +2 -2
- package/dist/temporal/activities/index.js.map +1 -1
- package/dist/temporal/activities/maintenance-activities.d.ts +1 -1
- package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -1
- package/dist/temporal/activities/maintenance-activities.js +3 -3
- package/dist/temporal/activities/maintenance-activities.js.map +1 -1
- package/dist/temporal/workflows/index.bundle.js +3 -3
- package/dist/temporal/workflows/stuck-job-detector.js +2 -2
- package/dist/temporal/workflows/stuck-job-detector.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0000_initial.sql +91 -24
- package/drizzle/meta/0000_snapshot.json +392 -63
- package/package.json +21 -16
- package/src/config.test.ts +0 -26
- package/src/config.ts +48 -7
- package/src/core/demand.test.ts +29 -29
- package/src/core/demand.ts +22 -22
- package/src/core/entities/ephemeral-registration-token.ts +1 -1
- package/src/core/entities/provisioner-capability-snapshot.ts +12 -0
- package/src/core/entities/provisioner-token.ts +8 -2
- package/src/core/entities/{provisioned-runner.ts → runner-instance.ts} +6 -5
- package/src/core/entities/runner-session.ts +4 -2
- package/src/core/ephemeral-registration-tokens.test.ts +11 -11
- package/src/core/ephemeral-registration-tokens.ts +18 -20
- package/src/core/errors.ts +23 -4
- package/src/core/index.ts +37 -22
- package/src/core/job-executions.ts +3 -2
- package/src/core/maintenance.test.ts +13 -17
- package/src/core/maintenance.ts +5 -5
- package/src/core/provisioner-capability-snapshots.test.ts +35 -0
- package/src/core/provisioner-capability-snapshots.ts +12 -0
- package/src/core/provisioner-tokens.test.ts +20 -0
- package/src/core/provisioner-tokens.ts +33 -0
- package/src/core/rate-limit.test.ts +11 -27
- package/src/core/rate-limit.ts +3 -11
- package/src/core/runner-activation.ts +72 -0
- package/src/core/runner-assignments.ts +9 -0
- package/src/core/runner-control-sessions.ts +190 -0
- package/src/core/{provisioned-runners.test.ts → runner-instances.test.ts} +24 -24
- package/src/core/runner-instances.ts +301 -0
- package/src/core/runner-sessions.test.ts +112 -22
- package/src/core/runner-sessions.ts +25 -14
- package/src/db/db.ts +9 -2
- package/src/db/ephemeral-registration-tokens.test.ts +9 -9
- package/src/db/ephemeral-registration-tokens.ts +26 -26
- package/src/db/index.ts +30 -21
- package/src/db/job-executions.test.ts +13 -11
- package/src/db/job-executions.ts +33 -27
- package/src/db/provisioner-capability-snapshots.test.ts +175 -0
- package/src/db/provisioner-capability-snapshots.ts +130 -0
- package/src/db/provisioner-tokens.test.ts +139 -2
- package/src/db/provisioner-tokens.ts +123 -15
- package/src/db/reservations.test.ts +49 -0
- package/src/db/reservations.ts +146 -1
- package/src/db/runner-assignments.test.ts +163 -0
- package/src/db/runner-assignments.ts +115 -0
- package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +442 -353
- package/src/db/runner-instances.ts +922 -0
- package/src/db/runner-sessions.test.ts +19 -6
- package/src/db/runner-sessions.ts +78 -2
- package/src/db/schema/ephemeral-registration-tokens.ts +4 -4
- package/src/db/schema/provisioner-capability-snapshots.ts +46 -0
- package/src/db/schema/provisioner-tokens.ts +33 -2
- package/src/db/schema/runner-activation-tokens.ts +22 -0
- package/src/db/schema/runner-control-sessions.ts +46 -0
- package/src/db/schema/{provisioned-runners.ts → runner-instances.ts} +28 -27
- package/src/db/schema/runner-sessions.ts +11 -7
- package/src/db/schema/running-job-executions.ts +5 -5
- package/src/index.test.ts +26 -0
- package/src/index.ts +38 -27
- package/src/installation-provisioning.ts +14 -0
- package/src/metrics/index.ts +5 -5
- package/src/metrics/instance.ts +25 -14
- package/src/presentation/auth/index.ts +4 -0
- package/src/presentation/auth/provisioner-token-auth.ts +8 -4
- package/src/presentation/auth/runner-control-session-auth.ts +31 -0
- package/src/presentation/auth/runner-registration-token-auth.ts +39 -3
- package/src/presentation/dto/index.ts +4 -8
- package/src/presentation/dto/poll-demand.ts +3 -1
- package/src/presentation/dto/provisioner-token.ts +5 -0
- package/src/presentation/dto/{provisioned-runners.ts → runner-instances.ts} +13 -15
- package/src/presentation/index.ts +2 -1
- package/src/presentation/inter-module.test.ts +15 -0
- package/src/presentation/inter-module.ts +53 -0
- package/src/presentation/routes/assign-runner-instances.ts +49 -0
- package/src/presentation/routes/get-provisioner-me.ts +3 -4
- package/src/presentation/routes/heartbeat.test.ts +4 -3
- package/src/presentation/routes/heartbeat.ts +67 -64
- package/src/presentation/routes/index.ts +91 -44
- package/src/presentation/routes/list-active-runners.test.ts +23 -23
- package/src/presentation/routes/manual-registration-tokens.test.ts +4 -3
- package/src/presentation/routes/poll-demand-release.test.ts +4 -4
- package/src/presentation/routes/poll-demand.test.ts +161 -22
- package/src/presentation/routes/poll-demand.ts +105 -45
- package/src/presentation/routes/provisioner-me.test.ts +37 -3
- package/src/presentation/routes/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +66 -61
- package/src/presentation/routes/reconcile-runner-instances.ts +30 -0
- package/src/presentation/routes/register.test.ts +9 -5
- package/src/presentation/routes/register.ts +61 -57
- package/src/presentation/routes/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +28 -28
- package/src/presentation/routes/{report-provisioned-runners.ts → report-runner-instances.ts} +14 -14
- package/src/presentation/routes/request-job.test.ts +5 -3
- package/src/presentation/routes/request-job.ts +41 -37
- package/src/presentation/routes/runner-enrollment.test.ts +319 -0
- package/src/presentation/routes/runner-enrollment.ts +196 -0
- package/src/temporal/activities/index.ts +2 -2
- package/src/temporal/activities/maintenance-activities.test.ts +7 -7
- package/src/temporal/activities/maintenance-activities.ts +3 -3
- package/src/temporal/workflows/stuck-job-detector.test.ts +3 -3
- package/src/temporal/workflows/stuck-job-detector.ts +2 -2
- package/test/env.ts +1 -3
- package/test/factories/ephemeral-registration-token.ts +2 -2
- package/test/factories/provisioner-token.ts +3 -1
- package/test/factories/runner-instance.ts +57 -0
- package/test/factories/runner-session.ts +3 -1
- package/test/fixtures/auth-inter-module.ts +30 -0
- package/test/globalSetup.ts +4 -1
- package/test/index.ts +2 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/core/entities/provisioned-runner.d.ts.map +0 -1
- package/dist/core/entities/provisioned-runner.js +0 -3
- package/dist/core/entities/provisioned-runner.js.map +0 -1
- package/dist/core/provisioned-runners.d.ts +0 -67
- package/dist/core/provisioned-runners.d.ts.map +0 -1
- package/dist/core/provisioned-runners.js +0 -162
- package/dist/core/provisioned-runners.js.map +0 -1
- package/dist/db/provisioned-runners.d.ts +0 -79
- package/dist/db/provisioned-runners.d.ts.map +0 -1
- package/dist/db/provisioned-runners.js +0 -466
- package/dist/db/provisioned-runners.js.map +0 -1
- package/dist/db/schema/provisioned-runners.d.ts.map +0 -1
- package/dist/db/schema/provisioned-runners.js.map +0 -1
- package/dist/presentation/dto/mint-registration-tokens.d.ts +0 -5
- package/dist/presentation/dto/mint-registration-tokens.d.ts.map +0 -1
- package/dist/presentation/dto/mint-registration-tokens.js +0 -19
- package/dist/presentation/dto/mint-registration-tokens.js.map +0 -1
- package/dist/presentation/dto/provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/dto/provisioned-runners.js.map +0 -1
- package/dist/presentation/routes/mint-registration-tokens.d.ts +0 -2
- package/dist/presentation/routes/mint-registration-tokens.d.ts.map +0 -1
- package/dist/presentation/routes/mint-registration-tokens.js +0 -74
- package/dist/presentation/routes/mint-registration-tokens.js.map +0 -1
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +0 -2
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/routes/reconcile-provisioned-runners.js +0 -27
- package/dist/presentation/routes/reconcile-provisioned-runners.js.map +0 -1
- package/dist/presentation/routes/report-provisioned-runners.d.ts +0 -2
- package/dist/presentation/routes/report-provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/routes/report-provisioned-runners.js +0 -37
- package/dist/presentation/routes/report-provisioned-runners.js.map +0 -1
- package/src/core/provisioned-runners.ts +0 -301
- package/src/db/provisioned-runners.ts +0 -886
- package/src/presentation/dto/mint-registration-tokens.ts +0 -35
- package/src/presentation/routes/mint-registration-tokens.test.ts +0 -453
- package/src/presentation/routes/mint-registration-tokens.ts +0 -82
- package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
- package/test/factories/provisioned-runner.ts +0 -78
|
@@ -17,17 +17,22 @@ import {vi} from '@shipfox/vitest/vi';
|
|
|
17
17
|
import {and, desc, eq} from 'drizzle-orm';
|
|
18
18
|
import type {FastifyInstance, FastifyRequest} from 'fastify';
|
|
19
19
|
import {db} from '#db/db.js';
|
|
20
|
-
import {provisionedRunners} from '#db/schema/provisioned-runners.js';
|
|
21
20
|
import {reservations} from '#db/schema/reservations.js';
|
|
21
|
+
import {providerRunners} from '#db/schema/runner-instances.js';
|
|
22
22
|
import {runningJobExecutions} from '#db/schema/running-job-executions.js';
|
|
23
23
|
import {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
providerRunnerAbsentTerminatedCount,
|
|
25
|
+
providerRunnerReconcileCallCount,
|
|
26
|
+
providerRunnerTerminateIntentIssuedCount,
|
|
27
27
|
reservationReleasedCount,
|
|
28
28
|
} from '#metrics/instance.js';
|
|
29
|
-
import {
|
|
30
|
-
|
|
29
|
+
import {
|
|
30
|
+
providerRunnerFactory,
|
|
31
|
+
reservationFactory,
|
|
32
|
+
runnerSessionFactory,
|
|
33
|
+
runnersTestAuthClient,
|
|
34
|
+
} from '#test/index.js';
|
|
35
|
+
import {createRunnerRoutes} from './index.js';
|
|
31
36
|
|
|
32
37
|
const VALID_PROVISIONER_TOKEN = 'valid-provisioner-token';
|
|
33
38
|
|
|
@@ -36,7 +41,7 @@ const passthroughAuth = (name: string): AuthMethod => ({
|
|
|
36
41
|
authenticate: () => Promise.resolve(),
|
|
37
42
|
});
|
|
38
43
|
|
|
39
|
-
describe('POST /provisioners/
|
|
44
|
+
describe('POST /provisioners/runner-instances/reconcile', () => {
|
|
40
45
|
let app: FastifyInstance;
|
|
41
46
|
let workspaceId: string;
|
|
42
47
|
let provisionerTokenId: string;
|
|
@@ -48,7 +53,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
48
53
|
if (rawToken !== VALID_PROVISIONER_TOKEN) {
|
|
49
54
|
throw new ClientError('Invalid provisioner token', 'unauthorized', {status: 401});
|
|
50
55
|
}
|
|
51
|
-
setProvisionerContext(request, {workspaceId, provisionerTokenId});
|
|
56
|
+
setProvisionerContext(request, {scope: 'workspace', workspaceId, provisionerTokenId});
|
|
52
57
|
return Promise.resolve();
|
|
53
58
|
},
|
|
54
59
|
};
|
|
@@ -62,7 +67,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
62
67
|
passthroughAuth(AUTH_LEASED_JOB),
|
|
63
68
|
fakeProvisionerAuth,
|
|
64
69
|
],
|
|
65
|
-
routes:
|
|
70
|
+
routes: createRunnerRoutes(runnersTestAuthClient),
|
|
66
71
|
swagger: false,
|
|
67
72
|
});
|
|
68
73
|
await app.ready();
|
|
@@ -81,27 +86,27 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
81
86
|
const jobId = crypto.randomUUID();
|
|
82
87
|
const workflowRunId = crypto.randomUUID();
|
|
83
88
|
const workflowRunAttemptId = crypto.randomUUID();
|
|
84
|
-
await
|
|
89
|
+
await createRunnerInstance({providerRunnerId: 'provisioned-runner-1'});
|
|
85
90
|
await insertRunningJob({
|
|
86
91
|
jobId,
|
|
87
92
|
workflowRunId,
|
|
88
93
|
workflowRunAttemptId,
|
|
89
|
-
|
|
94
|
+
providerRunnerId: 'provisioned-runner-1',
|
|
90
95
|
lastHeartbeatAt: new Date('2025-01-01T00:00:00.000Z'),
|
|
91
96
|
});
|
|
92
97
|
|
|
93
98
|
const res = await app.inject({
|
|
94
99
|
method: 'POST',
|
|
95
|
-
url: '/provisioners/
|
|
100
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
96
101
|
headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
|
|
97
|
-
payload: {
|
|
102
|
+
payload: {observed_provider_runner_ids: ['provisioned-runner-1']},
|
|
98
103
|
});
|
|
99
104
|
|
|
100
105
|
expect(res.statusCode).toBe(200);
|
|
101
106
|
expect(res.json()).toEqual({
|
|
102
107
|
runners: [
|
|
103
108
|
{
|
|
104
|
-
|
|
109
|
+
provider_runner_id: 'provisioned-runner-1',
|
|
105
110
|
state: 'running',
|
|
106
111
|
reservation_id: null,
|
|
107
112
|
runner_session_id: null,
|
|
@@ -114,26 +119,26 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
114
119
|
desired_intent: 'keep',
|
|
115
120
|
},
|
|
116
121
|
],
|
|
117
|
-
|
|
122
|
+
terminated_absent_provider_runner_ids: [],
|
|
118
123
|
});
|
|
119
124
|
});
|
|
120
125
|
|
|
121
126
|
it('returns terminate for an observed terminal runner', async () => {
|
|
122
|
-
await
|
|
123
|
-
|
|
127
|
+
await createRunnerInstance({
|
|
128
|
+
providerRunnerId: 'provisioned-runner-1',
|
|
124
129
|
state: 'stopped',
|
|
125
130
|
});
|
|
126
131
|
|
|
127
132
|
const res = await app.inject({
|
|
128
133
|
method: 'POST',
|
|
129
|
-
url: '/provisioners/
|
|
134
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
130
135
|
headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
|
|
131
|
-
payload: {
|
|
136
|
+
payload: {observed_provider_runner_ids: ['provisioned-runner-1']},
|
|
132
137
|
});
|
|
133
138
|
|
|
134
139
|
expect(res.statusCode).toBe(200);
|
|
135
140
|
expect(res.json().runners[0]).toMatchObject({
|
|
136
|
-
|
|
141
|
+
provider_runner_id: 'provisioned-runner-1',
|
|
137
142
|
state: 'stopped',
|
|
138
143
|
desired_intent: 'terminate',
|
|
139
144
|
});
|
|
@@ -142,27 +147,27 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
142
147
|
it('returns keep for orphan observed ids without leaking ownership details', async () => {
|
|
143
148
|
const res = await app.inject({
|
|
144
149
|
method: 'POST',
|
|
145
|
-
url: '/provisioners/
|
|
150
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
146
151
|
headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
|
|
147
|
-
payload: {
|
|
152
|
+
payload: {observed_provider_runner_ids: ['orphan-runner']},
|
|
148
153
|
});
|
|
149
154
|
|
|
150
155
|
expect(res.statusCode).toBe(200);
|
|
151
156
|
expect(res.json().runners[0]).toMatchObject({
|
|
152
|
-
|
|
157
|
+
provider_runner_id: 'orphan-runner',
|
|
153
158
|
state: null,
|
|
154
159
|
desired_intent: 'keep',
|
|
155
160
|
});
|
|
156
161
|
});
|
|
157
162
|
|
|
158
163
|
it('returns terminate for an active runner with a cancelled bound job', async () => {
|
|
159
|
-
const intentSpy = vi.spyOn(
|
|
160
|
-
await
|
|
164
|
+
const intentSpy = vi.spyOn(providerRunnerTerminateIntentIssuedCount, 'add');
|
|
165
|
+
await createRunnerInstance({providerRunnerId: 'provisioned-runner-1'});
|
|
161
166
|
await insertRunningJob({
|
|
162
167
|
jobId: crypto.randomUUID(),
|
|
163
168
|
workflowRunId: crypto.randomUUID(),
|
|
164
169
|
workflowRunAttemptId: crypto.randomUUID(),
|
|
165
|
-
|
|
170
|
+
providerRunnerId: 'provisioned-runner-1',
|
|
166
171
|
lastHeartbeatAt: new Date('2025-01-01T00:00:00.000Z'),
|
|
167
172
|
cancellationRequestedAt: new Date('2025-01-01T00:01:00.000Z'),
|
|
168
173
|
});
|
|
@@ -170,9 +175,9 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
170
175
|
|
|
171
176
|
const res = await app.inject({
|
|
172
177
|
method: 'POST',
|
|
173
|
-
url: '/provisioners/
|
|
178
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
174
179
|
headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
|
|
175
|
-
payload: {
|
|
180
|
+
payload: {observed_provider_runner_ids: ['provisioned-runner-1']},
|
|
176
181
|
});
|
|
177
182
|
|
|
178
183
|
expect(res.statusCode).toBe(200);
|
|
@@ -194,10 +199,10 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
194
199
|
});
|
|
195
200
|
|
|
196
201
|
it('returns an empty result for an empty observed set without reaping absent runners', async () => {
|
|
197
|
-
const reconcileSpy = vi.spyOn(
|
|
202
|
+
const reconcileSpy = vi.spyOn(providerRunnerReconcileCallCount, 'add');
|
|
198
203
|
const reservationId = await createReservation(2);
|
|
199
|
-
await
|
|
200
|
-
|
|
204
|
+
await createRunnerInstance({
|
|
205
|
+
providerRunnerId: 'provisioned-runner-1',
|
|
201
206
|
reservationId,
|
|
202
207
|
reportedAt: new Date(Date.now() - 300_000),
|
|
203
208
|
});
|
|
@@ -205,19 +210,19 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
205
210
|
|
|
206
211
|
const res = await app.inject({
|
|
207
212
|
method: 'POST',
|
|
208
|
-
url: '/provisioners/
|
|
213
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
209
214
|
headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
|
|
210
|
-
payload: {
|
|
215
|
+
payload: {observed_provider_runner_ids: []},
|
|
211
216
|
});
|
|
212
217
|
|
|
213
|
-
const [
|
|
218
|
+
const [providerRunner] = await db()
|
|
214
219
|
.select()
|
|
215
|
-
.from(
|
|
220
|
+
.from(providerRunners)
|
|
216
221
|
.where(
|
|
217
222
|
and(
|
|
218
|
-
eq(
|
|
219
|
-
eq(
|
|
220
|
-
eq(
|
|
223
|
+
eq(providerRunners.workspaceId, workspaceId),
|
|
224
|
+
eq(providerRunners.provisionerId, provisionerTokenId),
|
|
225
|
+
eq(providerRunners.providerRunnerId, 'provisioned-runner-1'),
|
|
221
226
|
),
|
|
222
227
|
);
|
|
223
228
|
const [reservation] = await db()
|
|
@@ -228,9 +233,9 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
228
233
|
expect(res.statusCode).toBe(200);
|
|
229
234
|
expect(res.json()).toEqual({
|
|
230
235
|
runners: [],
|
|
231
|
-
|
|
236
|
+
terminated_absent_provider_runner_ids: [],
|
|
232
237
|
});
|
|
233
|
-
expect(
|
|
238
|
+
expect(providerRunner?.state).toBe('running');
|
|
234
239
|
expect(reservation?.count).toBe(2);
|
|
235
240
|
expect(
|
|
236
241
|
reconcileSpy.mock.calls
|
|
@@ -240,22 +245,22 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
240
245
|
});
|
|
241
246
|
|
|
242
247
|
it('increments the reservation release metric when reconcile reaps an absent runner', async () => {
|
|
243
|
-
const reconcileSpy = vi.spyOn(
|
|
244
|
-
const absentSpy = vi.spyOn(
|
|
248
|
+
const reconcileSpy = vi.spyOn(providerRunnerReconcileCallCount, 'add');
|
|
249
|
+
const absentSpy = vi.spyOn(providerRunnerAbsentTerminatedCount, 'add');
|
|
245
250
|
const addSpy = vi.spyOn(reservationReleasedCount, 'add');
|
|
246
251
|
const reservationId = await createReservation(3);
|
|
247
|
-
await
|
|
248
|
-
|
|
252
|
+
await createRunnerInstance({
|
|
253
|
+
providerRunnerId: 'provisioned-runner-1',
|
|
249
254
|
reservationId,
|
|
250
255
|
reportedAt: new Date(Date.now() - 300_000),
|
|
251
256
|
});
|
|
252
|
-
await
|
|
253
|
-
|
|
257
|
+
await createRunnerInstance({
|
|
258
|
+
providerRunnerId: 'provisioned-runner-2',
|
|
254
259
|
reservationId,
|
|
255
260
|
reportedAt: new Date(Date.now() - 300_000),
|
|
256
261
|
});
|
|
257
|
-
await
|
|
258
|
-
|
|
262
|
+
await createRunnerInstance({
|
|
263
|
+
providerRunnerId: 'provisioned-runner-3',
|
|
259
264
|
reportedAt: new Date(Date.now() - 300_000),
|
|
260
265
|
});
|
|
261
266
|
const reconcileCallsBefore = reconcileSpy.mock.calls.length;
|
|
@@ -264,13 +269,13 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
264
269
|
|
|
265
270
|
const res = await app.inject({
|
|
266
271
|
method: 'POST',
|
|
267
|
-
url: '/provisioners/
|
|
272
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
268
273
|
headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
|
|
269
|
-
payload: {
|
|
274
|
+
payload: {observed_provider_runner_ids: ['observed-runner']},
|
|
270
275
|
});
|
|
271
276
|
|
|
272
277
|
expect(res.statusCode).toBe(200);
|
|
273
|
-
expect(res.json().
|
|
278
|
+
expect(res.json().terminated_absent_provider_runner_ids).toEqual([
|
|
274
279
|
'provisioned-runner-1',
|
|
275
280
|
'provisioned-runner-2',
|
|
276
281
|
'provisioned-runner-3',
|
|
@@ -295,14 +300,14 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
295
300
|
it('returns 401 without valid provisioner auth', async () => {
|
|
296
301
|
const missing = await app.inject({
|
|
297
302
|
method: 'POST',
|
|
298
|
-
url: '/provisioners/
|
|
299
|
-
payload: {
|
|
303
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
304
|
+
payload: {observed_provider_runner_ids: []},
|
|
300
305
|
});
|
|
301
306
|
const invalid = await app.inject({
|
|
302
307
|
method: 'POST',
|
|
303
|
-
url: '/provisioners/
|
|
308
|
+
url: '/provisioners/runner-instances/reconcile',
|
|
304
309
|
headers: {authorization: 'Bearer invalid'},
|
|
305
|
-
payload: {
|
|
310
|
+
payload: {observed_provider_runner_ids: []},
|
|
306
311
|
});
|
|
307
312
|
|
|
308
313
|
expect(missing.statusCode).toBe(401);
|
|
@@ -332,16 +337,16 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
332
337
|
return reservation.id;
|
|
333
338
|
}
|
|
334
339
|
|
|
335
|
-
async function
|
|
336
|
-
|
|
340
|
+
async function createRunnerInstance(params: {
|
|
341
|
+
providerRunnerId: string;
|
|
337
342
|
state?: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'terminated';
|
|
338
343
|
reservationId?: string | null;
|
|
339
344
|
reportedAt?: Date;
|
|
340
345
|
}) {
|
|
341
|
-
return await
|
|
346
|
+
return await providerRunnerFactory.create({
|
|
342
347
|
workspaceId,
|
|
343
348
|
provisionerId: provisionerTokenId,
|
|
344
|
-
|
|
349
|
+
providerRunnerId: params.providerRunnerId,
|
|
345
350
|
reservationId: params.reservationId ?? null,
|
|
346
351
|
state: params.state ?? 'running',
|
|
347
352
|
reportedAt: params.reportedAt ?? new Date(),
|
|
@@ -352,7 +357,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
352
357
|
jobId: string;
|
|
353
358
|
workflowRunId: string;
|
|
354
359
|
workflowRunAttemptId: string;
|
|
355
|
-
|
|
360
|
+
providerRunnerId: string;
|
|
356
361
|
lastHeartbeatAt: Date;
|
|
357
362
|
cancellationRequestedAt?: Date | null;
|
|
358
363
|
}) {
|
|
@@ -369,7 +374,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
|
|
|
369
374
|
projectId: crypto.randomUUID(),
|
|
370
375
|
runnerSessionId: runnerSession.id,
|
|
371
376
|
provisionerId: provisionerTokenId,
|
|
372
|
-
|
|
377
|
+
providerRunnerId: params.providerRunnerId,
|
|
373
378
|
requiredLabels: ['linux'],
|
|
374
379
|
runnerLabels: ['linux'],
|
|
375
380
|
startedAt: params.lastHeartbeatAt,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {requireProvisionerContext} from '@shipfox/api-auth-context';
|
|
2
|
+
import {
|
|
3
|
+
reconcileRunnerInstancesBodySchema,
|
|
4
|
+
reconcileRunnerInstancesResponseSchema,
|
|
5
|
+
} from '@shipfox/api-runners-dto';
|
|
6
|
+
import {defineRoute} from '@shipfox/node-fastify';
|
|
7
|
+
import {reconcileRunnerInstances} from '#core/index.js';
|
|
8
|
+
import {toReconcileRunnerInstancesResponseDto} from '#presentation/dto/index.js';
|
|
9
|
+
|
|
10
|
+
export const reconcileRunnerInstancesRoute = defineRoute({
|
|
11
|
+
method: 'POST',
|
|
12
|
+
path: '/runner-instances/reconcile',
|
|
13
|
+
description: 'Reconcile provisioned runner state for a provisioner',
|
|
14
|
+
schema: {
|
|
15
|
+
body: reconcileRunnerInstancesBodySchema,
|
|
16
|
+
response: {
|
|
17
|
+
200: reconcileRunnerInstancesResponseSchema,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
handler: async (request) => {
|
|
21
|
+
const context = requireProvisionerContext(request);
|
|
22
|
+
const result = await reconcileRunnerInstances({
|
|
23
|
+
workspaceId: context.scope === 'workspace' ? context.workspaceId : null,
|
|
24
|
+
provisionerId: context.provisionerTokenId,
|
|
25
|
+
observedRunnerInstanceIds: request.body.observed_provider_runner_ids,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return toReconcileRunnerInstancesResponseDto(result);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
@@ -18,8 +18,12 @@ import {ephemeralRegistrationTokens} from '#db/schema/ephemeral-registration-tok
|
|
|
18
18
|
import {runnersRateLimits} from '#db/schema/rate-limits.js';
|
|
19
19
|
import {runnerSessions} from '#db/schema/runner-sessions.js';
|
|
20
20
|
import {createRunnerRegistrationTokenAuthMethod} from '#presentation/auth/index.js';
|
|
21
|
-
import {
|
|
22
|
-
|
|
21
|
+
import {
|
|
22
|
+
ephemeralRegistrationTokenFactory,
|
|
23
|
+
manualRegistrationTokenFactory,
|
|
24
|
+
runnersTestAuthClient,
|
|
25
|
+
} from '#test/index.js';
|
|
26
|
+
import {createRunnerRoutes} from './index.js';
|
|
23
27
|
|
|
24
28
|
const fakeUserAuth: AuthMethod = {
|
|
25
29
|
name: AUTH_USER,
|
|
@@ -52,7 +56,7 @@ describe('POST /runners/register', () => {
|
|
|
52
56
|
createLeaseTokenAuthMethod(),
|
|
53
57
|
fakeProvisionerAuth,
|
|
54
58
|
],
|
|
55
|
-
routes:
|
|
59
|
+
routes: createRunnerRoutes(runnersTestAuthClient),
|
|
56
60
|
swagger: false,
|
|
57
61
|
});
|
|
58
62
|
await app.ready();
|
|
@@ -99,7 +103,7 @@ describe('POST /runners/register', () => {
|
|
|
99
103
|
expect(rows[0]?.labels).toEqual(['linux', 'x64']);
|
|
100
104
|
expect(rows[0]?.registrationTokenKind).toBe('manual');
|
|
101
105
|
expect(rows[0]?.provisionerId).toBeNull();
|
|
102
|
-
expect(rows[0]?.
|
|
106
|
+
expect(rows[0]?.providerRunnerId).toBeNull();
|
|
103
107
|
expect(rows[0]?.toolCapabilities).toBeNull();
|
|
104
108
|
expect(rows[0]?.toolCapabilitiesReportedAt).toBeNull();
|
|
105
109
|
});
|
|
@@ -149,7 +153,7 @@ describe('POST /runners/register', () => {
|
|
|
149
153
|
.where(eq(runnerSessions.id, body.session_id));
|
|
150
154
|
expect(session?.registrationTokenKind).toBe('ephemeral');
|
|
151
155
|
expect(session?.provisionerId).toBe(token.provisionerId);
|
|
152
|
-
expect(session?.
|
|
156
|
+
expect(session?.providerRunnerId).toBe(token.providerRunnerId);
|
|
153
157
|
expect(session?.maxClaims).toBe(1);
|
|
154
158
|
expect(session?.claimsUsed).toBe(0);
|
|
155
159
|
expect(session?.toolCapabilities).toEqual({harnesses: {pi: {tools: ['read']}}});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type {AuthInterModuleClient} from '@shipfox/api-auth-dto/inter-module';
|
|
1
2
|
import {registerRunnerBodySchema, registerRunnerResponseSchema} from '@shipfox/api-runners-dto';
|
|
2
3
|
import {ClientError, defineRoute} from '@shipfox/node-fastify';
|
|
3
4
|
import {
|
|
@@ -9,67 +10,70 @@ import {registerRunnerSession} from '#core/runner-sessions.js';
|
|
|
9
10
|
import {getRunnerContext} from '#presentation/auth/index.js';
|
|
10
11
|
import {createEphemeralRegisterRateLimitPreHandler} from './rate-limit.js';
|
|
11
12
|
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
export function createRegisterRoute(auth: AuthInterModuleClient) {
|
|
14
|
+
return defineRoute({
|
|
15
|
+
method: 'POST',
|
|
16
|
+
path: '/register',
|
|
17
|
+
description: 'Exchange a runner registration token for a runner session token',
|
|
18
|
+
schema: {
|
|
19
|
+
body: registerRunnerBodySchema,
|
|
20
|
+
response: {
|
|
21
|
+
200: registerRunnerResponseSchema,
|
|
22
|
+
},
|
|
20
23
|
},
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
preHandler: createEphemeralRegisterRateLimitPreHandler(),
|
|
25
|
+
errorHandler: (error, request) => {
|
|
26
|
+
if (error instanceof EmptyRunnerLabelsError) {
|
|
27
|
+
throw new ClientError(error.message, 'empty-runner-labels', {status: 400});
|
|
28
|
+
}
|
|
29
|
+
if (error instanceof RegistrationTokenConsumedError) {
|
|
30
|
+
const runner = getRunnerContext(request);
|
|
31
|
+
if (runner.kind === 'ephemeral') {
|
|
32
|
+
request.log.warn(
|
|
33
|
+
{
|
|
34
|
+
ephemeralTokenId: error.ephemeralTokenId,
|
|
35
|
+
provisionerId: runner.provisionerId,
|
|
36
|
+
},
|
|
37
|
+
'Ephemeral registration token reuse rejected',
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
throw new ClientError(
|
|
41
|
+
'Registration token has already been consumed',
|
|
42
|
+
'registration-token-consumed',
|
|
31
43
|
{
|
|
32
|
-
|
|
33
|
-
provisionerId: runner.provisionerId,
|
|
44
|
+
status: 409,
|
|
34
45
|
},
|
|
35
|
-
'Ephemeral registration token reuse rejected',
|
|
36
46
|
);
|
|
37
47
|
}
|
|
38
|
-
|
|
39
|
-
'Registration token has
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
if (error instanceof RegistrationTokenExpiredError) {
|
|
49
|
+
throw new ClientError('Registration token has expired', 'registration-token-expired', {
|
|
50
|
+
status: 401,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
},
|
|
55
|
+
handler: async (request) => {
|
|
56
|
+
const runner = getRunnerContext(request);
|
|
57
|
+
const result = await registerRunnerSession({
|
|
58
|
+
auth,
|
|
59
|
+
credential:
|
|
60
|
+
runner.kind === 'manual'
|
|
61
|
+
? {
|
|
62
|
+
kind: 'manual',
|
|
63
|
+
registrationTokenId: runner.registrationTokenId,
|
|
64
|
+
workspaceId: runner.workspaceId,
|
|
65
|
+
}
|
|
66
|
+
: runner,
|
|
67
|
+
labels: request.body.labels,
|
|
68
|
+
toolCapabilities: request.body.capabilities ?? null,
|
|
49
69
|
});
|
|
50
|
-
}
|
|
51
|
-
throw error;
|
|
52
|
-
},
|
|
53
|
-
handler: async (request) => {
|
|
54
|
-
const runner = getRunnerContext(request);
|
|
55
|
-
const result = await registerRunnerSession({
|
|
56
|
-
credential:
|
|
57
|
-
runner.kind === 'manual'
|
|
58
|
-
? {
|
|
59
|
-
kind: 'manual',
|
|
60
|
-
registrationTokenId: runner.registrationTokenId,
|
|
61
|
-
workspaceId: runner.workspaceId,
|
|
62
|
-
}
|
|
63
|
-
: runner,
|
|
64
|
-
labels: request.body.labels,
|
|
65
|
-
toolCapabilities: request.body.capabilities ?? null,
|
|
66
|
-
});
|
|
67
70
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
});
|
|
71
|
+
return {
|
|
72
|
+
session_token: result.sessionToken,
|
|
73
|
+
session_id: result.session.id,
|
|
74
|
+
mode: result.mode,
|
|
75
|
+
max_claims: result.maxClaims,
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|