duron 0.3.0-beta.9 → 0.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/dist/action-job.d.ts +33 -2
- package/dist/action-job.d.ts.map +1 -1
- package/dist/action-job.js +88 -23
- package/dist/action-manager.d.ts +44 -2
- package/dist/action-manager.d.ts.map +1 -1
- package/dist/action-manager.js +64 -3
- package/dist/action.d.ts +388 -7
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +44 -23
- package/dist/adapters/adapter.d.ts +365 -8
- package/dist/adapters/adapter.d.ts.map +1 -1
- package/dist/adapters/adapter.js +221 -15
- package/dist/adapters/postgres/base.d.ts +184 -6
- package/dist/adapters/postgres/base.d.ts.map +1 -1
- package/dist/adapters/postgres/base.js +436 -75
- package/dist/adapters/postgres/pglite.d.ts +37 -0
- package/dist/adapters/postgres/pglite.d.ts.map +1 -1
- package/dist/adapters/postgres/pglite.js +38 -0
- package/dist/adapters/postgres/postgres.d.ts +35 -0
- package/dist/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/adapters/postgres/postgres.js +42 -0
- package/dist/adapters/postgres/schema.d.ts +150 -37
- package/dist/adapters/postgres/schema.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.default.d.ts +151 -38
- package/dist/adapters/postgres/schema.default.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.default.js +2 -2
- package/dist/adapters/postgres/schema.js +60 -23
- package/dist/adapters/schemas.d.ts +124 -80
- package/dist/adapters/schemas.d.ts.map +1 -1
- package/dist/adapters/schemas.js +139 -26
- package/dist/client.d.ts +426 -22
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +370 -20
- package/dist/constants.js +6 -0
- package/dist/errors.d.ts +140 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +152 -9
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/server.d.ts +99 -37
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +84 -25
- package/dist/step-manager.d.ts +111 -4
- package/dist/step-manager.d.ts.map +1 -1
- package/dist/step-manager.js +403 -75
- package/dist/telemetry/index.d.ts +1 -4
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -4
- package/dist/telemetry/local-span-exporter.d.ts +56 -0
- package/dist/telemetry/local-span-exporter.d.ts.map +1 -0
- package/dist/telemetry/local-span-exporter.js +118 -0
- package/dist/utils/p-retry.d.ts +5 -0
- package/dist/utils/p-retry.d.ts.map +1 -1
- package/dist/utils/p-retry.js +8 -0
- package/dist/utils/wait-for-abort.d.ts +1 -0
- package/dist/utils/wait-for-abort.d.ts.map +1 -1
- package/dist/utils/wait-for-abort.js +1 -0
- package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/migration.sql +32 -20
- package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/snapshot.json +241 -66
- package/package.json +42 -26
- package/src/action-job.ts +33 -29
- package/src/action-manager.ts +5 -5
- package/src/action.ts +317 -149
- package/src/adapters/adapter.ts +54 -54
- package/src/adapters/postgres/base.ts +266 -86
- package/src/adapters/postgres/schema.default.ts +2 -2
- package/src/adapters/postgres/schema.ts +52 -24
- package/src/adapters/schemas.ts +91 -36
- package/src/client.ts +322 -68
- package/src/errors.ts +84 -12
- package/src/index.ts +2 -0
- package/src/server.ts +39 -37
- package/src/step-manager.ts +246 -95
- package/src/telemetry/index.ts +2 -20
- package/src/telemetry/local-span-exporter.ts +148 -0
- package/dist/telemetry/adapter.d.ts +0 -107
- package/dist/telemetry/adapter.d.ts.map +0 -1
- package/dist/telemetry/adapter.js +0 -134
- package/dist/telemetry/local.d.ts +0 -22
- package/dist/telemetry/local.d.ts.map +0 -1
- package/dist/telemetry/local.js +0 -243
- package/dist/telemetry/noop.d.ts +0 -17
- package/dist/telemetry/noop.d.ts.map +0 -1
- package/dist/telemetry/noop.js +0 -66
- package/dist/telemetry/opentelemetry.d.ts +0 -25
- package/dist/telemetry/opentelemetry.d.ts.map +0 -1
- package/dist/telemetry/opentelemetry.js +0 -312
- package/src/telemetry/adapter.ts +0 -642
- package/src/telemetry/local.ts +0 -429
- package/src/telemetry/noop.ts +0 -141
- package/src/telemetry/opentelemetry.ts +0 -453
package/dist/server.d.ts
CHANGED
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
import { Elysia } from 'elysia';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { JobSortFieldSchema,
|
|
3
|
+
import { JobSortFieldSchema, SortOrderSchema, SpanSortFieldSchema } from './adapters/schemas.js';
|
|
4
4
|
import type { Client } from './client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Error thrown when a requested resource is not found.
|
|
7
|
+
*/
|
|
5
8
|
export declare class NotFoundError extends Error {
|
|
9
|
+
/**
|
|
10
|
+
* Create a new NotFoundError.
|
|
11
|
+
*
|
|
12
|
+
* @param message - Error message describing what was not found
|
|
13
|
+
*/
|
|
6
14
|
constructor(message: string);
|
|
7
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when authentication fails.
|
|
18
|
+
*/
|
|
8
19
|
export declare class UnauthorizedError extends Error {
|
|
20
|
+
/**
|
|
21
|
+
* Create a new UnauthorizedError.
|
|
22
|
+
*
|
|
23
|
+
* @param message - Error message describing the authentication failure
|
|
24
|
+
*/
|
|
9
25
|
constructor(message: string);
|
|
10
26
|
}
|
|
11
27
|
export declare const GetJobStepsQuerySchema: z.ZodPipe<z.ZodObject<{
|
|
@@ -73,6 +89,7 @@ export declare const GetJobsQuerySchema: z.ZodPipe<z.ZodObject<{
|
|
|
73
89
|
fActionName: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
74
90
|
fGroupKey: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
75
91
|
fClientId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
92
|
+
fDescription: z.ZodOptional<z.ZodString>;
|
|
76
93
|
fCreatedAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodCoercedDate<unknown>, z.ZodArray<z.ZodCoercedDate<unknown>>]>>;
|
|
77
94
|
fStartedAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodCoercedDate<unknown>, z.ZodArray<z.ZodCoercedDate<unknown>>]>>;
|
|
78
95
|
fFinishedAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodCoercedDate<unknown>, z.ZodArray<z.ZodCoercedDate<unknown>>]>>;
|
|
@@ -96,6 +113,7 @@ export declare const GetJobsQuerySchema: z.ZodPipe<z.ZodObject<{
|
|
|
96
113
|
fActionName?: string | string[] | undefined;
|
|
97
114
|
fGroupKey?: string | string[] | undefined;
|
|
98
115
|
fClientId?: string | string[] | undefined;
|
|
116
|
+
fDescription?: string | undefined;
|
|
99
117
|
fCreatedAt?: Date | Date[] | undefined;
|
|
100
118
|
fStartedAt?: Date | Date[] | undefined;
|
|
101
119
|
fFinishedAt?: Date | Date[] | undefined;
|
|
@@ -110,6 +128,7 @@ export declare const GetJobsResponseSchema: z.ZodObject<{
|
|
|
110
128
|
id: z.ZodString;
|
|
111
129
|
actionName: z.ZodString;
|
|
112
130
|
groupKey: z.ZodString;
|
|
131
|
+
description: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
113
132
|
input: z.ZodAny;
|
|
114
133
|
output: z.ZodNullable<z.ZodAny>;
|
|
115
134
|
error: z.ZodNullable<z.ZodAny>;
|
|
@@ -127,7 +146,9 @@ export declare const GetJobsResponseSchema: z.ZodObject<{
|
|
|
127
146
|
createdAt: z.ZodUnion<readonly [z.ZodDate, z.ZodPipe<z.ZodString, z.ZodTransform<Date, string>>, z.ZodPipe<z.ZodNumber, z.ZodTransform<Date, number>>]>;
|
|
128
147
|
updatedAt: z.ZodUnion<readonly [z.ZodDate, z.ZodPipe<z.ZodString, z.ZodTransform<Date, string>>, z.ZodPipe<z.ZodNumber, z.ZodTransform<Date, number>>]>;
|
|
129
148
|
concurrencyLimit: z.ZodCoercedNumber<unknown>;
|
|
149
|
+
concurrencyStepLimit: z.ZodCoercedNumber<unknown>;
|
|
130
150
|
clientId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
151
|
+
durationMs: z.ZodDefault<z.ZodNullable<z.ZodCoercedNumber<unknown>>>;
|
|
131
152
|
}, z.core.$strip>>;
|
|
132
153
|
total: z.ZodNumber;
|
|
133
154
|
page: z.ZodNumber;
|
|
@@ -149,34 +170,26 @@ export declare const GetActionsMetadataResponseSchema: z.ZodArray<z.ZodObject<{
|
|
|
149
170
|
}, z.core.$strip>>;
|
|
150
171
|
export type GetJobsQueryInput = z.input<typeof GetJobsQuerySchema>;
|
|
151
172
|
export type GetJobStepsQueryInput = z.input<typeof GetJobStepsQuerySchema>;
|
|
152
|
-
export declare const
|
|
173
|
+
export declare const GetSpansQuerySchema: z.ZodPipe<z.ZodObject<{
|
|
153
174
|
fName: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
span_event: "span_event";
|
|
157
|
-
span_attribute: "span_attribute";
|
|
158
|
-
}>, z.ZodArray<z.ZodEnum<{
|
|
159
|
-
metric: "metric";
|
|
160
|
-
span_event: "span_event";
|
|
161
|
-
span_attribute: "span_attribute";
|
|
162
|
-
}>>]>>;
|
|
163
|
-
fTimestampRange: z.ZodOptional<z.ZodArray<z.ZodCoercedDate<unknown>>>;
|
|
175
|
+
fKind: z.ZodOptional<z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>, z.ZodArray<z.ZodUnion<readonly [z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>>]>>;
|
|
176
|
+
fTraceId: z.ZodOptional<z.ZodString>;
|
|
164
177
|
fAttributesFilter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
165
178
|
sort: z.ZodOptional<z.ZodString>;
|
|
166
179
|
}, z.core.$strip>, z.ZodTransform<{
|
|
167
180
|
filters: any;
|
|
168
181
|
sort: {
|
|
169
|
-
field: z.infer<typeof
|
|
182
|
+
field: z.infer<typeof SpanSortFieldSchema>;
|
|
170
183
|
order: z.infer<typeof SortOrderSchema>;
|
|
171
184
|
} | undefined;
|
|
172
185
|
}, {
|
|
173
186
|
fName?: string | string[] | undefined;
|
|
174
|
-
|
|
175
|
-
|
|
187
|
+
fKind?: 0 | 4 | 1 | 3 | 2 | (0 | 4 | 1 | 3 | 2)[] | undefined;
|
|
188
|
+
fTraceId?: string | undefined;
|
|
176
189
|
fAttributesFilter?: Record<string, any> | undefined;
|
|
177
190
|
sort?: string | undefined;
|
|
178
191
|
}>>;
|
|
179
|
-
export type
|
|
192
|
+
export type GetSpansQueryInput = z.input<typeof GetSpansQuerySchema>;
|
|
180
193
|
export declare const ErrorResponseSchema: z.ZodObject<{
|
|
181
194
|
error: z.ZodString;
|
|
182
195
|
message: z.ZodOptional<z.ZodString>;
|
|
@@ -198,20 +211,45 @@ export declare const TimeTravelJobResponseSchema: z.ZodObject<{
|
|
|
198
211
|
message: z.ZodString;
|
|
199
212
|
}, z.core.$strip>;
|
|
200
213
|
export interface CreateServerOptions<P extends string> {
|
|
214
|
+
/**
|
|
215
|
+
* The Duron instance to use for the API endpoints
|
|
216
|
+
*/
|
|
201
217
|
client: Client<any, any>;
|
|
218
|
+
/**
|
|
219
|
+
* Optional prefix for all routes (default: '/api')
|
|
220
|
+
*/
|
|
202
221
|
prefix?: P;
|
|
203
|
-
|
|
222
|
+
/**
|
|
223
|
+
* Enable spans endpoints (/jobs/:id/spans, /steps/:id/spans).
|
|
224
|
+
* Only works when client is configured with telemetry.local enabled.
|
|
225
|
+
* When true, enables the dashboard to show spans buttons.
|
|
226
|
+
* @default auto-detected from client.spansEnabled
|
|
227
|
+
*/
|
|
228
|
+
spansEnabled?: boolean;
|
|
204
229
|
login?: {
|
|
205
230
|
onLogin: (body: {
|
|
206
231
|
email: string;
|
|
207
232
|
password: string;
|
|
208
233
|
}) => Promise<boolean>;
|
|
209
234
|
jwtSecret: string | Uint8Array;
|
|
235
|
+
/**
|
|
236
|
+
* Optional expiration time for the access JWT token (default: '1h')
|
|
237
|
+
*/
|
|
210
238
|
expirationTime?: string;
|
|
239
|
+
/**
|
|
240
|
+
* Optional expiration time for the refresh token (default: '7d')
|
|
241
|
+
*/
|
|
211
242
|
refreshTokenExpirationTime?: string;
|
|
212
243
|
};
|
|
213
244
|
}
|
|
214
|
-
|
|
245
|
+
/**
|
|
246
|
+
* Creates an Elysia server instance with duron API endpoints.
|
|
247
|
+
* All endpoints use Zod for input and response validation.
|
|
248
|
+
*
|
|
249
|
+
* @param options - Configuration options
|
|
250
|
+
* @returns Elysia server instance
|
|
251
|
+
*/
|
|
252
|
+
export declare function createServer<P extends string>({ client, prefix, login, spansEnabled }: CreateServerOptions<P>): Elysia<P, {
|
|
215
253
|
decorator: {};
|
|
216
254
|
store: {};
|
|
217
255
|
derive: {};
|
|
@@ -550,6 +588,7 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
550
588
|
id: string;
|
|
551
589
|
actionName: string;
|
|
552
590
|
groupKey: string;
|
|
591
|
+
description: string | null;
|
|
553
592
|
input: any;
|
|
554
593
|
output: any;
|
|
555
594
|
error: any;
|
|
@@ -561,6 +600,8 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
561
600
|
createdAt: Date;
|
|
562
601
|
updatedAt: Date;
|
|
563
602
|
concurrencyLimit: number;
|
|
603
|
+
concurrencyStepLimit: number;
|
|
604
|
+
durationMs: number | null;
|
|
564
605
|
clientId?: string | null | undefined;
|
|
565
606
|
};
|
|
566
607
|
401: {
|
|
@@ -676,6 +717,7 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
676
717
|
id: string;
|
|
677
718
|
actionName: string;
|
|
678
719
|
groupKey: string;
|
|
720
|
+
description: string | null;
|
|
679
721
|
input: any;
|
|
680
722
|
output: any;
|
|
681
723
|
error: any;
|
|
@@ -687,6 +729,8 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
687
729
|
createdAt: Date;
|
|
688
730
|
updatedAt: Date;
|
|
689
731
|
concurrencyLimit: number;
|
|
732
|
+
concurrencyStepLimit: number;
|
|
733
|
+
durationMs: number | null;
|
|
690
734
|
clientId?: string | null | undefined;
|
|
691
735
|
}[];
|
|
692
736
|
total: number;
|
|
@@ -1141,7 +1185,7 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
1141
1185
|
headers: unknown;
|
|
1142
1186
|
response: {
|
|
1143
1187
|
200: {
|
|
1144
|
-
|
|
1188
|
+
spansEnabled: boolean;
|
|
1145
1189
|
authEnabled: boolean;
|
|
1146
1190
|
};
|
|
1147
1191
|
422: {
|
|
@@ -1159,7 +1203,7 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
1159
1203
|
};
|
|
1160
1204
|
};
|
|
1161
1205
|
};
|
|
1162
|
-
}> & import("elysia").CreateEden<`${P}/jobs/:id/
|
|
1206
|
+
}> & import("elysia").CreateEden<`${P}/jobs/:id/spans`, {
|
|
1163
1207
|
get: {
|
|
1164
1208
|
body: {};
|
|
1165
1209
|
params: {
|
|
@@ -1168,7 +1212,7 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
1168
1212
|
query: {
|
|
1169
1213
|
filters: any;
|
|
1170
1214
|
sort: {
|
|
1171
|
-
field: z.infer<typeof
|
|
1215
|
+
field: z.infer<typeof SpanSortFieldSchema>;
|
|
1172
1216
|
order: z.infer<typeof SortOrderSchema>;
|
|
1173
1217
|
} | undefined;
|
|
1174
1218
|
};
|
|
@@ -1177,16 +1221,25 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
1177
1221
|
};
|
|
1178
1222
|
response: {
|
|
1179
1223
|
200: {
|
|
1180
|
-
|
|
1181
|
-
id:
|
|
1182
|
-
|
|
1224
|
+
spans: {
|
|
1225
|
+
id: number;
|
|
1226
|
+
traceId: string;
|
|
1227
|
+
spanId: string;
|
|
1228
|
+
parentSpanId: string | null;
|
|
1229
|
+
jobId: string | null;
|
|
1183
1230
|
stepId: string | null;
|
|
1184
1231
|
name: string;
|
|
1185
|
-
|
|
1232
|
+
kind: 0 | 4 | 1 | 3 | 2;
|
|
1233
|
+
startTimeUnixNano: string | null;
|
|
1234
|
+
endTimeUnixNano: string | null;
|
|
1235
|
+
statusCode: 0 | 1 | 2;
|
|
1236
|
+
statusMessage: string | null;
|
|
1186
1237
|
attributes: Record<string, any>;
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1238
|
+
events: {
|
|
1239
|
+
name: string;
|
|
1240
|
+
timeUnixNano: string;
|
|
1241
|
+
attributes?: Record<string, any> | undefined;
|
|
1242
|
+
}[];
|
|
1190
1243
|
}[];
|
|
1191
1244
|
total: number;
|
|
1192
1245
|
};
|
|
@@ -1213,7 +1266,7 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
1213
1266
|
};
|
|
1214
1267
|
};
|
|
1215
1268
|
};
|
|
1216
|
-
}> & import("elysia").CreateEden<`${P}/steps/:id/
|
|
1269
|
+
}> & import("elysia").CreateEden<`${P}/steps/:id/spans`, {
|
|
1217
1270
|
get: {
|
|
1218
1271
|
body: {};
|
|
1219
1272
|
params: {
|
|
@@ -1222,7 +1275,7 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
1222
1275
|
query: {
|
|
1223
1276
|
filters: any;
|
|
1224
1277
|
sort: {
|
|
1225
|
-
field: z.infer<typeof
|
|
1278
|
+
field: z.infer<typeof SpanSortFieldSchema>;
|
|
1226
1279
|
order: z.infer<typeof SortOrderSchema>;
|
|
1227
1280
|
} | undefined;
|
|
1228
1281
|
};
|
|
@@ -1231,16 +1284,25 @@ export declare function createServer<P extends string>({ client, prefix, login,
|
|
|
1231
1284
|
};
|
|
1232
1285
|
response: {
|
|
1233
1286
|
200: {
|
|
1234
|
-
|
|
1235
|
-
id:
|
|
1236
|
-
|
|
1287
|
+
spans: {
|
|
1288
|
+
id: number;
|
|
1289
|
+
traceId: string;
|
|
1290
|
+
spanId: string;
|
|
1291
|
+
parentSpanId: string | null;
|
|
1292
|
+
jobId: string | null;
|
|
1237
1293
|
stepId: string | null;
|
|
1238
1294
|
name: string;
|
|
1239
|
-
|
|
1295
|
+
kind: 0 | 4 | 1 | 3 | 2;
|
|
1296
|
+
startTimeUnixNano: string | null;
|
|
1297
|
+
endTimeUnixNano: string | null;
|
|
1298
|
+
statusCode: 0 | 1 | 2;
|
|
1299
|
+
statusMessage: string | null;
|
|
1240
1300
|
attributes: Record<string, any>;
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1301
|
+
events: {
|
|
1302
|
+
name: string;
|
|
1303
|
+
timeUnixNano: string;
|
|
1304
|
+
attributes?: Record<string, any> | undefined;
|
|
1305
|
+
}[];
|
|
1244
1306
|
}[];
|
|
1245
1307
|
total: number;
|
|
1246
1308
|
};
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAML,kBAAkB,EAKlB,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAML,kBAAkB,EAKlB,eAAe,EAEf,mBAAmB,EACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMzC;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC;;;;OAIG;gBACS,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C;;;;OAIG;gBACS,OAAO,EAAE,MAAM;CAI5B;AAUD,eAAO,MAAM,sBAAsB;;;;;;;;;GAQ9B,CAAA;AAGL,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA0B,CAAA;AAEhE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA2CF,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;eAAS,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;;;;;;;;;;;;;;;;GAyCnG,CAAA;AAGJ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAsB,CAAA;AAGxD,eAAO,MAAM,wBAAwB;;;;;;;;;iBAAyB,CAAA;AAE9D,eAAO,MAAM,gCAAgC;;;kBAK5C,CAAA;AAGD,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAClE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAG1E,eAAO,MAAM,mBAAmB;;;;;;;;;eAoBT,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;eAAS,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;;;;;;GAmB9F,CAAA;AAEJ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAEpE,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAA;AAUF,eAAO,MAAM,uBAAuB;;;iBAGlC,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAA;AAEF,eAAO,MAAM,uBAAuB;;iBAElC,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;iBAGtC,CAAA;AAMF,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM;IACnD;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAExB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,CAAA;IAEV;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QACxE,SAAS,EAAE,MAAM,GAAG,UAAU,CAAA;QAC9B;;WAEG;QACH,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB;;WAEG;QACH,0BAA0B,CAAC,EAAE,MAAM,CAAA;KACpC,CAAA;CACF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BArLb,CAAC;4BAQzD,CAAC;0BAIV,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAZgE,CAAC;4BAQzD,CAAC;0BAIV,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAZJ,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;uBAAS,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAA1E,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;uBAAS,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAiFhF,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;uBAAS,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAA3E,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;uBAAS,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiqBjG"}
|
package/dist/server.js
CHANGED
|
@@ -1,19 +1,44 @@
|
|
|
1
1
|
import { Elysia } from 'elysia';
|
|
2
2
|
import { jwtVerify, SignJWT } from 'jose';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { GetActionsResultSchema, GetJobStepsResultSchema, GetJobsResultSchema,
|
|
4
|
+
import { GetActionsResultSchema, GetJobStepsResultSchema, GetJobsResultSchema, GetSpansResultSchema, JobSchema, JobSortFieldSchema, JobStatusResultSchema, JobStatusSchema, JobStepSchema, JobStepStatusResultSchema, SortOrderSchema, SpanKindSchema, SpanSortFieldSchema, } from './adapters/schemas.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Custom Errors
|
|
7
|
+
// ============================================================================
|
|
8
|
+
/**
|
|
9
|
+
* Error thrown when a requested resource is not found.
|
|
10
|
+
*/
|
|
5
11
|
export class NotFoundError extends Error {
|
|
12
|
+
/**
|
|
13
|
+
* Create a new NotFoundError.
|
|
14
|
+
*
|
|
15
|
+
* @param message - Error message describing what was not found
|
|
16
|
+
*/
|
|
6
17
|
constructor(message) {
|
|
7
18
|
super(message);
|
|
8
19
|
this.name = 'NotFoundError';
|
|
9
20
|
}
|
|
10
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Error thrown when authentication fails.
|
|
24
|
+
*/
|
|
11
25
|
export class UnauthorizedError extends Error {
|
|
26
|
+
/**
|
|
27
|
+
* Create a new UnauthorizedError.
|
|
28
|
+
*
|
|
29
|
+
* @param message - Error message describing the authentication failure
|
|
30
|
+
*/
|
|
12
31
|
constructor(message) {
|
|
13
32
|
super(message);
|
|
14
33
|
this.name = 'UnauthorizedError';
|
|
15
34
|
}
|
|
16
35
|
}
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Zod Validation Schemas
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Note: JobStatusSchema, JobSortFieldSchema, SortOrderSchema, JobSchema,
|
|
40
|
+
// JobStepSchema, GetJobStepsResultSchema, GetJobsResultSchema, and
|
|
41
|
+
// GetActionsResultSchema are imported from ./adapters/schemas.js to avoid duplication
|
|
17
42
|
export const GetJobStepsQuerySchema = z
|
|
18
43
|
.object({
|
|
19
44
|
search: z.string().optional(),
|
|
@@ -23,21 +48,28 @@ export const GetJobStepsQuerySchema = z
|
|
|
23
48
|
search: data.search,
|
|
24
49
|
updatedAfter: data.fUpdatedAfter,
|
|
25
50
|
}));
|
|
51
|
+
// Reuse GetJobStepsResultSchema from schemas.ts
|
|
26
52
|
export const GetJobStepsResponseSchema = GetJobStepsResultSchema;
|
|
27
53
|
export const GetJobsQuerySchema = z
|
|
28
54
|
.object({
|
|
55
|
+
// Pagination
|
|
29
56
|
page: z.coerce.number().int().min(1).optional(),
|
|
30
57
|
pageSize: z.coerce.number().int().min(1).max(1000).optional(),
|
|
58
|
+
// Filters - arrays can be passed as comma-separated or multiple params
|
|
31
59
|
fStatus: z.union([JobStatusSchema, z.array(JobStatusSchema)]).optional(),
|
|
32
60
|
fActionName: z.union([z.string(), z.array(z.string())]).optional(),
|
|
33
61
|
fGroupKey: z.union([z.string(), z.array(z.string())]).optional(),
|
|
34
62
|
fClientId: z.union([z.string(), z.array(z.string())]).optional(),
|
|
63
|
+
fDescription: z.string().optional(),
|
|
64
|
+
// Date filters: can be a single ISO string or JSON array [start, end] - both coerced to Date objects
|
|
35
65
|
fCreatedAt: z.union([z.coerce.date(), z.array(z.coerce.date())]).optional(),
|
|
36
66
|
fStartedAt: z.union([z.coerce.date(), z.array(z.coerce.date())]).optional(),
|
|
37
67
|
fFinishedAt: z.union([z.coerce.date(), z.array(z.coerce.date())]).optional(),
|
|
38
68
|
fUpdatedAfter: z.coerce.date().optional(),
|
|
39
69
|
fSearch: z.string().optional(),
|
|
70
|
+
// Sort - format: "field:asc,field:desc"
|
|
40
71
|
sort: z.string().optional(),
|
|
72
|
+
// JSONB filters as JSON strings
|
|
41
73
|
fInputFilter: z.record(z.string(), z.any()).optional(),
|
|
42
74
|
fOutputFilter: z.record(z.string(), z.any()).optional(),
|
|
43
75
|
})
|
|
@@ -51,6 +83,8 @@ export const GetJobsQuerySchema = z
|
|
|
51
83
|
filters.groupKey = data.fGroupKey;
|
|
52
84
|
if (data.fClientId)
|
|
53
85
|
filters.clientId = data.fClientId;
|
|
86
|
+
if (data.fDescription)
|
|
87
|
+
filters.description = data.fDescription;
|
|
54
88
|
if (data.fCreatedAt)
|
|
55
89
|
filters.createdAt = data.fCreatedAt;
|
|
56
90
|
if (data.fStartedAt)
|
|
@@ -65,6 +99,7 @@ export const GetJobsQuerySchema = z
|
|
|
65
99
|
filters.inputFilter = data.fInputFilter;
|
|
66
100
|
if (data.fOutputFilter)
|
|
67
101
|
filters.outputFilter = data.fOutputFilter;
|
|
102
|
+
// Parse sort string: "field:asc,field:desc" -> [{ field: 'field', order: 'asc' }, { field: 'field', order: 'desc' }]
|
|
68
103
|
let sort;
|
|
69
104
|
if (data.sort) {
|
|
70
105
|
const sortParts = data.sort
|
|
@@ -77,6 +112,7 @@ export const GetJobsQuerySchema = z
|
|
|
77
112
|
if (!field || !order) {
|
|
78
113
|
return null;
|
|
79
114
|
}
|
|
115
|
+
// Validate field and order
|
|
80
116
|
const fieldResult = JobSortFieldSchema.safeParse(field);
|
|
81
117
|
const orderResult = SortOrderSchema.safeParse(order.toLowerCase());
|
|
82
118
|
if (!fieldResult.success || !orderResult.success) {
|
|
@@ -88,6 +124,7 @@ export const GetJobsQuerySchema = z
|
|
|
88
124
|
};
|
|
89
125
|
})
|
|
90
126
|
.filter((s) => s !== null);
|
|
127
|
+
// If no valid sorts were parsed, set to undefined
|
|
91
128
|
if (parsedSorts.length === 0) {
|
|
92
129
|
sort = undefined;
|
|
93
130
|
}
|
|
@@ -102,35 +139,41 @@ export const GetJobsQuerySchema = z
|
|
|
102
139
|
sort,
|
|
103
140
|
};
|
|
104
141
|
});
|
|
142
|
+
// Reuse GetJobsResultSchema from schemas.ts
|
|
105
143
|
export const GetJobsResponseSchema = GetJobsResultSchema;
|
|
144
|
+
// Reuse GetActionsResultSchema from schemas.ts
|
|
106
145
|
export const GetActionsResponseSchema = GetActionsResultSchema;
|
|
107
146
|
export const GetActionsMetadataResponseSchema = z.array(z.object({
|
|
108
147
|
name: z.string(),
|
|
109
148
|
mockInput: z.any(),
|
|
110
149
|
}));
|
|
111
|
-
|
|
150
|
+
// Spans query schema
|
|
151
|
+
export const GetSpansQuerySchema = z
|
|
112
152
|
.object({
|
|
153
|
+
// Filters
|
|
113
154
|
fName: z.union([z.string(), z.array(z.string())]).optional(),
|
|
114
|
-
|
|
115
|
-
|
|
155
|
+
fKind: z.union([SpanKindSchema, z.array(SpanKindSchema)]).optional(),
|
|
156
|
+
fTraceId: z.string().optional(),
|
|
116
157
|
fAttributesFilter: z.record(z.string(), z.any()).optional(),
|
|
158
|
+
// Sort - format: "field:asc" or "field:desc"
|
|
117
159
|
sort: z.string().optional(),
|
|
118
160
|
})
|
|
119
161
|
.transform((data) => {
|
|
120
162
|
const filters = {};
|
|
121
163
|
if (data.fName)
|
|
122
164
|
filters.name = data.fName;
|
|
123
|
-
if (data.
|
|
124
|
-
filters.
|
|
125
|
-
if (data.
|
|
126
|
-
filters.
|
|
165
|
+
if (data.fKind)
|
|
166
|
+
filters.kind = data.fKind;
|
|
167
|
+
if (data.fTraceId)
|
|
168
|
+
filters.traceId = data.fTraceId;
|
|
127
169
|
if (data.fAttributesFilter)
|
|
128
170
|
filters.attributesFilter = data.fAttributesFilter;
|
|
171
|
+
// Parse sort string: "field:asc" -> { field: 'field', order: 'asc' }
|
|
129
172
|
let sort;
|
|
130
173
|
if (data.sort) {
|
|
131
174
|
const [field, order] = data.sort.split(':').map((s) => s.trim());
|
|
132
175
|
if (field && order) {
|
|
133
|
-
const fieldResult =
|
|
176
|
+
const fieldResult = SpanSortFieldSchema.safeParse(field);
|
|
134
177
|
const orderResult = SortOrderSchema.safeParse(order.toLowerCase());
|
|
135
178
|
if (fieldResult.success && orderResult.success) {
|
|
136
179
|
sort = {
|
|
@@ -171,10 +214,19 @@ export const TimeTravelJobResponseSchema = z.object({
|
|
|
171
214
|
success: z.boolean(),
|
|
172
215
|
message: z.string(),
|
|
173
216
|
});
|
|
174
|
-
|
|
217
|
+
/**
|
|
218
|
+
* Creates an Elysia server instance with duron API endpoints.
|
|
219
|
+
* All endpoints use Zod for input and response validation.
|
|
220
|
+
*
|
|
221
|
+
* @param options - Configuration options
|
|
222
|
+
* @returns Elysia server instance
|
|
223
|
+
*/
|
|
224
|
+
export function createServer({ client, prefix, login, spansEnabled }) {
|
|
225
|
+
// Convert string secret to Uint8Array if needed
|
|
175
226
|
const secretKey = typeof login?.jwtSecret === 'string' ? new TextEncoder().encode(login?.jwtSecret) : login?.jwtSecret;
|
|
176
227
|
const routePrefix = (prefix ?? '/api');
|
|
177
|
-
|
|
228
|
+
// Auto-detect spansEnabled from client if not explicitly set
|
|
229
|
+
const isSpansEnabled = spansEnabled ?? client.spansEnabled;
|
|
178
230
|
return new Elysia({
|
|
179
231
|
prefix: routePrefix,
|
|
180
232
|
})
|
|
@@ -197,6 +249,7 @@ export function createServer({ client, prefix, login, metricsEnabled }) {
|
|
|
197
249
|
message: error.message,
|
|
198
250
|
};
|
|
199
251
|
}
|
|
252
|
+
// Handle other errors
|
|
200
253
|
set.status = code === 'NOT_FOUND' ? 404 : 500;
|
|
201
254
|
return {
|
|
202
255
|
error: 'Internal server error',
|
|
@@ -215,6 +268,7 @@ export function createServer({ client, prefix, login, metricsEnabled }) {
|
|
|
215
268
|
user: null,
|
|
216
269
|
};
|
|
217
270
|
}
|
|
271
|
+
// Extract token from "Bearer <token>" format
|
|
218
272
|
const token = authHeader.startsWith('Bearer ') ? authHeader.slice(7) : authHeader;
|
|
219
273
|
if (!token) {
|
|
220
274
|
return {
|
|
@@ -472,54 +526,54 @@ export function createServer({ client, prefix, login, metricsEnabled }) {
|
|
|
472
526
|
})
|
|
473
527
|
.get('/config', async () => {
|
|
474
528
|
return {
|
|
475
|
-
|
|
529
|
+
spansEnabled: isSpansEnabled,
|
|
476
530
|
authEnabled: !!login,
|
|
477
531
|
};
|
|
478
532
|
}, {
|
|
479
533
|
response: {
|
|
480
534
|
200: z.object({
|
|
481
|
-
|
|
535
|
+
spansEnabled: z.boolean(),
|
|
482
536
|
authEnabled: z.boolean(),
|
|
483
537
|
}),
|
|
484
538
|
500: ErrorResponseSchema,
|
|
485
539
|
},
|
|
486
540
|
})
|
|
487
|
-
.get('/jobs/:id/
|
|
488
|
-
if (!
|
|
489
|
-
throw new Error('
|
|
541
|
+
.get('/jobs/:id/spans', async ({ params, query }) => {
|
|
542
|
+
if (!isSpansEnabled) {
|
|
543
|
+
throw new Error('Spans are not enabled. Enable telemetry.local to enable spans.');
|
|
490
544
|
}
|
|
491
545
|
const options = {
|
|
492
546
|
jobId: params.id,
|
|
493
547
|
filters: query.filters,
|
|
494
548
|
sort: query.sort,
|
|
495
549
|
};
|
|
496
|
-
return client.
|
|
550
|
+
return client.getSpans(options);
|
|
497
551
|
}, {
|
|
498
552
|
params: JobIdParamsSchema,
|
|
499
|
-
query:
|
|
553
|
+
query: GetSpansQuerySchema,
|
|
500
554
|
response: {
|
|
501
|
-
200:
|
|
555
|
+
200: GetSpansResultSchema,
|
|
502
556
|
400: ErrorResponseSchema,
|
|
503
557
|
500: ErrorResponseSchema,
|
|
504
558
|
401: ErrorResponseSchema,
|
|
505
559
|
},
|
|
506
560
|
auth: true,
|
|
507
561
|
})
|
|
508
|
-
.get('/steps/:id/
|
|
509
|
-
if (!
|
|
510
|
-
throw new Error('
|
|
562
|
+
.get('/steps/:id/spans', async ({ params, query }) => {
|
|
563
|
+
if (!isSpansEnabled) {
|
|
564
|
+
throw new Error('Spans are not enabled. Enable telemetry.local to enable spans.');
|
|
511
565
|
}
|
|
512
566
|
const options = {
|
|
513
567
|
stepId: params.id,
|
|
514
568
|
filters: query.filters,
|
|
515
569
|
sort: query.sort,
|
|
516
570
|
};
|
|
517
|
-
return client.
|
|
571
|
+
return client.getSpans(options);
|
|
518
572
|
}, {
|
|
519
573
|
params: StepIdParamsSchema,
|
|
520
|
-
query:
|
|
574
|
+
query: GetSpansQuerySchema,
|
|
521
575
|
response: {
|
|
522
|
-
200:
|
|
576
|
+
200: GetSpansResultSchema,
|
|
523
577
|
400: ErrorResponseSchema,
|
|
524
578
|
500: ErrorResponseSchema,
|
|
525
579
|
401: ErrorResponseSchema,
|
|
@@ -557,11 +611,13 @@ export function createServer({ client, prefix, login, metricsEnabled }) {
|
|
|
557
611
|
if (!success) {
|
|
558
612
|
throw new UnauthorizedError('Invalid credentials');
|
|
559
613
|
}
|
|
614
|
+
// Generate access token (short-lived)
|
|
560
615
|
const accessToken = await new SignJWT({ email, type: 'access' })
|
|
561
616
|
.setProtectedHeader({ alg: 'HS256' })
|
|
562
617
|
.setIssuedAt()
|
|
563
618
|
.setExpirationTime(login.expirationTime ?? '1h')
|
|
564
619
|
.sign(secretKey);
|
|
620
|
+
// Generate refresh token (long-lived)
|
|
565
621
|
const refreshToken = await new SignJWT({ email, type: 'refresh' })
|
|
566
622
|
.setProtectedHeader({ alg: 'HS256' })
|
|
567
623
|
.setIssuedAt()
|
|
@@ -595,14 +651,17 @@ export function createServer({ client, prefix, login, metricsEnabled }) {
|
|
|
595
651
|
throw new UnauthorizedError('Refresh token is required');
|
|
596
652
|
}
|
|
597
653
|
try {
|
|
654
|
+
// Verify refresh token
|
|
598
655
|
const { payload } = await jwtVerify(providedRefreshToken, secretKey);
|
|
599
656
|
const typedPayload = payload;
|
|
657
|
+
// Ensure it's a refresh token
|
|
600
658
|
if (typedPayload.type !== 'refresh') {
|
|
601
659
|
throw new UnauthorizedError('Invalid token type');
|
|
602
660
|
}
|
|
603
661
|
if (!typedPayload.email) {
|
|
604
662
|
throw new UnauthorizedError('Invalid token payload');
|
|
605
663
|
}
|
|
664
|
+
// Generate new access token
|
|
606
665
|
const accessToken = await new SignJWT({ email: typedPayload.email, type: 'access' })
|
|
607
666
|
.setProtectedHeader({ alg: 'HS256' })
|
|
608
667
|
.setIssuedAt()
|