@shipfox/api-runners 12.1.0 → 12.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +35 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -2
- package/dist/config.js.map +1 -1
- package/dist/core/errors.d.ts +4 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +6 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/rate-limit.d.ts.map +1 -1
- package/dist/core/runner-control-sessions.d.ts.map +1 -1
- package/dist/core/runner-control-sessions.js +37 -11
- package/dist/core/runner-control-sessions.js.map +1 -1
- package/dist/core/runner-instances.d.ts +1 -0
- package/dist/core/runner-instances.d.ts.map +1 -1
- package/dist/core/runner-instances.js.map +1 -1
- package/dist/core/runner-labels.d.ts +11 -0
- package/dist/core/runner-labels.d.ts.map +1 -0
- package/dist/core/runner-labels.js +41 -0
- package/dist/core/runner-labels.js.map +1 -0
- package/dist/core/runner-sessions.d.ts.map +1 -1
- package/dist/core/runner-sessions.js +5 -1
- package/dist/core/runner-sessions.js.map +1 -1
- package/dist/db/db.d.ts +64 -64
- package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/db/ephemeral-registration-tokens.js +12 -2
- package/dist/db/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/reservations.d.ts.map +1 -1
- package/dist/db/reservations.js +36 -10
- package/dist/db/reservations.js.map +1 -1
- package/dist/db/runner-instances.d.ts +4 -0
- package/dist/db/runner-instances.d.ts.map +1 -1
- package/dist/db/runner-instances.js +16 -5
- package/dist/db/runner-instances.js.map +1 -1
- package/dist/db/runner-sessions.d.ts.map +1 -1
- package/dist/db/runner-sessions.js +33 -15
- package/dist/db/runner-sessions.js.map +1 -1
- package/dist/db/schema/admin-command-results.d.ts +1 -1
- package/dist/db/schema/ephemeral-registration-tokens.d.ts +1 -1
- package/dist/db/schema/manual-registration-tokens.d.ts +1 -1
- package/dist/db/schema/outbox.d.ts +1 -1
- package/dist/db/schema/pending-job-executions.d.ts +3 -3
- package/dist/db/schema/provisioner-capability-snapshots.d.ts +3 -3
- package/dist/db/schema/provisioner-tokens.d.ts +2 -2
- package/dist/db/schema/rate-limits.d.ts +1 -1
- package/dist/db/schema/reservations.d.ts +3 -3
- package/dist/db/schema/runner-activation-tokens.d.ts +1 -1
- package/dist/db/schema/runner-control-sessions.d.ts +2 -2
- package/dist/db/schema/runner-instances.d.ts +4 -4
- package/dist/db/schema/runner-instances.d.ts.map +1 -1
- package/dist/db/schema/runner-instances.js +1 -0
- package/dist/db/schema/runner-instances.js.map +1 -1
- package/dist/db/schema/runner-sessions.d.ts +4 -4
- package/dist/db/schema/running-job-executions.d.ts +5 -5
- package/dist/metrics/index.d.ts +2 -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 +13 -8
- package/dist/metrics/instance.d.ts.map +1 -1
- package/dist/metrics/instance.js +8 -0
- package/dist/metrics/instance.js.map +1 -1
- package/dist/metrics/service.d.ts.map +1 -1
- package/dist/metrics/service.js +20 -4
- package/dist/metrics/service.js.map +1 -1
- package/dist/presentation/dto/admin-provisioner-token.d.ts +1 -1
- package/dist/presentation/dto/admin-provisioner-token.d.ts.map +1 -1
- package/dist/presentation/dto/admin-runner-instances.d.ts +2 -2
- package/dist/presentation/dto/admin-runner-instances.d.ts.map +1 -1
- package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
- package/dist/presentation/routes/poll-demand.js +12 -6
- package/dist/presentation/routes/poll-demand.js.map +1 -1
- package/dist/presentation/routes/rate-limit.d.ts.map +1 -1
- package/dist/presentation/routes/register.d.ts.map +1 -1
- package/dist/presentation/routes/register.js +9 -1
- package/dist/presentation/routes/register.js.map +1 -1
- package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -1
- package/dist/presentation/routes/report-runner-instances.js +1 -0
- package/dist/presentation/routes/report-runner-instances.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0004_huge_skreet.sql +1 -0
- package/drizzle/meta/0004_snapshot.json +2194 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +9 -9
- package/src/config.test.ts +81 -0
- package/src/config.ts +39 -2
- package/src/core/errors.ts +9 -0
- package/src/core/index.ts +1 -0
- package/src/core/runner-control-sessions.test.ts +404 -0
- package/src/core/runner-control-sessions.ts +51 -11
- package/src/core/runner-instances.ts +1 -0
- package/src/core/runner-labels.test.ts +53 -0
- package/src/core/runner-labels.ts +51 -0
- package/src/core/runner-sessions.test.ts +34 -1
- package/src/core/runner-sessions.ts +8 -1
- package/src/db/ephemeral-registration-tokens.ts +15 -1
- package/src/db/index.ts +1 -0
- package/src/db/reservations.test.ts +537 -0
- package/src/db/reservations.ts +116 -17
- package/src/db/runner-instances.test.ts +276 -1
- package/src/db/runner-instances.ts +39 -3
- package/src/db/runner-sessions.ts +39 -15
- package/src/db/schema/runner-instances.ts +3 -0
- package/src/metrics/index.ts +2 -0
- package/src/metrics/instance.ts +18 -0
- package/src/metrics/service.test.ts +99 -0
- package/src/metrics/service.ts +24 -4
- package/src/presentation/routes/late-runner-enrollment.test.ts +230 -0
- package/src/presentation/routes/poll-demand.test.ts +116 -3
- package/src/presentation/routes/poll-demand.ts +18 -6
- package/src/presentation/routes/register.test.ts +116 -2
- package/src/presentation/routes/register.ts +7 -0
- package/src/presentation/routes/report-runner-instances.test.ts +33 -0
- package/src/presentation/routes/report-runner-instances.ts +1 -0
- package/src/presentation/routes/runner-enrollment.test.ts +65 -5
- package/src/temporal/activities/maintenance-activities.test.ts +24 -31
- package/test/env.ts +1 -0
- package/test/fixtures/late-runner-enrollment.ts +103 -0
- package/test/index.ts +5 -0
- package/tsconfig.build.tsbuildinfo +1 -1
package/dist/db/db.d.ts
CHANGED
|
@@ -126,7 +126,7 @@ export declare const schema: {
|
|
|
126
126
|
generated: undefined;
|
|
127
127
|
}, {}, {}>;
|
|
128
128
|
};
|
|
129
|
-
dialect:
|
|
129
|
+
dialect: 'pg';
|
|
130
130
|
}>;
|
|
131
131
|
ephemeralRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
132
132
|
name: "ephemeral_registration_tokens";
|
|
@@ -320,7 +320,7 @@ export declare const schema: {
|
|
|
320
320
|
generated: undefined;
|
|
321
321
|
}, {}, {}>;
|
|
322
322
|
};
|
|
323
|
-
dialect:
|
|
323
|
+
dialect: 'pg';
|
|
324
324
|
}>;
|
|
325
325
|
pendingJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
326
326
|
name: "pending_jobs";
|
|
@@ -480,8 +480,8 @@ export declare const schema: {
|
|
|
480
480
|
}, {}, {
|
|
481
481
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
482
482
|
name: "required_labels";
|
|
483
|
-
dataType:
|
|
484
|
-
columnType:
|
|
483
|
+
dataType: 'string';
|
|
484
|
+
columnType: 'PgText';
|
|
485
485
|
data: string;
|
|
486
486
|
enumValues: [string, ...string[]];
|
|
487
487
|
driverParam: string;
|
|
@@ -506,7 +506,7 @@ export declare const schema: {
|
|
|
506
506
|
generated: undefined;
|
|
507
507
|
}, {}, {}>;
|
|
508
508
|
};
|
|
509
|
-
dialect:
|
|
509
|
+
dialect: 'pg';
|
|
510
510
|
}>;
|
|
511
511
|
providerRunners: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
512
512
|
name: "runner_instances";
|
|
@@ -683,8 +683,8 @@ export declare const schema: {
|
|
|
683
683
|
}, {}, {
|
|
684
684
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
685
685
|
name: "labels";
|
|
686
|
-
dataType:
|
|
687
|
-
columnType:
|
|
686
|
+
dataType: 'string';
|
|
687
|
+
columnType: 'PgText';
|
|
688
688
|
data: string;
|
|
689
689
|
enumValues: [string, ...string[]];
|
|
690
690
|
driverParam: string;
|
|
@@ -696,7 +696,7 @@ export declare const schema: {
|
|
|
696
696
|
tableName: "runner_instances";
|
|
697
697
|
dataType: "string";
|
|
698
698
|
columnType: "PgEnumColumn";
|
|
699
|
-
data: "
|
|
699
|
+
data: "failed" | "running" | "starting" | "stopped" | "stopping" | "terminated";
|
|
700
700
|
driverParam: string;
|
|
701
701
|
notNull: true;
|
|
702
702
|
hasDefault: false;
|
|
@@ -984,7 +984,7 @@ export declare const schema: {
|
|
|
984
984
|
generated: undefined;
|
|
985
985
|
}, {}, {}>;
|
|
986
986
|
};
|
|
987
|
-
dialect:
|
|
987
|
+
dialect: 'pg';
|
|
988
988
|
}>;
|
|
989
989
|
provisionerCapabilitySnapshots: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
990
990
|
name: "provisioner_capability_snapshots";
|
|
@@ -1093,8 +1093,8 @@ export declare const schema: {
|
|
|
1093
1093
|
}, {}, {
|
|
1094
1094
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
1095
1095
|
name: "labels";
|
|
1096
|
-
dataType:
|
|
1097
|
-
columnType:
|
|
1096
|
+
dataType: 'string';
|
|
1097
|
+
columnType: 'PgText';
|
|
1098
1098
|
data: string;
|
|
1099
1099
|
enumValues: [string, ...string[]];
|
|
1100
1100
|
driverParam: string;
|
|
@@ -1187,7 +1187,7 @@ export declare const schema: {
|
|
|
1187
1187
|
generated: undefined;
|
|
1188
1188
|
}, {}, {}>;
|
|
1189
1189
|
};
|
|
1190
|
-
dialect:
|
|
1190
|
+
dialect: 'pg';
|
|
1191
1191
|
}>;
|
|
1192
1192
|
provisionerTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
1193
1193
|
name: "provisioner_tokens";
|
|
@@ -1215,7 +1215,7 @@ export declare const schema: {
|
|
|
1215
1215
|
tableName: "provisioner_tokens";
|
|
1216
1216
|
dataType: "string";
|
|
1217
1217
|
columnType: "PgEnumColumn";
|
|
1218
|
-
data: "
|
|
1218
|
+
data: "installation" | "workspace";
|
|
1219
1219
|
driverParam: string;
|
|
1220
1220
|
notNull: true;
|
|
1221
1221
|
hasDefault: false;
|
|
@@ -1415,7 +1415,7 @@ export declare const schema: {
|
|
|
1415
1415
|
generated: undefined;
|
|
1416
1416
|
}, {}, {}>;
|
|
1417
1417
|
};
|
|
1418
|
-
dialect:
|
|
1418
|
+
dialect: 'pg';
|
|
1419
1419
|
}>;
|
|
1420
1420
|
runnersRateLimits: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
1421
1421
|
name: "rate_limits";
|
|
@@ -1558,7 +1558,7 @@ export declare const schema: {
|
|
|
1558
1558
|
generated: undefined;
|
|
1559
1559
|
}, {}, {}>;
|
|
1560
1560
|
};
|
|
1561
|
-
dialect:
|
|
1561
|
+
dialect: 'pg';
|
|
1562
1562
|
}>;
|
|
1563
1563
|
reservations: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
1564
1564
|
name: "reservations";
|
|
@@ -1650,8 +1650,8 @@ export declare const schema: {
|
|
|
1650
1650
|
}, {}, {
|
|
1651
1651
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
1652
1652
|
name: "required_labels";
|
|
1653
|
-
dataType:
|
|
1654
|
-
columnType:
|
|
1653
|
+
dataType: 'string';
|
|
1654
|
+
columnType: 'PgText';
|
|
1655
1655
|
data: string;
|
|
1656
1656
|
enumValues: [string, ...string[]];
|
|
1657
1657
|
driverParam: string;
|
|
@@ -1710,7 +1710,7 @@ export declare const schema: {
|
|
|
1710
1710
|
generated: undefined;
|
|
1711
1711
|
}, {}, {}>;
|
|
1712
1712
|
};
|
|
1713
|
-
dialect:
|
|
1713
|
+
dialect: 'pg';
|
|
1714
1714
|
}>;
|
|
1715
1715
|
runnerSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
1716
1716
|
name: "runner_sessions";
|
|
@@ -1789,7 +1789,7 @@ export declare const schema: {
|
|
|
1789
1789
|
tableName: "runner_sessions";
|
|
1790
1790
|
dataType: "string";
|
|
1791
1791
|
columnType: "PgEnumColumn";
|
|
1792
|
-
data: "
|
|
1792
|
+
data: "activation" | "ephemeral" | "manual";
|
|
1793
1793
|
driverParam: string;
|
|
1794
1794
|
notNull: true;
|
|
1795
1795
|
hasDefault: false;
|
|
@@ -1887,8 +1887,8 @@ export declare const schema: {
|
|
|
1887
1887
|
}, {}, {
|
|
1888
1888
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
1889
1889
|
name: "labels";
|
|
1890
|
-
dataType:
|
|
1891
|
-
columnType:
|
|
1890
|
+
dataType: 'string';
|
|
1891
|
+
columnType: 'PgText';
|
|
1892
1892
|
data: string;
|
|
1893
1893
|
enumValues: [string, ...string[]];
|
|
1894
1894
|
driverParam: string;
|
|
@@ -2035,7 +2035,7 @@ export declare const schema: {
|
|
|
2035
2035
|
generated: undefined;
|
|
2036
2036
|
}, {}, {}>;
|
|
2037
2037
|
};
|
|
2038
|
-
dialect:
|
|
2038
|
+
dialect: 'pg';
|
|
2039
2039
|
}>;
|
|
2040
2040
|
runnerBootstrapTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
2041
2041
|
name: "runner_bootstrap_tokens";
|
|
@@ -2195,7 +2195,7 @@ export declare const schema: {
|
|
|
2195
2195
|
generated: undefined;
|
|
2196
2196
|
}, {}, {}>;
|
|
2197
2197
|
};
|
|
2198
|
-
dialect:
|
|
2198
|
+
dialect: 'pg';
|
|
2199
2199
|
}>;
|
|
2200
2200
|
runnerControlSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
2201
2201
|
name: "runner_control_sessions";
|
|
@@ -2372,7 +2372,7 @@ export declare const schema: {
|
|
|
2372
2372
|
generated: undefined;
|
|
2373
2373
|
}, {}, {}>;
|
|
2374
2374
|
};
|
|
2375
|
-
dialect:
|
|
2375
|
+
dialect: 'pg';
|
|
2376
2376
|
}>;
|
|
2377
2377
|
runnerActivationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
2378
2378
|
name: "runner_activation_tokens";
|
|
@@ -2532,7 +2532,7 @@ export declare const schema: {
|
|
|
2532
2532
|
generated: undefined;
|
|
2533
2533
|
}, {}, {}>;
|
|
2534
2534
|
};
|
|
2535
|
-
dialect:
|
|
2535
|
+
dialect: 'pg';
|
|
2536
2536
|
}>;
|
|
2537
2537
|
manualRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
2538
2538
|
name: "manual_registration_tokens";
|
|
@@ -2692,7 +2692,7 @@ export declare const schema: {
|
|
|
2692
2692
|
generated: undefined;
|
|
2693
2693
|
}, {}, {}>;
|
|
2694
2694
|
};
|
|
2695
|
-
dialect:
|
|
2695
|
+
dialect: 'pg';
|
|
2696
2696
|
}>;
|
|
2697
2697
|
runningJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
2698
2698
|
name: "running_jobs";
|
|
@@ -2903,8 +2903,8 @@ export declare const schema: {
|
|
|
2903
2903
|
}, {}, {
|
|
2904
2904
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
2905
2905
|
name: "required_labels";
|
|
2906
|
-
dataType:
|
|
2907
|
-
columnType:
|
|
2906
|
+
dataType: 'string';
|
|
2907
|
+
columnType: 'PgText';
|
|
2908
2908
|
data: string;
|
|
2909
2909
|
enumValues: [string, ...string[]];
|
|
2910
2910
|
driverParam: string;
|
|
@@ -2946,8 +2946,8 @@ export declare const schema: {
|
|
|
2946
2946
|
}, {}, {
|
|
2947
2947
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
2948
2948
|
name: "runner_labels";
|
|
2949
|
-
dataType:
|
|
2950
|
-
columnType:
|
|
2949
|
+
dataType: 'string';
|
|
2950
|
+
columnType: 'PgText';
|
|
2951
2951
|
data: string;
|
|
2952
2952
|
enumValues: [string, ...string[]];
|
|
2953
2953
|
driverParam: string;
|
|
@@ -3023,7 +3023,7 @@ export declare const schema: {
|
|
|
3023
3023
|
generated: undefined;
|
|
3024
3024
|
}, {}, {}>;
|
|
3025
3025
|
};
|
|
3026
|
-
dialect:
|
|
3026
|
+
dialect: 'pg';
|
|
3027
3027
|
}>;
|
|
3028
3028
|
runnersOutbox: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
3029
3029
|
name: "outbox";
|
|
@@ -3217,7 +3217,7 @@ export declare const schema: {
|
|
|
3217
3217
|
generated: undefined;
|
|
3218
3218
|
}, {}, {}>;
|
|
3219
3219
|
};
|
|
3220
|
-
dialect:
|
|
3220
|
+
dialect: 'pg';
|
|
3221
3221
|
}>;
|
|
3222
3222
|
};
|
|
3223
3223
|
export declare function db(): NodePgDatabase<{
|
|
@@ -3347,7 +3347,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
3347
3347
|
generated: undefined;
|
|
3348
3348
|
}, {}, {}>;
|
|
3349
3349
|
};
|
|
3350
|
-
dialect:
|
|
3350
|
+
dialect: 'pg';
|
|
3351
3351
|
}>;
|
|
3352
3352
|
ephemeralRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
3353
3353
|
name: "ephemeral_registration_tokens";
|
|
@@ -3541,7 +3541,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
3541
3541
|
generated: undefined;
|
|
3542
3542
|
}, {}, {}>;
|
|
3543
3543
|
};
|
|
3544
|
-
dialect:
|
|
3544
|
+
dialect: 'pg';
|
|
3545
3545
|
}>;
|
|
3546
3546
|
pendingJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
3547
3547
|
name: "pending_jobs";
|
|
@@ -3701,8 +3701,8 @@ export declare function db(): NodePgDatabase<{
|
|
|
3701
3701
|
}, {}, {
|
|
3702
3702
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
3703
3703
|
name: "required_labels";
|
|
3704
|
-
dataType:
|
|
3705
|
-
columnType:
|
|
3704
|
+
dataType: 'string';
|
|
3705
|
+
columnType: 'PgText';
|
|
3706
3706
|
data: string;
|
|
3707
3707
|
enumValues: [string, ...string[]];
|
|
3708
3708
|
driverParam: string;
|
|
@@ -3727,7 +3727,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
3727
3727
|
generated: undefined;
|
|
3728
3728
|
}, {}, {}>;
|
|
3729
3729
|
};
|
|
3730
|
-
dialect:
|
|
3730
|
+
dialect: 'pg';
|
|
3731
3731
|
}>;
|
|
3732
3732
|
providerRunners: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
3733
3733
|
name: "runner_instances";
|
|
@@ -3904,8 +3904,8 @@ export declare function db(): NodePgDatabase<{
|
|
|
3904
3904
|
}, {}, {
|
|
3905
3905
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
3906
3906
|
name: "labels";
|
|
3907
|
-
dataType:
|
|
3908
|
-
columnType:
|
|
3907
|
+
dataType: 'string';
|
|
3908
|
+
columnType: 'PgText';
|
|
3909
3909
|
data: string;
|
|
3910
3910
|
enumValues: [string, ...string[]];
|
|
3911
3911
|
driverParam: string;
|
|
@@ -3917,7 +3917,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
3917
3917
|
tableName: "runner_instances";
|
|
3918
3918
|
dataType: "string";
|
|
3919
3919
|
columnType: "PgEnumColumn";
|
|
3920
|
-
data: "
|
|
3920
|
+
data: "failed" | "running" | "starting" | "stopped" | "stopping" | "terminated";
|
|
3921
3921
|
driverParam: string;
|
|
3922
3922
|
notNull: true;
|
|
3923
3923
|
hasDefault: false;
|
|
@@ -4205,7 +4205,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
4205
4205
|
generated: undefined;
|
|
4206
4206
|
}, {}, {}>;
|
|
4207
4207
|
};
|
|
4208
|
-
dialect:
|
|
4208
|
+
dialect: 'pg';
|
|
4209
4209
|
}>;
|
|
4210
4210
|
provisionerCapabilitySnapshots: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4211
4211
|
name: "provisioner_capability_snapshots";
|
|
@@ -4314,8 +4314,8 @@ export declare function db(): NodePgDatabase<{
|
|
|
4314
4314
|
}, {}, {
|
|
4315
4315
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
4316
4316
|
name: "labels";
|
|
4317
|
-
dataType:
|
|
4318
|
-
columnType:
|
|
4317
|
+
dataType: 'string';
|
|
4318
|
+
columnType: 'PgText';
|
|
4319
4319
|
data: string;
|
|
4320
4320
|
enumValues: [string, ...string[]];
|
|
4321
4321
|
driverParam: string;
|
|
@@ -4408,7 +4408,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
4408
4408
|
generated: undefined;
|
|
4409
4409
|
}, {}, {}>;
|
|
4410
4410
|
};
|
|
4411
|
-
dialect:
|
|
4411
|
+
dialect: 'pg';
|
|
4412
4412
|
}>;
|
|
4413
4413
|
provisionerTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4414
4414
|
name: "provisioner_tokens";
|
|
@@ -4436,7 +4436,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
4436
4436
|
tableName: "provisioner_tokens";
|
|
4437
4437
|
dataType: "string";
|
|
4438
4438
|
columnType: "PgEnumColumn";
|
|
4439
|
-
data: "
|
|
4439
|
+
data: "installation" | "workspace";
|
|
4440
4440
|
driverParam: string;
|
|
4441
4441
|
notNull: true;
|
|
4442
4442
|
hasDefault: false;
|
|
@@ -4636,7 +4636,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
4636
4636
|
generated: undefined;
|
|
4637
4637
|
}, {}, {}>;
|
|
4638
4638
|
};
|
|
4639
|
-
dialect:
|
|
4639
|
+
dialect: 'pg';
|
|
4640
4640
|
}>;
|
|
4641
4641
|
runnersRateLimits: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4642
4642
|
name: "rate_limits";
|
|
@@ -4779,7 +4779,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
4779
4779
|
generated: undefined;
|
|
4780
4780
|
}, {}, {}>;
|
|
4781
4781
|
};
|
|
4782
|
-
dialect:
|
|
4782
|
+
dialect: 'pg';
|
|
4783
4783
|
}>;
|
|
4784
4784
|
reservations: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4785
4785
|
name: "reservations";
|
|
@@ -4871,8 +4871,8 @@ export declare function db(): NodePgDatabase<{
|
|
|
4871
4871
|
}, {}, {
|
|
4872
4872
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
4873
4873
|
name: "required_labels";
|
|
4874
|
-
dataType:
|
|
4875
|
-
columnType:
|
|
4874
|
+
dataType: 'string';
|
|
4875
|
+
columnType: 'PgText';
|
|
4876
4876
|
data: string;
|
|
4877
4877
|
enumValues: [string, ...string[]];
|
|
4878
4878
|
driverParam: string;
|
|
@@ -4931,7 +4931,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
4931
4931
|
generated: undefined;
|
|
4932
4932
|
}, {}, {}>;
|
|
4933
4933
|
};
|
|
4934
|
-
dialect:
|
|
4934
|
+
dialect: 'pg';
|
|
4935
4935
|
}>;
|
|
4936
4936
|
runnerSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4937
4937
|
name: "runner_sessions";
|
|
@@ -5010,7 +5010,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
5010
5010
|
tableName: "runner_sessions";
|
|
5011
5011
|
dataType: "string";
|
|
5012
5012
|
columnType: "PgEnumColumn";
|
|
5013
|
-
data: "
|
|
5013
|
+
data: "activation" | "ephemeral" | "manual";
|
|
5014
5014
|
driverParam: string;
|
|
5015
5015
|
notNull: true;
|
|
5016
5016
|
hasDefault: false;
|
|
@@ -5108,8 +5108,8 @@ export declare function db(): NodePgDatabase<{
|
|
|
5108
5108
|
}, {}, {
|
|
5109
5109
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
5110
5110
|
name: "labels";
|
|
5111
|
-
dataType:
|
|
5112
|
-
columnType:
|
|
5111
|
+
dataType: 'string';
|
|
5112
|
+
columnType: 'PgText';
|
|
5113
5113
|
data: string;
|
|
5114
5114
|
enumValues: [string, ...string[]];
|
|
5115
5115
|
driverParam: string;
|
|
@@ -5256,7 +5256,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
5256
5256
|
generated: undefined;
|
|
5257
5257
|
}, {}, {}>;
|
|
5258
5258
|
};
|
|
5259
|
-
dialect:
|
|
5259
|
+
dialect: 'pg';
|
|
5260
5260
|
}>;
|
|
5261
5261
|
runnerBootstrapTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
5262
5262
|
name: "runner_bootstrap_tokens";
|
|
@@ -5416,7 +5416,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
5416
5416
|
generated: undefined;
|
|
5417
5417
|
}, {}, {}>;
|
|
5418
5418
|
};
|
|
5419
|
-
dialect:
|
|
5419
|
+
dialect: 'pg';
|
|
5420
5420
|
}>;
|
|
5421
5421
|
runnerControlSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
5422
5422
|
name: "runner_control_sessions";
|
|
@@ -5593,7 +5593,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
5593
5593
|
generated: undefined;
|
|
5594
5594
|
}, {}, {}>;
|
|
5595
5595
|
};
|
|
5596
|
-
dialect:
|
|
5596
|
+
dialect: 'pg';
|
|
5597
5597
|
}>;
|
|
5598
5598
|
runnerActivationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
5599
5599
|
name: "runner_activation_tokens";
|
|
@@ -5753,7 +5753,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
5753
5753
|
generated: undefined;
|
|
5754
5754
|
}, {}, {}>;
|
|
5755
5755
|
};
|
|
5756
|
-
dialect:
|
|
5756
|
+
dialect: 'pg';
|
|
5757
5757
|
}>;
|
|
5758
5758
|
manualRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
5759
5759
|
name: "manual_registration_tokens";
|
|
@@ -5913,7 +5913,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
5913
5913
|
generated: undefined;
|
|
5914
5914
|
}, {}, {}>;
|
|
5915
5915
|
};
|
|
5916
|
-
dialect:
|
|
5916
|
+
dialect: 'pg';
|
|
5917
5917
|
}>;
|
|
5918
5918
|
runningJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
5919
5919
|
name: "running_jobs";
|
|
@@ -6124,8 +6124,8 @@ export declare function db(): NodePgDatabase<{
|
|
|
6124
6124
|
}, {}, {
|
|
6125
6125
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
6126
6126
|
name: "required_labels";
|
|
6127
|
-
dataType:
|
|
6128
|
-
columnType:
|
|
6127
|
+
dataType: 'string';
|
|
6128
|
+
columnType: 'PgText';
|
|
6129
6129
|
data: string;
|
|
6130
6130
|
enumValues: [string, ...string[]];
|
|
6131
6131
|
driverParam: string;
|
|
@@ -6167,8 +6167,8 @@ export declare function db(): NodePgDatabase<{
|
|
|
6167
6167
|
}, {}, {
|
|
6168
6168
|
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
6169
6169
|
name: "runner_labels";
|
|
6170
|
-
dataType:
|
|
6171
|
-
columnType:
|
|
6170
|
+
dataType: 'string';
|
|
6171
|
+
columnType: 'PgText';
|
|
6172
6172
|
data: string;
|
|
6173
6173
|
enumValues: [string, ...string[]];
|
|
6174
6174
|
driverParam: string;
|
|
@@ -6244,7 +6244,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
6244
6244
|
generated: undefined;
|
|
6245
6245
|
}, {}, {}>;
|
|
6246
6246
|
};
|
|
6247
|
-
dialect:
|
|
6247
|
+
dialect: 'pg';
|
|
6248
6248
|
}>;
|
|
6249
6249
|
runnersOutbox: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
6250
6250
|
name: "outbox";
|
|
@@ -6438,7 +6438,7 @@ export declare function db(): NodePgDatabase<{
|
|
|
6438
6438
|
generated: undefined;
|
|
6439
6439
|
}, {}, {}>;
|
|
6440
6440
|
};
|
|
6441
|
-
dialect:
|
|
6441
|
+
dialect: 'pg';
|
|
6442
6442
|
}>;
|
|
6443
6443
|
}>;
|
|
6444
6444
|
export declare function closeDb(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ephemeral-registration-tokens.d.ts","sourceRoot":"","sources":["../../src/db/ephemeral-registration-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"ephemeral-registration-tokens.d.ts","sourceRoot":"","sources":["../../src/db/ephemeral-registration-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,gDAAgD,CAAC;AAuB/F,MAAM,WAAW,sCAAsC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,yCAAyC;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4CAA4C;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,yCAAyC,EAAE,CAAC;CACnD;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,0BAA0B,CAAC,CAiDrC;AAED,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,4CAA4C,GACnD,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAoGvC;AAED,wBAAsB,uCAAuC,CAC3D,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAUjD;AAED,MAAM,WAAW,8CAA8C;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,wCAAwC,CAC5D,MAAM,EAAE,8CAA8C,GACrD,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,0CAA0C,CAAC,MAAM,EAAE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB,qDAiGA"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { and, asc, eq, gt, inArray, isNull, lt, sql } from 'drizzle-orm';
|
|
2
|
-
import { ActiveEphemeralRegistrationTokenExistsError, ActiveEphemeralRegistrationTokensExistError, RegistrationTokenBatchExceedsReservationError, RegistrationTokenConsumedError, RegistrationTokenExpiredError, RegistrationTokenWorkspaceMismatchError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
|
|
2
|
+
import { ActiveEphemeralRegistrationTokenExistsError, ActiveEphemeralRegistrationTokensExistError, EmptyRunnerLabelsError, RegistrationTokenBatchExceedsReservationError, RegistrationTokenConsumedError, RegistrationTokenExpiredError, RegistrationTokenWorkspaceMismatchError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
|
|
3
|
+
import { sanitizeRunnerLabelsOrThrow } from '#core/runner-labels.js';
|
|
3
4
|
import { db } from './db.js';
|
|
4
5
|
import { ephemeralRegistrationTokens, toEphemeralRegistrationToken } from './schema/ephemeral-registration-tokens.js';
|
|
6
|
+
import { provisionerTokens } from './schema/provisioner-tokens.js';
|
|
5
7
|
import { reservations } from './schema/reservations.js';
|
|
6
8
|
import { providerRunners } from './schema/runner-instances.js';
|
|
7
9
|
import { runnerSessions, toRunnerSession } from './schema/runner-sessions.js';
|
|
@@ -142,6 +144,14 @@ export async function createRunnerSessionConsumingEphemeralToken(params) {
|
|
|
142
144
|
if (token.isExpired) throw new RegistrationTokenExpiredError(params.ephemeralTokenId);
|
|
143
145
|
throw new Error(`Ephemeral registration token could not be consumed: ${params.ephemeralTokenId}`);
|
|
144
146
|
}
|
|
147
|
+
const [provisioner] = await tx.select({
|
|
148
|
+
scope: provisionerTokens.scope
|
|
149
|
+
}).from(provisionerTokens).where(eq(provisionerTokens.id, consumed[0].provisionerId)).limit(1);
|
|
150
|
+
const labels = sanitizeRunnerLabelsOrThrow(params.labels, {
|
|
151
|
+
scope: provisioner?.scope ?? 'workspace',
|
|
152
|
+
source: 'ephemeral runner registration'
|
|
153
|
+
});
|
|
154
|
+
if (labels.length === 0) throw new EmptyRunnerLabelsError();
|
|
145
155
|
const [session] = await tx.insert(runnerSessions).values({
|
|
146
156
|
workspaceId: params.workspaceId,
|
|
147
157
|
scope: 'workspace',
|
|
@@ -149,7 +159,7 @@ export async function createRunnerSessionConsumingEphemeralToken(params) {
|
|
|
149
159
|
registrationTokenKind: 'ephemeral',
|
|
150
160
|
provisionerId: consumed[0].provisionerId,
|
|
151
161
|
providerRunnerId: consumed[0].providerRunnerId,
|
|
152
|
-
labels
|
|
162
|
+
labels,
|
|
153
163
|
toolCapabilities: params.toolCapabilities ?? null,
|
|
154
164
|
toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,
|
|
155
165
|
maxClaims: params.maxClaims,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/ephemeral-registration-tokens.ts"],"sourcesContent":["import type {RunnerToolCapabilitiesDto} from '@shipfox/api-runners-dto';\nimport {and, asc, eq, gt, inArray, isNull, lt, sql} from 'drizzle-orm';\nimport type {EphemeralRegistrationToken} from '#core/entities/ephemeral-registration-token.js';\nimport {\n ActiveEphemeralRegistrationTokenExistsError,\n ActiveEphemeralRegistrationTokensExistError,\n RegistrationTokenBatchExceedsReservationError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n RegistrationTokenWorkspaceMismatchError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\nimport {db} from './db.js';\nimport {\n ephemeralRegistrationTokens,\n toEphemeralRegistrationToken,\n} from './schema/ephemeral-registration-tokens.js';\nimport {reservations} from './schema/reservations.js';\nimport {providerRunners} from './schema/runner-instances.js';\nimport {runnerSessions, toRunnerSession} from './schema/runner-sessions.js';\n\nexport interface CreateEphemeralRegistrationTokenParams {\n workspaceId: string;\n provisionerId: string;\n reservationId?: string | null | undefined;\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n expiresAt: Date;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchRow {\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchParams {\n workspaceId: string;\n provisionerId: string;\n reservationId: string;\n expiresAt: Date;\n rows: CreateEphemeralRegistrationTokensBatchRow[];\n}\n\nexport async function createEphemeralRegistrationToken(\n params: CreateEphemeralRegistrationTokenParams,\n): Promise<EphemeralRegistrationToken> {\n const rows = await db().transaction(async (tx) => {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n\n const [active] = await tx\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.providerRunnerId, params.providerRunnerId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .limit(1);\n\n if (active) {\n throw new ActiveEphemeralRegistrationTokenExistsError(\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId ?? null,\n providerRunnerId: params.providerRunnerId,\n hashedToken: params.hashedToken,\n prefix: params.prefix,\n expiresAt: params.expiresAt,\n })\n .returning();\n });\n\n const row = rows[0];\n if (!row) throw new Error('Insert returned no rows');\n return toEphemeralRegistrationToken(row);\n}\n\nexport async function createEphemeralRegistrationTokensBatch(\n params: CreateEphemeralRegistrationTokensBatchParams,\n): Promise<EphemeralRegistrationToken[]> {\n const rows = await db().transaction(async (tx) => {\n const provisionerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionerLockKey}))`);\n for (const providerRunnerId of [\n ...new Set(params.rows.map((row) => row.providerRunnerId)),\n ].sort()) {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n }\n\n const [reservation] = await tx\n .select({\n count: reservations.count,\n isExpired: sql<boolean>`${reservations.expiresAt} <= now()`,\n })\n .from(reservations)\n .where(\n and(\n eq(reservations.id, params.reservationId),\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n ),\n )\n .limit(1);\n\n if (!reservation) throw new ReservationNotFoundError(params.reservationId);\n if (reservation.isExpired) throw new ReservationExpiredError(params.reservationId);\n if (params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n );\n }\n\n const [existingForReservation] = await tx\n .select({count: sql<number>`count(*)::int`})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.reservationId, params.reservationId),\n ),\n );\n const alreadyMinted = existingForReservation?.count ?? 0;\n if (alreadyMinted + params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n alreadyMinted,\n );\n }\n\n const providerRunnerIds = params.rows.map((row) => row.providerRunnerId);\n const activeRows = await tx\n .select({providerRunnerId: ephemeralRegistrationTokens.providerRunnerId})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n );\n\n if (activeRows.length > 0) {\n throw new ActiveEphemeralRegistrationTokensExistError(\n activeRows.map((row) => row.providerRunnerId),\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values(\n params.rows.map((row) => ({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId,\n providerRunnerId: row.providerRunnerId,\n hashedToken: row.hashedToken,\n prefix: row.prefix,\n expiresAt: params.expiresAt,\n })),\n )\n .returning();\n });\n\n return rows.map(toEphemeralRegistrationToken);\n}\n\nexport async function resolveEphemeralRegistrationTokenByHash(\n hashedToken: string,\n): Promise<EphemeralRegistrationToken | undefined> {\n const rows = await db()\n .select()\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.hashedToken, hashedToken))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toEphemeralRegistrationToken(row);\n}\n\nexport interface DeleteExpiredEphemeralRegistrationTokensParams {\n retentionDays: number;\n limit?: number;\n}\n\n/**\n * Deletes ephemeral registration tokens that have reached a terminal state and\n * outlived the retention window. A token is terminal once it is consumed\n * (single use spent) or expired without consumption; the retention window is\n * measured from that terminal event so the audit record survives a bounded\n * debugging window. Active tokens that are neither consumed nor expired are\n * never deleted, so a live single-use credential is never removed early.\n */\nexport async function deleteExpiredEphemeralRegistrationTokens(\n params: DeleteExpiredEphemeralRegistrationTokensParams,\n): Promise<number> {\n // coalesce(consumed_at, expires_at) is the terminal timestamp: consumed_at\n // when the token was spent, otherwise its expiry. Comparing it to the cutoff\n // both selects deletable rows and orders the batch, and it matches the\n // terminal index so idle GC ticks never scan live rows.\n const terminalAt = sql`coalesce(${ephemeralRegistrationTokens.consumedAt}, ${ephemeralRegistrationTokens.expiresAt})`;\n const retentionCutoff = sql`now() - (${params.retentionDays} || ' days')::interval`;\n\n const deletableIds = db()\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(lt(terminalAt, retentionCutoff))\n .orderBy(asc(terminalAt), asc(ephemeralRegistrationTokens.id))\n .limit(params.limit ?? 1000);\n\n const deleted = await db()\n .delete(ephemeralRegistrationTokens)\n .where(inArray(ephemeralRegistrationTokens.id, deletableIds))\n .returning({id: ephemeralRegistrationTokens.id});\n\n return deleted.length;\n}\n\nexport async function createRunnerSessionConsumingEphemeralToken(params: {\n ephemeralTokenId: string;\n workspaceId: string;\n labels: string[];\n toolCapabilities?: RunnerToolCapabilitiesDto | null;\n maxClaims: number;\n}) {\n return await db().transaction(async (tx) => {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);\n\n const consumed = await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedAt: sql`now()`})\n .where(\n and(\n eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId),\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .returning({\n id: ephemeralRegistrationTokens.id,\n provisionerId: ephemeralRegistrationTokens.provisionerId,\n providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,\n });\n\n if (!consumed[0]) {\n const [token] = await tx\n .select({\n workspaceId: ephemeralRegistrationTokens.workspaceId,\n consumedAt: ephemeralRegistrationTokens.consumedAt,\n isExpired: sql<boolean>`${ephemeralRegistrationTokens.expiresAt} <= now()`,\n })\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId))\n .limit(1);\n\n if (!token) {\n throw new Error(`Ephemeral registration token not found: ${params.ephemeralTokenId}`);\n }\n if (token.workspaceId !== params.workspaceId) {\n throw new RegistrationTokenWorkspaceMismatchError(\n params.ephemeralTokenId,\n params.workspaceId,\n );\n }\n if (token.consumedAt) throw new RegistrationTokenConsumedError(params.ephemeralTokenId);\n if (token.isExpired) throw new RegistrationTokenExpiredError(params.ephemeralTokenId);\n throw new Error(\n `Ephemeral registration token could not be consumed: ${params.ephemeralTokenId}`,\n );\n }\n\n const [session] = await tx\n .insert(runnerSessions)\n .values({\n workspaceId: params.workspaceId,\n scope: 'workspace',\n registrationTokenId: params.ephemeralTokenId,\n registrationTokenKind: 'ephemeral',\n provisionerId: consumed[0].provisionerId,\n providerRunnerId: consumed[0].providerRunnerId,\n labels: params.labels,\n toolCapabilities: params.toolCapabilities ?? null,\n toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,\n maxClaims: params.maxClaims,\n claimsUsed: 0,\n })\n .returning();\n\n if (!session) throw new Error('Insert returned no rows');\n\n await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedSessionId: session.id})\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId));\n\n await tx\n .update(providerRunners)\n .set({runnerSessionId: session.id, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, consumed[0].provisionerId),\n eq(providerRunners.providerRunnerId, consumed[0].providerRunnerId),\n isNull(providerRunners.reservationReleasedAt),\n ),\n );\n\n return toRunnerSession(session);\n });\n}\n"],"names":["and","asc","eq","gt","inArray","isNull","lt","sql","ActiveEphemeralRegistrationTokenExistsError","ActiveEphemeralRegistrationTokensExistError","RegistrationTokenBatchExceedsReservationError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","RegistrationTokenWorkspaceMismatchError","ReservationExpiredError","ReservationNotFoundError","db","ephemeralRegistrationTokens","toEphemeralRegistrationToken","reservations","providerRunners","runnerSessions","toRunnerSession","createEphemeralRegistrationToken","params","rows","transaction","tx","providerRunnerLockKey","workspaceId","provisionerId","providerRunnerId","join","execute","active","select","id","from","where","consumedAt","expiresAt","limit","insert","values","reservationId","hashedToken","prefix","returning","row","Error","createEphemeralRegistrationTokensBatch","provisionerLockKey","Set","map","sort","reservation","count","isExpired","length","existingForReservation","alreadyMinted","providerRunnerIds","activeRows","resolveEphemeralRegistrationTokenByHash","undefined","deleteExpiredEphemeralRegistrationTokens","terminalAt","retentionCutoff","retentionDays","deletableIds","orderBy","deleted","delete","createRunnerSessionConsumingEphemeralToken","consumed","update","set","ephemeralTokenId","token","session","scope","registrationTokenId","registrationTokenKind","labels","toolCapabilities","toolCapabilitiesReportedAt","maxClaims","claimsUsed","consumedSessionId","runnerSessionId","updatedAt","reservationReleasedAt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/db/ephemeral-registration-tokens.ts"],"sourcesContent":["import type {RunnerToolCapabilitiesDto} from '@shipfox/api-runners-dto';\nimport {and, asc, eq, gt, inArray, isNull, lt, sql} from 'drizzle-orm';\nimport type {EphemeralRegistrationToken} from '#core/entities/ephemeral-registration-token.js';\nimport {\n ActiveEphemeralRegistrationTokenExistsError,\n ActiveEphemeralRegistrationTokensExistError,\n EmptyRunnerLabelsError,\n RegistrationTokenBatchExceedsReservationError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n RegistrationTokenWorkspaceMismatchError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\nimport {sanitizeRunnerLabelsOrThrow} from '#core/runner-labels.js';\nimport {db} from './db.js';\nimport {\n ephemeralRegistrationTokens,\n toEphemeralRegistrationToken,\n} from './schema/ephemeral-registration-tokens.js';\nimport {provisionerTokens} from './schema/provisioner-tokens.js';\nimport {reservations} from './schema/reservations.js';\nimport {providerRunners} from './schema/runner-instances.js';\nimport {runnerSessions, toRunnerSession} from './schema/runner-sessions.js';\n\nexport interface CreateEphemeralRegistrationTokenParams {\n workspaceId: string;\n provisionerId: string;\n reservationId?: string | null | undefined;\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n expiresAt: Date;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchRow {\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchParams {\n workspaceId: string;\n provisionerId: string;\n reservationId: string;\n expiresAt: Date;\n rows: CreateEphemeralRegistrationTokensBatchRow[];\n}\n\nexport async function createEphemeralRegistrationToken(\n params: CreateEphemeralRegistrationTokenParams,\n): Promise<EphemeralRegistrationToken> {\n const rows = await db().transaction(async (tx) => {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n\n const [active] = await tx\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.providerRunnerId, params.providerRunnerId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .limit(1);\n\n if (active) {\n throw new ActiveEphemeralRegistrationTokenExistsError(\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId ?? null,\n providerRunnerId: params.providerRunnerId,\n hashedToken: params.hashedToken,\n prefix: params.prefix,\n expiresAt: params.expiresAt,\n })\n .returning();\n });\n\n const row = rows[0];\n if (!row) throw new Error('Insert returned no rows');\n return toEphemeralRegistrationToken(row);\n}\n\nexport async function createEphemeralRegistrationTokensBatch(\n params: CreateEphemeralRegistrationTokensBatchParams,\n): Promise<EphemeralRegistrationToken[]> {\n const rows = await db().transaction(async (tx) => {\n const provisionerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionerLockKey}))`);\n for (const providerRunnerId of [\n ...new Set(params.rows.map((row) => row.providerRunnerId)),\n ].sort()) {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n }\n\n const [reservation] = await tx\n .select({\n count: reservations.count,\n isExpired: sql<boolean>`${reservations.expiresAt} <= now()`,\n })\n .from(reservations)\n .where(\n and(\n eq(reservations.id, params.reservationId),\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n ),\n )\n .limit(1);\n\n if (!reservation) throw new ReservationNotFoundError(params.reservationId);\n if (reservation.isExpired) throw new ReservationExpiredError(params.reservationId);\n if (params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n );\n }\n\n const [existingForReservation] = await tx\n .select({count: sql<number>`count(*)::int`})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.reservationId, params.reservationId),\n ),\n );\n const alreadyMinted = existingForReservation?.count ?? 0;\n if (alreadyMinted + params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n alreadyMinted,\n );\n }\n\n const providerRunnerIds = params.rows.map((row) => row.providerRunnerId);\n const activeRows = await tx\n .select({providerRunnerId: ephemeralRegistrationTokens.providerRunnerId})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n );\n\n if (activeRows.length > 0) {\n throw new ActiveEphemeralRegistrationTokensExistError(\n activeRows.map((row) => row.providerRunnerId),\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values(\n params.rows.map((row) => ({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId,\n providerRunnerId: row.providerRunnerId,\n hashedToken: row.hashedToken,\n prefix: row.prefix,\n expiresAt: params.expiresAt,\n })),\n )\n .returning();\n });\n\n return rows.map(toEphemeralRegistrationToken);\n}\n\nexport async function resolveEphemeralRegistrationTokenByHash(\n hashedToken: string,\n): Promise<EphemeralRegistrationToken | undefined> {\n const rows = await db()\n .select()\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.hashedToken, hashedToken))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toEphemeralRegistrationToken(row);\n}\n\nexport interface DeleteExpiredEphemeralRegistrationTokensParams {\n retentionDays: number;\n limit?: number;\n}\n\n/**\n * Deletes ephemeral registration tokens that have reached a terminal state and\n * outlived the retention window. A token is terminal once it is consumed\n * (single use spent) or expired without consumption; the retention window is\n * measured from that terminal event so the audit record survives a bounded\n * debugging window. Active tokens that are neither consumed nor expired are\n * never deleted, so a live single-use credential is never removed early.\n */\nexport async function deleteExpiredEphemeralRegistrationTokens(\n params: DeleteExpiredEphemeralRegistrationTokensParams,\n): Promise<number> {\n // coalesce(consumed_at, expires_at) is the terminal timestamp: consumed_at\n // when the token was spent, otherwise its expiry. Comparing it to the cutoff\n // both selects deletable rows and orders the batch, and it matches the\n // terminal index so idle GC ticks never scan live rows.\n const terminalAt = sql`coalesce(${ephemeralRegistrationTokens.consumedAt}, ${ephemeralRegistrationTokens.expiresAt})`;\n const retentionCutoff = sql`now() - (${params.retentionDays} || ' days')::interval`;\n\n const deletableIds = db()\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(lt(terminalAt, retentionCutoff))\n .orderBy(asc(terminalAt), asc(ephemeralRegistrationTokens.id))\n .limit(params.limit ?? 1000);\n\n const deleted = await db()\n .delete(ephemeralRegistrationTokens)\n .where(inArray(ephemeralRegistrationTokens.id, deletableIds))\n .returning({id: ephemeralRegistrationTokens.id});\n\n return deleted.length;\n}\n\nexport async function createRunnerSessionConsumingEphemeralToken(params: {\n ephemeralTokenId: string;\n workspaceId: string;\n labels: string[];\n toolCapabilities?: RunnerToolCapabilitiesDto | null;\n maxClaims: number;\n}) {\n return await db().transaction(async (tx) => {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);\n\n const consumed = await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedAt: sql`now()`})\n .where(\n and(\n eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId),\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .returning({\n id: ephemeralRegistrationTokens.id,\n provisionerId: ephemeralRegistrationTokens.provisionerId,\n providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,\n });\n\n if (!consumed[0]) {\n const [token] = await tx\n .select({\n workspaceId: ephemeralRegistrationTokens.workspaceId,\n consumedAt: ephemeralRegistrationTokens.consumedAt,\n isExpired: sql<boolean>`${ephemeralRegistrationTokens.expiresAt} <= now()`,\n })\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId))\n .limit(1);\n\n if (!token) {\n throw new Error(`Ephemeral registration token not found: ${params.ephemeralTokenId}`);\n }\n if (token.workspaceId !== params.workspaceId) {\n throw new RegistrationTokenWorkspaceMismatchError(\n params.ephemeralTokenId,\n params.workspaceId,\n );\n }\n if (token.consumedAt) throw new RegistrationTokenConsumedError(params.ephemeralTokenId);\n if (token.isExpired) throw new RegistrationTokenExpiredError(params.ephemeralTokenId);\n throw new Error(\n `Ephemeral registration token could not be consumed: ${params.ephemeralTokenId}`,\n );\n }\n\n const [provisioner] = await tx\n .select({scope: provisionerTokens.scope})\n .from(provisionerTokens)\n .where(eq(provisionerTokens.id, consumed[0].provisionerId))\n .limit(1);\n const labels = sanitizeRunnerLabelsOrThrow(params.labels, {\n scope: provisioner?.scope ?? 'workspace',\n source: 'ephemeral runner registration',\n });\n if (labels.length === 0) throw new EmptyRunnerLabelsError();\n\n const [session] = await tx\n .insert(runnerSessions)\n .values({\n workspaceId: params.workspaceId,\n scope: 'workspace',\n registrationTokenId: params.ephemeralTokenId,\n registrationTokenKind: 'ephemeral',\n provisionerId: consumed[0].provisionerId,\n providerRunnerId: consumed[0].providerRunnerId,\n labels,\n toolCapabilities: params.toolCapabilities ?? null,\n toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,\n maxClaims: params.maxClaims,\n claimsUsed: 0,\n })\n .returning();\n\n if (!session) throw new Error('Insert returned no rows');\n\n await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedSessionId: session.id})\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId));\n\n await tx\n .update(providerRunners)\n .set({runnerSessionId: session.id, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, consumed[0].provisionerId),\n eq(providerRunners.providerRunnerId, consumed[0].providerRunnerId),\n isNull(providerRunners.reservationReleasedAt),\n ),\n );\n\n return toRunnerSession(session);\n });\n}\n"],"names":["and","asc","eq","gt","inArray","isNull","lt","sql","ActiveEphemeralRegistrationTokenExistsError","ActiveEphemeralRegistrationTokensExistError","EmptyRunnerLabelsError","RegistrationTokenBatchExceedsReservationError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","RegistrationTokenWorkspaceMismatchError","ReservationExpiredError","ReservationNotFoundError","sanitizeRunnerLabelsOrThrow","db","ephemeralRegistrationTokens","toEphemeralRegistrationToken","provisionerTokens","reservations","providerRunners","runnerSessions","toRunnerSession","createEphemeralRegistrationToken","params","rows","transaction","tx","providerRunnerLockKey","workspaceId","provisionerId","providerRunnerId","join","execute","active","select","id","from","where","consumedAt","expiresAt","limit","insert","values","reservationId","hashedToken","prefix","returning","row","Error","createEphemeralRegistrationTokensBatch","provisionerLockKey","Set","map","sort","reservation","count","isExpired","length","existingForReservation","alreadyMinted","providerRunnerIds","activeRows","resolveEphemeralRegistrationTokenByHash","undefined","deleteExpiredEphemeralRegistrationTokens","terminalAt","retentionCutoff","retentionDays","deletableIds","orderBy","deleted","delete","createRunnerSessionConsumingEphemeralToken","consumed","update","set","ephemeralTokenId","token","provisioner","scope","labels","source","session","registrationTokenId","registrationTokenKind","toolCapabilities","toolCapabilitiesReportedAt","maxClaims","claimsUsed","consumedSessionId","runnerSessionId","updatedAt","reservationReleasedAt"],"mappings":"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"}
|
package/dist/db/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export type { DemandStat, PollDemandAndReserveParams, ReservationGrant, Reservat
|
|
|
15
15
|
export { deleteExpiredReservations, deleteReservationsByIds, pollDemandAndReserve, releaseReservationUnits, } from './reservations.js';
|
|
16
16
|
export { assignRunnerInstances } from './runner-assignments.js';
|
|
17
17
|
export type { ActiveRunnerInstanceTemplateCount, ReapStaleRunnerInstancesResult, ReconcileRunnerInstancesDbResult, ReconcileRunnerInstancesParams, ReportRunnerInstancesParams, RunnerInstanceReportEvent, RunnerInstanceTerminateIntent, RunnerInstanceTerminateIntentReason, } from './runner-instances.js';
|
|
18
|
-
export { attachRunnerInstanceProviderId, isTerminalState, listActiveRunnerInstanceCountsByTemplateTx, listActiveRunnerInstances, listProvisionerTerminateIntentRowsTx, listProvisionerTerminateIntents, reapStaleRunnerInstances, reconcileRunnerInstances, reportRunnerInstances, } from './runner-instances.js';
|
|
18
|
+
export { attachRunnerInstanceProviderId, countStaleEnrolledRunnerInstances, isTerminalState, listActiveRunnerInstanceCountsByTemplateTx, listActiveRunnerInstances, listProvisionerTerminateIntentRowsTx, listProvisionerTerminateIntents, reapStaleRunnerInstances, reconcileRunnerInstances, reportRunnerInstances, } from './runner-instances.js';
|
|
19
19
|
export type { CreateRunnerSessionParams, DeleteExpiredRunnerSessionsParams, } from './runner-sessions.js';
|
|
20
20
|
export { createRunnerSession, deleteExpiredRunnerSessions } from './runner-sessions.js';
|
|
21
21
|
export { runnersOutbox } from './schema/outbox.js';
|
package/dist/db/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,mCAAmC,EACnC,8BAA8B,EAC9B,sCAAsC,EACtC,sCAAsC,GACvC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,gCAAgC,EAAC,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,sCAAsC,EACtC,8CAA8C,GAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gCAAgC,EAChC,0CAA0C,EAC1C,wCAAwC,EACxC,uCAAuC,GACxC,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,8BAA8B,EAC9B,0CAA0C,EAC1C,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAC,mCAAmC,EAAC,MAAM,iCAAiC,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,+CAA+C,EAC/C,oCAAoC,EACpC,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,uCAAuC,EACvC,iDAAiD,EACjD,gDAAgD,EAChD,6CAA6C,GAC9C,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EAAC,4BAA4B,EAAC,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EACL,2CAA2C,EAC3C,sBAAsB,EACtB,2BAA2B,EAC3B,iCAAiC,EACjC,wCAAwC,EACxC,6BAA6B,EAC7B,2CAA2C,EAC3C,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EACV,iCAAiC,EACjC,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,0CAA0C,EAC1C,yBAAyB,EACzB,oCAAoC,EACpC,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,mBAAmB,EAAE,2BAA2B,EAAC,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,qBAAqB,EAAE,qBAAqB,EAAC,MAAM,qCAAqC,CAAC;AAEjG,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,mCAAmC,EACnC,8BAA8B,EAC9B,sCAAsC,EACtC,sCAAsC,GACvC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,gCAAgC,EAAC,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,sCAAsC,EACtC,8CAA8C,GAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gCAAgC,EAChC,0CAA0C,EAC1C,wCAAwC,EACxC,uCAAuC,GACxC,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,8BAA8B,EAC9B,0CAA0C,EAC1C,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAC,mCAAmC,EAAC,MAAM,iCAAiC,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,+CAA+C,EAC/C,oCAAoC,EACpC,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,uCAAuC,EACvC,iDAAiD,EACjD,gDAAgD,EAChD,6CAA6C,GAC9C,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EAAC,4BAA4B,EAAC,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EACL,2CAA2C,EAC3C,sBAAsB,EACtB,2BAA2B,EAC3B,iCAAiC,EACjC,wCAAwC,EACxC,6BAA6B,EAC7B,2CAA2C,EAC3C,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EACV,iCAAiC,EACjC,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,EACjC,eAAe,EACf,0CAA0C,EAC1C,yBAAyB,EACzB,oCAAoC,EACpC,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,mBAAmB,EAAE,2BAA2B,EAAC,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,qBAAqB,EAAE,qBAAqB,EAAC,MAAM,qCAAqC,CAAC;AAEjG,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|