@shipfox/api-runners 6.0.0 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/CHANGELOG.md +26 -0
  3. package/dist/config.js +1 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/core/entities/runner-instance.d.ts +1 -0
  6. package/dist/core/entities/runner-instance.d.ts.map +1 -1
  7. package/dist/core/entities/runner-instance.js.map +1 -1
  8. package/dist/core/errors.d.ts +6 -6
  9. package/dist/core/errors.d.ts.map +1 -1
  10. package/dist/core/errors.js +8 -8
  11. package/dist/core/errors.js.map +1 -1
  12. package/dist/core/index.d.ts +2 -4
  13. package/dist/core/index.d.ts.map +1 -1
  14. package/dist/core/index.js +2 -3
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/core/runner-assignments.d.ts +6 -0
  17. package/dist/core/runner-assignments.d.ts.map +1 -0
  18. package/dist/core/runner-assignments.js +6 -0
  19. package/dist/core/runner-assignments.js.map +1 -0
  20. package/dist/core/runner-instances.d.ts +2 -9
  21. package/dist/core/runner-instances.d.ts.map +1 -1
  22. package/dist/core/runner-instances.js +3 -6
  23. package/dist/core/runner-instances.js.map +1 -1
  24. package/dist/db/db.d.ts +34 -218
  25. package/dist/db/db.d.ts.map +1 -1
  26. package/dist/db/db.js +0 -2
  27. package/dist/db/db.js.map +1 -1
  28. package/dist/db/index.d.ts +2 -2
  29. package/dist/db/index.d.ts.map +1 -1
  30. package/dist/db/index.js +2 -2
  31. package/dist/db/index.js.map +1 -1
  32. package/dist/db/runner-assignments.d.ts +7 -0
  33. package/dist/db/runner-assignments.d.ts.map +1 -0
  34. package/dist/db/runner-assignments.js +55 -0
  35. package/dist/db/runner-assignments.js.map +1 -0
  36. package/dist/db/runner-instances.d.ts +2 -9
  37. package/dist/db/runner-instances.d.ts.map +1 -1
  38. package/dist/db/runner-instances.js +2 -16
  39. package/dist/db/runner-instances.js.map +1 -1
  40. package/dist/db/schema/runner-instances.d.ts +17 -0
  41. package/dist/db/schema/runner-instances.d.ts.map +1 -1
  42. package/dist/db/schema/runner-instances.js +5 -1
  43. package/dist/db/schema/runner-instances.js.map +1 -1
  44. package/dist/index.d.ts +0 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +0 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/presentation/dto/index.d.ts +0 -1
  49. package/dist/presentation/dto/index.d.ts.map +1 -1
  50. package/dist/presentation/dto/index.js +0 -1
  51. package/dist/presentation/dto/index.js.map +1 -1
  52. package/dist/presentation/routes/assign-runner-instances.d.ts +2 -0
  53. package/dist/presentation/routes/assign-runner-instances.d.ts.map +1 -0
  54. package/dist/presentation/routes/assign-runner-instances.js +40 -0
  55. package/dist/presentation/routes/assign-runner-instances.js.map +1 -0
  56. package/dist/presentation/routes/index.d.ts.map +1 -1
  57. package/dist/presentation/routes/index.js +4 -8
  58. package/dist/presentation/routes/index.js.map +1 -1
  59. package/dist/presentation/routes/runner-enrollment.d.ts +1 -0
  60. package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -1
  61. package/dist/presentation/routes/runner-enrollment.js +27 -0
  62. package/dist/presentation/routes/runner-enrollment.js.map +1 -1
  63. package/dist/tsconfig.test.tsbuildinfo +1 -1
  64. package/drizzle/0000_initial.sql +1 -12
  65. package/drizzle/meta/0000_snapshot.json +6 -97
  66. package/package.json +8 -29
  67. package/src/config.ts +1 -1
  68. package/src/core/entities/runner-instance.ts +1 -0
  69. package/src/core/errors.ts +8 -8
  70. package/src/core/index.ts +2 -9
  71. package/src/core/runner-assignments.ts +9 -0
  72. package/src/core/runner-instances.ts +4 -13
  73. package/src/db/db.ts +0 -2
  74. package/src/db/index.ts +2 -3
  75. package/src/db/runner-assignments.test.ts +163 -0
  76. package/src/db/runner-assignments.ts +115 -0
  77. package/src/db/runner-instances.test.ts +36 -23
  78. package/src/db/runner-instances.ts +3 -23
  79. package/src/db/schema/runner-instances.ts +3 -1
  80. package/src/index.ts +0 -9
  81. package/src/presentation/dto/index.ts +0 -4
  82. package/src/presentation/routes/assign-runner-instances.ts +49 -0
  83. package/src/presentation/routes/index.ts +4 -7
  84. package/src/presentation/routes/runner-enrollment.test.ts +60 -0
  85. package/src/presentation/routes/runner-enrollment.ts +22 -0
  86. package/test/globalSetup.ts +0 -1
  87. package/tsconfig.build.tsbuildinfo +1 -1
  88. package/dist/core/capacity-assignments.d.ts +0 -7
  89. package/dist/core/capacity-assignments.d.ts.map +0 -1
  90. package/dist/core/capacity-assignments.js +0 -6
  91. package/dist/core/capacity-assignments.js.map +0 -1
  92. package/dist/core/entities/capacity-assignment.d.ts +0 -9
  93. package/dist/core/entities/capacity-assignment.d.ts.map +0 -1
  94. package/dist/core/entities/capacity-assignment.js +0 -3
  95. package/dist/core/entities/capacity-assignment.js.map +0 -1
  96. package/dist/db/capacity-assignments.d.ts +0 -7
  97. package/dist/db/capacity-assignments.d.ts.map +0 -1
  98. package/dist/db/capacity-assignments.js +0 -72
  99. package/dist/db/capacity-assignments.js.map +0 -1
  100. package/dist/db/schema/capacity-assignments.d.ts +0 -113
  101. package/dist/db/schema/capacity-assignments.d.ts.map +0 -1
  102. package/dist/db/schema/capacity-assignments.js +0 -29
  103. package/dist/db/schema/capacity-assignments.js.map +0 -1
  104. package/dist/presentation/dto/mint-registration-tokens.d.ts +0 -7
  105. package/dist/presentation/dto/mint-registration-tokens.d.ts.map +0 -1
  106. package/dist/presentation/dto/mint-registration-tokens.js +0 -19
  107. package/dist/presentation/dto/mint-registration-tokens.js.map +0 -1
  108. package/dist/presentation/routes/assign-capacity.d.ts +0 -2
  109. package/dist/presentation/routes/assign-capacity.d.ts.map +0 -1
  110. package/dist/presentation/routes/assign-capacity.js +0 -44
  111. package/dist/presentation/routes/assign-capacity.js.map +0 -1
  112. package/dist/presentation/routes/mint-registration-tokens.d.ts +0 -2
  113. package/dist/presentation/routes/mint-registration-tokens.d.ts.map +0 -1
  114. package/dist/presentation/routes/mint-registration-tokens.js +0 -74
  115. package/dist/presentation/routes/mint-registration-tokens.js.map +0 -1
  116. package/dist/presentation/routes/planned-capacity.d.ts +0 -3
  117. package/dist/presentation/routes/planned-capacity.d.ts.map +0 -1
  118. package/dist/presentation/routes/planned-capacity.js +0 -54
  119. package/dist/presentation/routes/planned-capacity.js.map +0 -1
  120. package/src/core/capacity-assignments.ts +0 -10
  121. package/src/core/entities/capacity-assignment.ts +0 -8
  122. package/src/db/capacity-assignments.test.ts +0 -159
  123. package/src/db/capacity-assignments.ts +0 -116
  124. package/src/db/schema/capacity-assignments.ts +0 -34
  125. package/src/presentation/dto/mint-registration-tokens.ts +0 -28
  126. package/src/presentation/routes/assign-capacity.ts +0 -48
  127. package/src/presentation/routes/mint-registration-tokens.test.ts +0 -453
  128. package/src/presentation/routes/mint-registration-tokens.ts +0 -80
  129. package/src/presentation/routes/planned-capacity.ts +0 -49
@@ -1,7 +0,0 @@
1
- import type { CapacityAssignment } from './entities/capacity-assignment.js';
2
- export declare function assignCapacityBatch(params: {
3
- provisionerId: string;
4
- reservationId: string;
5
- capacityIds: string[];
6
- }): Promise<CapacityAssignment[]>;
7
- //# sourceMappingURL=capacity-assignments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capacity-assignments.d.ts","sourceRoot":"","sources":["../../src/core/capacity-assignments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AAE1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAEhC"}
@@ -1,6 +0,0 @@
1
- import { assignCapacityBatch as assignCapacityBatchDb } from '#db/capacity-assignments.js';
2
- export function assignCapacityBatch(params) {
3
- return assignCapacityBatchDb(params);
4
- }
5
-
6
- //# sourceMappingURL=capacity-assignments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/capacity-assignments.ts"],"sourcesContent":["import {assignCapacityBatch as assignCapacityBatchDb} from '#db/capacity-assignments.js';\nimport type {CapacityAssignment} from './entities/capacity-assignment.js';\n\nexport function assignCapacityBatch(params: {\n provisionerId: string;\n reservationId: string;\n capacityIds: string[];\n}): Promise<CapacityAssignment[]> {\n return assignCapacityBatchDb(params);\n}\n"],"names":["assignCapacityBatch","assignCapacityBatchDb","params"],"mappings":"AAAA,SAAQA,uBAAuBC,qBAAqB,QAAO,8BAA8B;AAGzF,OAAO,SAASD,oBAAoBE,MAInC;IACC,OAAOD,sBAAsBC;AAC/B"}
@@ -1,9 +0,0 @@
1
- export interface CapacityAssignment {
2
- id: string;
3
- capacityId: string;
4
- reservationId: string;
5
- workspaceId: string;
6
- provisionerId: string;
7
- createdAt: Date;
8
- }
9
- //# sourceMappingURL=capacity-assignment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capacity-assignment.d.ts","sourceRoot":"","sources":["../../../src/core/entities/capacity-assignment.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB"}
@@ -1,3 +0,0 @@
1
- export { };
2
-
3
- //# sourceMappingURL=capacity-assignment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/entities/capacity-assignment.ts"],"sourcesContent":["export interface CapacityAssignment {\n id: string;\n capacityId: string;\n reservationId: string;\n workspaceId: string;\n provisionerId: string;\n createdAt: Date;\n}\n"],"names":[],"mappings":"AAAA,WAOC"}
@@ -1,7 +0,0 @@
1
- import type { CapacityAssignment } from '#core/entities/capacity-assignment.js';
2
- export declare function assignCapacityBatch(params: {
3
- provisionerId: string;
4
- reservationId: string;
5
- capacityIds: string[];
6
- }): Promise<CapacityAssignment[]>;
7
- //# sourceMappingURL=capacity-assignments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capacity-assignments.d.ts","sourceRoot":"","sources":["../../src/db/capacity-assignments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,uCAAuC,CAAC;AAY9E,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAkGhC"}
@@ -1,72 +0,0 @@
1
- import { and, eq, inArray, sql } from 'drizzle-orm';
2
- import { CapacityAlreadyAssignedError, CapacityNotAssignableError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
3
- import { db } from './db.js';
4
- import { capacityAssignments, toCapacityAssignment } from './schema/capacity-assignments.js';
5
- import { reservations } from './schema/reservations.js';
6
- import { providerRunners } from './schema/runner-instances.js';
7
- export async function assignCapacityBatch(params) {
8
- return await db().transaction(async (tx)=>{
9
- const lockKey = [
10
- 'runners_capacity_assignments',
11
- params.provisionerId,
12
- params.reservationId
13
- ].join(':');
14
- await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${lockKey}))`);
15
- for (const capacityId of [
16
- ...params.capacityIds
17
- ].sort()){
18
- await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${[
19
- 'runners_capacity_assignments',
20
- capacityId
21
- ].join(':')}))`);
22
- }
23
- const [reservation] = await tx.select().from(reservations).where(and(eq(reservations.id, params.reservationId), eq(reservations.provisionerId, params.provisionerId))).limit(1);
24
- if (!reservation) throw new ReservationNotFoundError(params.reservationId);
25
- if (reservation.expiresAt <= new Date()) throw new ReservationExpiredError(params.reservationId);
26
- const existing = await tx.select().from(capacityAssignments).where(eq(capacityAssignments.reservationId, reservation.id));
27
- const existingByCapacityId = new Map(existing.map((assignment)=>[
28
- assignment.capacityId,
29
- assignment
30
- ]));
31
- const newCapacityIds = params.capacityIds.filter((capacityId)=>!existingByCapacityId.has(capacityId));
32
- if (existing.length + newCapacityIds.length > reservation.count) throw new CapacityNotAssignableError(params.capacityIds[0] ?? '');
33
- if (newCapacityIds.length === 0) {
34
- return params.capacityIds.flatMap((capacityId)=>{
35
- const assignment = existingByCapacityId.get(capacityId);
36
- return assignment ? [
37
- toCapacityAssignment(assignment)
38
- ] : [];
39
- });
40
- }
41
- const capacities = await tx.select().from(providerRunners).where(and(eq(providerRunners.provisionerId, params.provisionerId), inArray(providerRunners.id, newCapacityIds)));
42
- if (capacities.length !== newCapacityIds.length) throw new CapacityNotAssignableError(params.capacityIds[0] ?? '');
43
- for (const capacity of capacities){
44
- if (capacity.state !== 'starting' && capacity.state !== 'running') throw new CapacityNotAssignableError(capacity.id);
45
- if (!capacity.providerRunnerId || capacity.labels.length === 0 || !reservation.requiredLabels.every((label)=>capacity.labels.includes(label))) {
46
- throw new CapacityNotAssignableError(capacity.id);
47
- }
48
- }
49
- const assignedCapacity = await tx.select({
50
- capacityId: capacityAssignments.capacityId
51
- }).from(capacityAssignments).where(inArray(capacityAssignments.capacityId, newCapacityIds));
52
- if (assignedCapacity.length > 0) throw new CapacityAlreadyAssignedError(assignedCapacity[0]?.capacityId ?? '');
53
- const inserted = await tx.insert(capacityAssignments).values(newCapacityIds.map((capacityId)=>({
54
- capacityId,
55
- reservationId: reservation.id,
56
- workspaceId: reservation.workspaceId,
57
- provisionerId: params.provisionerId
58
- }))).returning();
59
- const insertedByCapacityId = new Map(inserted.map((assignment)=>[
60
- assignment.capacityId,
61
- assignment
62
- ]));
63
- return params.capacityIds.flatMap((capacityId)=>{
64
- const assignment = existingByCapacityId.get(capacityId) ?? insertedByCapacityId.get(capacityId);
65
- return assignment ? [
66
- toCapacityAssignment(assignment)
67
- ] : [];
68
- });
69
- });
70
- }
71
-
72
- //# sourceMappingURL=capacity-assignments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/db/capacity-assignments.ts"],"sourcesContent":["import {and, eq, inArray, sql} from 'drizzle-orm';\nimport type {CapacityAssignment} from '#core/entities/capacity-assignment.js';\nimport {\n CapacityAlreadyAssignedError,\n CapacityNotAssignableError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\nimport {db} from './db.js';\nimport {capacityAssignments, toCapacityAssignment} from './schema/capacity-assignments.js';\nimport {reservations} from './schema/reservations.js';\nimport {providerRunners} from './schema/runner-instances.js';\n\nexport async function assignCapacityBatch(params: {\n provisionerId: string;\n reservationId: string;\n capacityIds: string[];\n}): Promise<CapacityAssignment[]> {\n return await db().transaction(async (tx) => {\n const lockKey = [\n 'runners_capacity_assignments',\n params.provisionerId,\n params.reservationId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${lockKey}))`);\n for (const capacityId of [...params.capacityIds].sort()) {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtext(${['runners_capacity_assignments', capacityId].join(':')}))`,\n );\n }\n\n const [reservation] = await tx\n .select()\n .from(reservations)\n .where(\n and(\n eq(reservations.id, params.reservationId),\n eq(reservations.provisionerId, params.provisionerId),\n ),\n )\n .limit(1);\n if (!reservation) throw new ReservationNotFoundError(params.reservationId);\n if (reservation.expiresAt <= new Date())\n throw new ReservationExpiredError(params.reservationId);\n\n const existing = await tx\n .select()\n .from(capacityAssignments)\n .where(eq(capacityAssignments.reservationId, reservation.id));\n const existingByCapacityId = new Map(\n existing.map((assignment) => [assignment.capacityId, assignment]),\n );\n const newCapacityIds = params.capacityIds.filter(\n (capacityId) => !existingByCapacityId.has(capacityId),\n );\n if (existing.length + newCapacityIds.length > reservation.count)\n throw new CapacityNotAssignableError(params.capacityIds[0] ?? '');\n\n if (newCapacityIds.length === 0) {\n return params.capacityIds.flatMap((capacityId) => {\n const assignment = existingByCapacityId.get(capacityId);\n return assignment ? [toCapacityAssignment(assignment)] : [];\n });\n }\n\n const capacities = await tx\n .select()\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.id, newCapacityIds),\n ),\n );\n if (capacities.length !== newCapacityIds.length)\n throw new CapacityNotAssignableError(params.capacityIds[0] ?? '');\n for (const capacity of capacities) {\n if (capacity.state !== 'starting' && capacity.state !== 'running')\n throw new CapacityNotAssignableError(capacity.id);\n if (\n !capacity.providerRunnerId ||\n capacity.labels.length === 0 ||\n !reservation.requiredLabels.every((label) => capacity.labels.includes(label))\n ) {\n throw new CapacityNotAssignableError(capacity.id);\n }\n }\n\n const assignedCapacity = await tx\n .select({capacityId: capacityAssignments.capacityId})\n .from(capacityAssignments)\n .where(inArray(capacityAssignments.capacityId, newCapacityIds));\n if (assignedCapacity.length > 0)\n throw new CapacityAlreadyAssignedError(assignedCapacity[0]?.capacityId ?? '');\n\n const inserted = await tx\n .insert(capacityAssignments)\n .values(\n newCapacityIds.map((capacityId) => ({\n capacityId,\n reservationId: reservation.id,\n workspaceId: reservation.workspaceId,\n provisionerId: params.provisionerId,\n })),\n )\n .returning();\n const insertedByCapacityId = new Map(\n inserted.map((assignment) => [assignment.capacityId, assignment]),\n );\n return params.capacityIds.flatMap((capacityId) => {\n const assignment =\n existingByCapacityId.get(capacityId) ?? insertedByCapacityId.get(capacityId);\n return assignment ? [toCapacityAssignment(assignment)] : [];\n });\n });\n}\n"],"names":["and","eq","inArray","sql","CapacityAlreadyAssignedError","CapacityNotAssignableError","ReservationExpiredError","ReservationNotFoundError","db","capacityAssignments","toCapacityAssignment","reservations","providerRunners","assignCapacityBatch","params","transaction","tx","lockKey","provisionerId","reservationId","join","execute","capacityId","capacityIds","sort","reservation","select","from","where","id","limit","expiresAt","Date","existing","existingByCapacityId","Map","map","assignment","newCapacityIds","filter","has","length","count","flatMap","get","capacities","capacity","state","providerRunnerId","labels","requiredLabels","every","label","includes","assignedCapacity","inserted","insert","values","workspaceId","returning","insertedByCapacityId"],"mappings":"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"}
@@ -1,113 +0,0 @@
1
- import type { CapacityAssignment } from '#core/entities/capacity-assignment.js';
2
- export declare const capacityAssignments: import("drizzle-orm/pg-core").PgTableWithColumns<{
3
- name: "capacity_assignments";
4
- schema: undefined;
5
- columns: {
6
- id: import("drizzle-orm/pg-core").PgColumn<{
7
- name: "id";
8
- tableName: "capacity_assignments";
9
- dataType: "string";
10
- columnType: "PgUUID";
11
- data: string;
12
- driverParam: string;
13
- notNull: true;
14
- hasDefault: true;
15
- isPrimaryKey: true;
16
- isAutoincrement: false;
17
- hasRuntimeDefault: false;
18
- enumValues: undefined;
19
- baseColumn: never;
20
- identity: undefined;
21
- generated: undefined;
22
- }, {}, {}>;
23
- capacityId: import("drizzle-orm/pg-core").PgColumn<{
24
- name: "capacity_id";
25
- tableName: "capacity_assignments";
26
- dataType: "string";
27
- columnType: "PgUUID";
28
- data: string;
29
- driverParam: string;
30
- notNull: true;
31
- hasDefault: false;
32
- isPrimaryKey: false;
33
- isAutoincrement: false;
34
- hasRuntimeDefault: false;
35
- enumValues: undefined;
36
- baseColumn: never;
37
- identity: undefined;
38
- generated: undefined;
39
- }, {}, {}>;
40
- reservationId: import("drizzle-orm/pg-core").PgColumn<{
41
- name: "reservation_id";
42
- tableName: "capacity_assignments";
43
- dataType: "string";
44
- columnType: "PgUUID";
45
- data: string;
46
- driverParam: string;
47
- notNull: true;
48
- hasDefault: false;
49
- isPrimaryKey: false;
50
- isAutoincrement: false;
51
- hasRuntimeDefault: false;
52
- enumValues: undefined;
53
- baseColumn: never;
54
- identity: undefined;
55
- generated: undefined;
56
- }, {}, {}>;
57
- workspaceId: import("drizzle-orm/pg-core").PgColumn<{
58
- name: "workspace_id";
59
- tableName: "capacity_assignments";
60
- dataType: "string";
61
- columnType: "PgUUID";
62
- data: string;
63
- driverParam: string;
64
- notNull: true;
65
- hasDefault: false;
66
- isPrimaryKey: false;
67
- isAutoincrement: false;
68
- hasRuntimeDefault: false;
69
- enumValues: undefined;
70
- baseColumn: never;
71
- identity: undefined;
72
- generated: undefined;
73
- }, {}, {}>;
74
- provisionerId: import("drizzle-orm/pg-core").PgColumn<{
75
- name: "provisioner_id";
76
- tableName: "capacity_assignments";
77
- dataType: "string";
78
- columnType: "PgUUID";
79
- data: string;
80
- driverParam: string;
81
- notNull: true;
82
- hasDefault: false;
83
- isPrimaryKey: false;
84
- isAutoincrement: false;
85
- hasRuntimeDefault: false;
86
- enumValues: undefined;
87
- baseColumn: never;
88
- identity: undefined;
89
- generated: undefined;
90
- }, {}, {}>;
91
- createdAt: import("drizzle-orm/pg-core").PgColumn<{
92
- name: "created_at";
93
- tableName: "capacity_assignments";
94
- dataType: "date";
95
- columnType: "PgTimestamp";
96
- data: Date;
97
- driverParam: string;
98
- notNull: true;
99
- hasDefault: true;
100
- isPrimaryKey: false;
101
- isAutoincrement: false;
102
- hasRuntimeDefault: false;
103
- enumValues: undefined;
104
- baseColumn: never;
105
- identity: undefined;
106
- generated: undefined;
107
- }, {}, {}>;
108
- };
109
- dialect: "pg";
110
- }>;
111
- export type CapacityAssignmentDb = typeof capacityAssignments.$inferSelect;
112
- export declare function toCapacityAssignment(row: CapacityAssignmentDb): CapacityAssignment;
113
- //# sourceMappingURL=capacity-assignments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capacity-assignments.d.ts","sourceRoot":"","sources":["../../../src/db/schema/capacity-assignments.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,uCAAuC,CAAC;AAG9E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC;AAE3E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,GAAG,kBAAkB,CASlF"}
@@ -1,29 +0,0 @@
1
- import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
2
- import { index, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
3
- import { pgTable } from './common.js';
4
- export const capacityAssignments = pgTable('capacity_assignments', {
5
- id: uuidv7PrimaryKey(),
6
- capacityId: uuid('capacity_id').notNull(),
7
- reservationId: uuid('reservation_id').notNull(),
8
- workspaceId: uuid('workspace_id').notNull(),
9
- provisionerId: uuid('provisioner_id').notNull(),
10
- createdAt: timestamp('created_at', {
11
- withTimezone: true
12
- }).notNull().defaultNow()
13
- }, (table)=>[
14
- uniqueIndex('runners_capacity_assignments_capacity_unique').on(table.capacityId),
15
- index('runners_capacity_assignments_reservation_idx').on(table.reservationId),
16
- index('runners_capacity_assignments_workspace_idx').on(table.workspaceId)
17
- ]);
18
- export function toCapacityAssignment(row) {
19
- return {
20
- id: row.id,
21
- capacityId: row.capacityId,
22
- reservationId: row.reservationId,
23
- workspaceId: row.workspaceId,
24
- provisionerId: row.provisionerId,
25
- createdAt: row.createdAt
26
- };
27
- }
28
-
29
- //# sourceMappingURL=capacity-assignments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/db/schema/capacity-assignments.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {index, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {CapacityAssignment} from '#core/entities/capacity-assignment.js';\nimport {pgTable} from './common.js';\n\nexport const capacityAssignments = pgTable(\n 'capacity_assignments',\n {\n id: uuidv7PrimaryKey(),\n capacityId: uuid('capacity_id').notNull(),\n reservationId: uuid('reservation_id').notNull(),\n workspaceId: uuid('workspace_id').notNull(),\n provisionerId: uuid('provisioner_id').notNull(),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('runners_capacity_assignments_capacity_unique').on(table.capacityId),\n index('runners_capacity_assignments_reservation_idx').on(table.reservationId),\n index('runners_capacity_assignments_workspace_idx').on(table.workspaceId),\n ],\n);\n\nexport type CapacityAssignmentDb = typeof capacityAssignments.$inferSelect;\n\nexport function toCapacityAssignment(row: CapacityAssignmentDb): CapacityAssignment {\n return {\n id: row.id,\n capacityId: row.capacityId,\n reservationId: row.reservationId,\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n createdAt: row.createdAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","index","timestamp","uniqueIndex","uuid","pgTable","capacityAssignments","id","capacityId","notNull","reservationId","workspaceId","provisionerId","createdAt","withTimezone","defaultNow","table","on","toCapacityAssignment","row"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,KAAK,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAExE,SAAQC,OAAO,QAAO,cAAc;AAEpC,OAAO,MAAMC,sBAAsBD,QACjC,wBACA;IACEE,IAAIP;IACJQ,YAAYJ,KAAK,eAAeK,OAAO;IACvCC,eAAeN,KAAK,kBAAkBK,OAAO;IAC7CE,aAAaP,KAAK,gBAAgBK,OAAO;IACzCG,eAAeR,KAAK,kBAAkBK,OAAO;IAC7CI,WAAWX,UAAU,cAAc;QAACY,cAAc;IAAI,GAAGL,OAAO,GAAGM,UAAU;AAC/E,GACA,CAACC,QAAU;QACTb,YAAY,gDAAgDc,EAAE,CAACD,MAAMR,UAAU;QAC/EP,MAAM,gDAAgDgB,EAAE,CAACD,MAAMN,aAAa;QAC5ET,MAAM,8CAA8CgB,EAAE,CAACD,MAAML,WAAW;KACzE,EACD;AAIF,OAAO,SAASO,qBAAqBC,GAAyB;IAC5D,OAAO;QACLZ,IAAIY,IAAIZ,EAAE;QACVC,YAAYW,IAAIX,UAAU;QAC1BE,eAAeS,IAAIT,aAAa;QAChCC,aAAaQ,IAAIR,WAAW;QAC5BC,eAAeO,IAAIP,aAAa;QAChCC,WAAWM,IAAIN,SAAS;IAC1B;AACF"}
@@ -1,7 +0,0 @@
1
- import type { MintRegistrationTokensBatchResponseDto, MintRegistrationTokensRunnerInstanceDto } from '@shipfox/api-runners-dto';
2
- import type { MintEphemeralRegistrationTokensBatchResult } from '#core/ephemeral-registration-tokens.js';
3
- export declare function toMintRegistrationTokensRunnerInstances(providerRunners: MintRegistrationTokensRunnerInstanceDto[]): {
4
- providerRunnerId: string;
5
- }[];
6
- export declare function toMintRegistrationTokensResponseDto(result: MintEphemeralRegistrationTokensBatchResult[]): MintRegistrationTokensBatchResponseDto;
7
- //# sourceMappingURL=mint-registration-tokens.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mint-registration-tokens.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/mint-registration-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,sCAAsC,EACtC,uCAAuC,EACxC,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAC,0CAA0C,EAAC,MAAM,wCAAwC,CAAC;AAEvG,wBAAgB,uCAAuC,CACrD,eAAe,EAAE,uCAAuC,EAAE;;IAG3D;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,0CAA0C,EAAE,GACnD,sCAAsC,CAExC"}
@@ -1,19 +0,0 @@
1
- export function toMintRegistrationTokensRunnerInstances(providerRunners) {
2
- return providerRunners.map((runner)=>({
3
- providerRunnerId: runner.provider_runner_id
4
- }));
5
- }
6
- export function toMintRegistrationTokensResponseDto(result) {
7
- return {
8
- tokens: result.map(toMintedRegistrationTokenDto)
9
- };
10
- }
11
- function toMintedRegistrationTokenDto(result) {
12
- return {
13
- provider_runner_id: result.providerRunnerId,
14
- registration_token: result.rawToken,
15
- expires_at: result.token.expiresAt.toISOString()
16
- };
17
- }
18
-
19
- //# sourceMappingURL=mint-registration-tokens.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/presentation/dto/mint-registration-tokens.ts"],"sourcesContent":["import type {\n MintedRegistrationTokenDto,\n MintRegistrationTokensBatchResponseDto,\n MintRegistrationTokensRunnerInstanceDto,\n} from '@shipfox/api-runners-dto';\nimport type {MintEphemeralRegistrationTokensBatchResult} from '#core/ephemeral-registration-tokens.js';\n\nexport function toMintRegistrationTokensRunnerInstances(\n providerRunners: MintRegistrationTokensRunnerInstanceDto[],\n) {\n return providerRunners.map((runner) => ({providerRunnerId: runner.provider_runner_id}));\n}\n\nexport function toMintRegistrationTokensResponseDto(\n result: MintEphemeralRegistrationTokensBatchResult[],\n): MintRegistrationTokensBatchResponseDto {\n return {tokens: result.map(toMintedRegistrationTokenDto)};\n}\n\nfunction toMintedRegistrationTokenDto(\n result: MintEphemeralRegistrationTokensBatchResult,\n): MintedRegistrationTokenDto {\n return {\n provider_runner_id: result.providerRunnerId,\n registration_token: result.rawToken,\n expires_at: result.token.expiresAt.toISOString(),\n };\n}\n"],"names":["toMintRegistrationTokensRunnerInstances","providerRunners","map","runner","providerRunnerId","provider_runner_id","toMintRegistrationTokensResponseDto","result","tokens","toMintedRegistrationTokenDto","registration_token","rawToken","expires_at","token","expiresAt","toISOString"],"mappings":"AAOA,OAAO,SAASA,wCACdC,eAA0D;IAE1D,OAAOA,gBAAgBC,GAAG,CAAC,CAACC,SAAY,CAAA;YAACC,kBAAkBD,OAAOE,kBAAkB;QAAA,CAAA;AACtF;AAEA,OAAO,SAASC,oCACdC,MAAoD;IAEpD,OAAO;QAACC,QAAQD,OAAOL,GAAG,CAACO;IAA6B;AAC1D;AAEA,SAASA,6BACPF,MAAkD;IAElD,OAAO;QACLF,oBAAoBE,OAAOH,gBAAgB;QAC3CM,oBAAoBH,OAAOI,QAAQ;QACnCC,YAAYL,OAAOM,KAAK,CAACC,SAAS,CAACC,WAAW;IAChD;AACF"}
@@ -1,2 +0,0 @@
1
- export declare const assignCapacityRoute: import("@shipfox/node-fastify").RouteDefinition;
2
- //# sourceMappingURL=assign-capacity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assign-capacity.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/assign-capacity.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,mBAAmB,iDAiC9B,CAAC"}
@@ -1,44 +0,0 @@
1
- import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
- import { assignCapacityBatchBodySchema, assignCapacityBatchResponseSchema } from '@shipfox/api-runners-dto';
3
- import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
- import { assignCapacityBatch } from '#core/capacity-assignments.js';
5
- import { CapacityAlreadyAssignedError, CapacityNotAssignableError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
6
- export const assignCapacityRoute = defineRoute({
7
- method: 'POST',
8
- path: '/capacity/assignments',
9
- description: 'Atomically assign provisioner capacity to a live reservation',
10
- schema: {
11
- body: assignCapacityBatchBodySchema,
12
- response: {
13
- 200: assignCapacityBatchResponseSchema
14
- }
15
- },
16
- errorHandler: (error)=>{
17
- if (error instanceof ReservationNotFoundError) throw new ClientError('Reservation not found', 'reservation-not-found', {
18
- status: 404
19
- });
20
- if (error instanceof ReservationExpiredError) throw new ClientError('Reservation has expired', 'reservation-expired', {
21
- status: 409
22
- });
23
- if (error instanceof CapacityAlreadyAssignedError || error instanceof CapacityNotAssignableError) throw new ClientError('Capacity cannot be assigned', 'capacity-not-assignable', {
24
- status: 409
25
- });
26
- throw error;
27
- },
28
- handler: async (request)=>{
29
- const { provisionerTokenId } = requireProvisionerContext(request);
30
- const assignments = await assignCapacityBatch({
31
- provisionerId: provisionerTokenId,
32
- reservationId: request.body.reservation_id,
33
- capacityIds: request.body.capacity_ids
34
- });
35
- return {
36
- assignments: assignments.map((assignment)=>({
37
- capacity_id: assignment.capacityId,
38
- assignment_id: assignment.id
39
- }))
40
- };
41
- }
42
- });
43
-
44
- //# sourceMappingURL=assign-capacity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/assign-capacity.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n assignCapacityBatchBodySchema,\n assignCapacityBatchResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {assignCapacityBatch} from '#core/capacity-assignments.js';\nimport {\n CapacityAlreadyAssignedError,\n CapacityNotAssignableError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\n\nexport const assignCapacityRoute = defineRoute({\n method: 'POST',\n path: '/capacity/assignments',\n description: 'Atomically assign provisioner capacity to a live reservation',\n schema: {body: assignCapacityBatchBodySchema, response: {200: assignCapacityBatchResponseSchema}},\n errorHandler: (error) => {\n if (error instanceof ReservationNotFoundError)\n throw new ClientError('Reservation not found', 'reservation-not-found', {status: 404});\n if (error instanceof ReservationExpiredError)\n throw new ClientError('Reservation has expired', 'reservation-expired', {status: 409});\n if (\n error instanceof CapacityAlreadyAssignedError ||\n error instanceof CapacityNotAssignableError\n )\n throw new ClientError('Capacity cannot be assigned', 'capacity-not-assignable', {\n status: 409,\n });\n throw error;\n },\n handler: async (request) => {\n const {provisionerTokenId} = requireProvisionerContext(request);\n const assignments = await assignCapacityBatch({\n provisionerId: provisionerTokenId,\n reservationId: request.body.reservation_id,\n capacityIds: request.body.capacity_ids,\n });\n return {\n assignments: assignments.map((assignment) => ({\n capacity_id: assignment.capacityId,\n assignment_id: assignment.id,\n })),\n };\n },\n});\n"],"names":["requireProvisionerContext","assignCapacityBatchBodySchema","assignCapacityBatchResponseSchema","ClientError","defineRoute","assignCapacityBatch","CapacityAlreadyAssignedError","CapacityNotAssignableError","ReservationExpiredError","ReservationNotFoundError","assignCapacityRoute","method","path","description","schema","body","response","errorHandler","error","status","handler","request","provisionerTokenId","assignments","provisionerId","reservationId","reservation_id","capacityIds","capacity_ids","map","assignment","capacity_id","capacityId","assignment_id","id"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,6BAA6B,EAC7BC,iCAAiC,QAC5B,2BAA2B;AAClC,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,mBAAmB,QAAO,gCAAgC;AAClE,SACEC,4BAA4B,EAC5BC,0BAA0B,EAC1BC,uBAAuB,EACvBC,wBAAwB,QACnB,kBAAkB;AAEzB,OAAO,MAAMC,sBAAsBN,YAAY;IAC7CO,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QAACC,MAAMd;QAA+Be,UAAU;YAAC,KAAKd;QAAiC;IAAC;IAChGe,cAAc,CAACC;QACb,IAAIA,iBAAiBT,0BACnB,MAAM,IAAIN,YAAY,yBAAyB,yBAAyB;YAACgB,QAAQ;QAAG;QACtF,IAAID,iBAAiBV,yBACnB,MAAM,IAAIL,YAAY,2BAA2B,uBAAuB;YAACgB,QAAQ;QAAG;QACtF,IACED,iBAAiBZ,gCACjBY,iBAAiBX,4BAEjB,MAAM,IAAIJ,YAAY,+BAA+B,2BAA2B;YAC9EgB,QAAQ;QACV;QACF,MAAMD;IACR;IACAE,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAC,GAAGtB,0BAA0BqB;QACvD,MAAME,cAAc,MAAMlB,oBAAoB;YAC5CmB,eAAeF;YACfG,eAAeJ,QAAQN,IAAI,CAACW,cAAc;YAC1CC,aAAaN,QAAQN,IAAI,CAACa,YAAY;QACxC;QACA,OAAO;YACLL,aAAaA,YAAYM,GAAG,CAAC,CAACC,aAAgB,CAAA;oBAC5CC,aAAaD,WAAWE,UAAU;oBAClCC,eAAeH,WAAWI,EAAE;gBAC9B,CAAA;QACF;IACF;AACF,GAAG"}
@@ -1,2 +0,0 @@
1
- export declare const mintRegistrationTokensRoute: import("@shipfox/node-fastify").RouteDefinition;
2
- //# sourceMappingURL=mint-registration-tokens.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mint-registration-tokens.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/mint-registration-tokens.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,2BAA2B,iDA0DtC,CAAC"}
@@ -1,74 +0,0 @@
1
- import { requireWorkspaceProvisionerContext } 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 { toMintRegistrationTokensResponseDto, toMintRegistrationTokensRunnerInstances } 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
- provider_runner_ids: error.providerRunnerIds
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 } = requireWorkspaceProvisionerContext(request);
62
- const result = await mintEphemeralRegistrationTokensBatch({
63
- workspaceId,
64
- provisionerId: provisionerTokenId,
65
- reservationId: request.body.reservation_id,
66
- providerRunners: toMintRegistrationTokensRunnerInstances(request.body.runner_instances),
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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/mint-registration-tokens.ts"],"sourcesContent":["import {requireWorkspaceProvisionerContext} 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 toMintRegistrationTokensResponseDto,\n toMintRegistrationTokensRunnerInstances,\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: {provider_runner_ids: error.providerRunnerIds},\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} = requireWorkspaceProvisionerContext(request);\n const result = await mintEphemeralRegistrationTokensBatch({\n workspaceId,\n provisionerId: provisionerTokenId,\n reservationId: request.body.reservation_id,\n providerRunners: toMintRegistrationTokensRunnerInstances(request.body.runner_instances),\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":["requireWorkspaceProvisionerContext","mintRegistrationTokensBatchBodySchema","mintRegistrationTokensBatchResponseSchema","ClientError","defineRoute","config","mintEphemeralRegistrationTokensBatch","ActiveEphemeralRegistrationTokensExistError","RegistrationTokenBatchExceedsReservationError","RegistrationTokenBatchTooLargeError","ReservationExpiredError","ReservationNotFoundError","toMintRegistrationTokensResponseDto","toMintRegistrationTokensRunnerInstances","createProvisionerMintRateLimitPreHandler","mintRegistrationTokensRoute","method","path","description","schema","body","response","preHandler","errorHandler","error","status","details","requested","reservation_count","reservationCount","already_minted","alreadyMinted","provider_runner_ids","providerRunnerIds","max","handler","request","provisionerTokenId","workspaceId","result","provisionerId","reservationId","reservation_id","providerRunners","runner_instances","ttlSeconds","EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS","maxBatchSize","REGISTRATION_TOKEN_BATCH_MAX"],"mappings":"AAAA,SAAQA,kCAAkC,QAAO,4BAA4B;AAC7E,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,mCAAmC,EACnCC,uCAAuC,QAClC,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,qBAAqBR,MAAMS,iBAAiB;gBAAA;YACxD;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,mCAAmCoC;QAC7E,MAAMG,SAAS,MAAMjC,qCAAqC;YACxDgC;YACAE,eAAeH;YACfI,eAAeL,QAAQhB,IAAI,CAACsB,cAAc;YAC1CC,iBAAiB9B,wCAAwCuB,QAAQhB,IAAI,CAACwB,gBAAgB;YACtFC,YAAYxC,OAAOyC,wCAAwC;YAC3DC,cAAc1C,OAAO2C,4BAA4B;QACnD;QAEA,OAAOpC,oCAAoC2B;IAC7C;AACF,GAAG"}
@@ -1,3 +0,0 @@
1
- export declare const createPlannedCapacityRoute: import("@shipfox/node-fastify").RouteDefinition;
2
- export declare const attachProviderRunnerRoute: import("@shipfox/node-fastify").RouteDefinition;
3
- //# sourceMappingURL=planned-capacity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"planned-capacity.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/planned-capacity.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,0BAA0B,iDAiBrC,CAAC;AAEH,eAAO,MAAM,yBAAyB,iDAkBpC,CAAC"}
@@ -1,54 +0,0 @@
1
- import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
- import { attachProviderRunnerBodySchema, attachProviderRunnerResponseSchema, createPlannedCapacityBodySchema, createPlannedCapacityResponseSchema } from '@shipfox/api-runners-dto';
3
- import { defineRoute } from '@shipfox/node-fastify';
4
- import { z } from 'zod';
5
- import { attachProviderRunnerId, createPlannedProvisionedCapacity } from '#core/index.js';
6
- export const createPlannedCapacityRoute = defineRoute({
7
- method: 'POST',
8
- path: '/capacity',
9
- description: 'Create provisioner-owned capacity before provider launch',
10
- schema: {
11
- body: createPlannedCapacityBodySchema,
12
- response: {
13
- 200: createPlannedCapacityResponseSchema
14
- }
15
- },
16
- handler: async (request)=>{
17
- const { provisionerTokenId } = requireProvisionerContext(request);
18
- const result = await createPlannedProvisionedCapacity({
19
- provisionerId: provisionerTokenId,
20
- providerKind: request.body.provider_kind ?? null,
21
- templateKey: request.body.template_key ?? null
22
- });
23
- return {
24
- capacity_id: result.capacityId
25
- };
26
- }
27
- });
28
- export const attachProviderRunnerRoute = defineRoute({
29
- method: 'POST',
30
- path: '/capacity/:capacityId/provider-runner',
31
- description: 'Attach a provider runner identity to planned capacity once',
32
- schema: {
33
- params: z.object({
34
- capacityId: z.string().uuid()
35
- }),
36
- body: attachProviderRunnerBodySchema,
37
- response: {
38
- 200: attachProviderRunnerResponseSchema
39
- }
40
- },
41
- handler: async (request)=>{
42
- const { provisionerTokenId } = requireProvisionerContext(request);
43
- const attached = await attachProviderRunnerId({
44
- capacityId: request.params.capacityId,
45
- provisionerId: provisionerTokenId,
46
- providerRunnerId: request.body.provider_runner_id
47
- });
48
- return {
49
- attached
50
- };
51
- }
52
- });
53
-
54
- //# sourceMappingURL=planned-capacity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/planned-capacity.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n attachProviderRunnerBodySchema,\n attachProviderRunnerResponseSchema,\n createPlannedCapacityBodySchema,\n createPlannedCapacityResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {attachProviderRunnerId, createPlannedProvisionedCapacity} from '#core/index.js';\n\nexport const createPlannedCapacityRoute = defineRoute({\n method: 'POST',\n path: '/capacity',\n description: 'Create provisioner-owned capacity before provider launch',\n schema: {\n body: createPlannedCapacityBodySchema,\n response: {200: createPlannedCapacityResponseSchema},\n },\n handler: async (request) => {\n const {provisionerTokenId} = requireProvisionerContext(request);\n const result = await createPlannedProvisionedCapacity({\n provisionerId: provisionerTokenId,\n providerKind: request.body.provider_kind ?? null,\n templateKey: request.body.template_key ?? null,\n });\n return {capacity_id: result.capacityId};\n },\n});\n\nexport const attachProviderRunnerRoute = defineRoute({\n method: 'POST',\n path: '/capacity/:capacityId/provider-runner',\n description: 'Attach a provider runner identity to planned capacity once',\n schema: {\n params: z.object({capacityId: z.string().uuid()}),\n body: attachProviderRunnerBodySchema,\n response: {200: attachProviderRunnerResponseSchema},\n },\n handler: async (request) => {\n const {provisionerTokenId} = requireProvisionerContext(request);\n const attached = await attachProviderRunnerId({\n capacityId: request.params.capacityId,\n provisionerId: provisionerTokenId,\n providerRunnerId: request.body.provider_runner_id,\n });\n return {attached};\n },\n});\n"],"names":["requireProvisionerContext","attachProviderRunnerBodySchema","attachProviderRunnerResponseSchema","createPlannedCapacityBodySchema","createPlannedCapacityResponseSchema","defineRoute","z","attachProviderRunnerId","createPlannedProvisionedCapacity","createPlannedCapacityRoute","method","path","description","schema","body","response","handler","request","provisionerTokenId","result","provisionerId","providerKind","provider_kind","templateKey","template_key","capacity_id","capacityId","attachProviderRunnerRoute","params","object","string","uuid","attached","providerRunnerId","provider_runner_id"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,8BAA8B,EAC9BC,kCAAkC,EAClCC,+BAA+B,EAC/BC,mCAAmC,QAC9B,2BAA2B;AAClC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,sBAAsB,EAAEC,gCAAgC,QAAO,iBAAiB;AAExF,OAAO,MAAMC,6BAA6BJ,YAAY;IACpDK,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMX;QACNY,UAAU;YAAC,KAAKX;QAAmC;IACrD;IACAY,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAC,GAAGlB,0BAA0BiB;QACvD,MAAME,SAAS,MAAMX,iCAAiC;YACpDY,eAAeF;YACfG,cAAcJ,QAAQH,IAAI,CAACQ,aAAa,IAAI;YAC5CC,aAAaN,QAAQH,IAAI,CAACU,YAAY,IAAI;QAC5C;QACA,OAAO;YAACC,aAAaN,OAAOO,UAAU;QAAA;IACxC;AACF,GAAG;AAEH,OAAO,MAAMC,4BAA4BtB,YAAY;IACnDK,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNe,QAAQtB,EAAEuB,MAAM,CAAC;YAACH,YAAYpB,EAAEwB,MAAM,GAAGC,IAAI;QAAE;QAC/CjB,MAAMb;QACNc,UAAU;YAAC,KAAKb;QAAkC;IACpD;IACAc,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAC,GAAGlB,0BAA0BiB;QACvD,MAAMe,WAAW,MAAMzB,uBAAuB;YAC5CmB,YAAYT,QAAQW,MAAM,CAACF,UAAU;YACrCN,eAAeF;YACfe,kBAAkBhB,QAAQH,IAAI,CAACoB,kBAAkB;QACnD;QACA,OAAO;YAACF;QAAQ;IAClB;AACF,GAAG"}
@@ -1,10 +0,0 @@
1
- import {assignCapacityBatch as assignCapacityBatchDb} from '#db/capacity-assignments.js';
2
- import type {CapacityAssignment} from './entities/capacity-assignment.js';
3
-
4
- export function assignCapacityBatch(params: {
5
- provisionerId: string;
6
- reservationId: string;
7
- capacityIds: string[];
8
- }): Promise<CapacityAssignment[]> {
9
- return assignCapacityBatchDb(params);
10
- }
@@ -1,8 +0,0 @@
1
- export interface CapacityAssignment {
2
- id: string;
3
- capacityId: string;
4
- reservationId: string;
5
- workspaceId: string;
6
- provisionerId: string;
7
- createdAt: Date;
8
- }