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.
Files changed (91) hide show
  1. package/dist/action-job.d.ts +33 -2
  2. package/dist/action-job.d.ts.map +1 -1
  3. package/dist/action-job.js +88 -23
  4. package/dist/action-manager.d.ts +44 -2
  5. package/dist/action-manager.d.ts.map +1 -1
  6. package/dist/action-manager.js +64 -3
  7. package/dist/action.d.ts +388 -7
  8. package/dist/action.d.ts.map +1 -1
  9. package/dist/action.js +44 -23
  10. package/dist/adapters/adapter.d.ts +365 -8
  11. package/dist/adapters/adapter.d.ts.map +1 -1
  12. package/dist/adapters/adapter.js +221 -15
  13. package/dist/adapters/postgres/base.d.ts +184 -6
  14. package/dist/adapters/postgres/base.d.ts.map +1 -1
  15. package/dist/adapters/postgres/base.js +436 -75
  16. package/dist/adapters/postgres/pglite.d.ts +37 -0
  17. package/dist/adapters/postgres/pglite.d.ts.map +1 -1
  18. package/dist/adapters/postgres/pglite.js +38 -0
  19. package/dist/adapters/postgres/postgres.d.ts +35 -0
  20. package/dist/adapters/postgres/postgres.d.ts.map +1 -1
  21. package/dist/adapters/postgres/postgres.js +42 -0
  22. package/dist/adapters/postgres/schema.d.ts +150 -37
  23. package/dist/adapters/postgres/schema.d.ts.map +1 -1
  24. package/dist/adapters/postgres/schema.default.d.ts +151 -38
  25. package/dist/adapters/postgres/schema.default.d.ts.map +1 -1
  26. package/dist/adapters/postgres/schema.default.js +2 -2
  27. package/dist/adapters/postgres/schema.js +60 -23
  28. package/dist/adapters/schemas.d.ts +124 -80
  29. package/dist/adapters/schemas.d.ts.map +1 -1
  30. package/dist/adapters/schemas.js +139 -26
  31. package/dist/client.d.ts +426 -22
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +370 -20
  34. package/dist/constants.js +6 -0
  35. package/dist/errors.d.ts +140 -3
  36. package/dist/errors.d.ts.map +1 -1
  37. package/dist/errors.js +152 -9
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/server.d.ts +99 -37
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/server.js +84 -25
  43. package/dist/step-manager.d.ts +111 -4
  44. package/dist/step-manager.d.ts.map +1 -1
  45. package/dist/step-manager.js +403 -75
  46. package/dist/telemetry/index.d.ts +1 -4
  47. package/dist/telemetry/index.d.ts.map +1 -1
  48. package/dist/telemetry/index.js +2 -4
  49. package/dist/telemetry/local-span-exporter.d.ts +56 -0
  50. package/dist/telemetry/local-span-exporter.d.ts.map +1 -0
  51. package/dist/telemetry/local-span-exporter.js +118 -0
  52. package/dist/utils/p-retry.d.ts +5 -0
  53. package/dist/utils/p-retry.d.ts.map +1 -1
  54. package/dist/utils/p-retry.js +8 -0
  55. package/dist/utils/wait-for-abort.d.ts +1 -0
  56. package/dist/utils/wait-for-abort.d.ts.map +1 -1
  57. package/dist/utils/wait-for-abort.js +1 -0
  58. package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/migration.sql +32 -20
  59. package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/snapshot.json +241 -66
  60. package/package.json +42 -26
  61. package/src/action-job.ts +33 -29
  62. package/src/action-manager.ts +5 -5
  63. package/src/action.ts +317 -149
  64. package/src/adapters/adapter.ts +54 -54
  65. package/src/adapters/postgres/base.ts +266 -86
  66. package/src/adapters/postgres/schema.default.ts +2 -2
  67. package/src/adapters/postgres/schema.ts +52 -24
  68. package/src/adapters/schemas.ts +91 -36
  69. package/src/client.ts +322 -68
  70. package/src/errors.ts +84 -12
  71. package/src/index.ts +2 -0
  72. package/src/server.ts +39 -37
  73. package/src/step-manager.ts +246 -95
  74. package/src/telemetry/index.ts +2 -20
  75. package/src/telemetry/local-span-exporter.ts +148 -0
  76. package/dist/telemetry/adapter.d.ts +0 -107
  77. package/dist/telemetry/adapter.d.ts.map +0 -1
  78. package/dist/telemetry/adapter.js +0 -134
  79. package/dist/telemetry/local.d.ts +0 -22
  80. package/dist/telemetry/local.d.ts.map +0 -1
  81. package/dist/telemetry/local.js +0 -243
  82. package/dist/telemetry/noop.d.ts +0 -17
  83. package/dist/telemetry/noop.d.ts.map +0 -1
  84. package/dist/telemetry/noop.js +0 -66
  85. package/dist/telemetry/opentelemetry.d.ts +0 -25
  86. package/dist/telemetry/opentelemetry.d.ts.map +0 -1
  87. package/dist/telemetry/opentelemetry.js +0 -312
  88. package/src/telemetry/adapter.ts +0 -642
  89. package/src/telemetry/local.ts +0 -429
  90. package/src/telemetry/noop.ts +0 -141
  91. 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, MetricSortFieldSchema, SortOrderSchema } from './adapters/schemas.js';
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 GetMetricsQuerySchema: z.ZodPipe<z.ZodObject<{
173
+ export declare const GetSpansQuerySchema: z.ZodPipe<z.ZodObject<{
153
174
  fName: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
154
- fType: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
155
- metric: "metric";
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 MetricSortFieldSchema>;
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
- fType?: "metric" | "span_event" | "span_attribute" | ("metric" | "span_event" | "span_attribute")[] | undefined;
175
- fTimestampRange?: Date[] | undefined;
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 GetMetricsQueryInput = z.input<typeof GetMetricsQuerySchema>;
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
- metricsEnabled?: boolean;
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
- export declare function createServer<P extends string>({ client, prefix, login, metricsEnabled }: CreateServerOptions<P>): Elysia<P, {
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
- metricsEnabled: boolean;
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/metrics`, {
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 MetricSortFieldSchema>;
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
- metrics: {
1181
- id: string;
1182
- jobId: string;
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
- value: number;
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
- type: "metric" | "span_event" | "span_attribute";
1188
- timestamp: Date;
1189
- createdAt: Date;
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/metrics`, {
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 MetricSortFieldSchema>;
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
- metrics: {
1235
- id: string;
1236
- jobId: string;
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
- value: number;
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
- type: "metric" | "span_event" | "span_attribute";
1242
- timestamp: Date;
1243
- createdAt: Date;
1301
+ events: {
1302
+ name: string;
1303
+ timeUnixNano: string;
1304
+ attributes?: Record<string, any> | undefined;
1305
+ }[];
1244
1306
  }[];
1245
1307
  total: number;
1246
1308
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
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, GetMetricsResultSchema, JobSchema, JobSortFieldSchema, JobStatusResultSchema, JobStatusSchema, JobStepSchema, JobStepStatusResultSchema, MetricSortFieldSchema, MetricTypeSchema, SortOrderSchema, } from './adapters/schemas.js';
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
- export const GetMetricsQuerySchema = z
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
- fType: z.union([MetricTypeSchema, z.array(MetricTypeSchema)]).optional(),
115
- fTimestampRange: z.array(z.coerce.date()).length(2).optional(),
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.fType)
124
- filters.type = data.fType;
125
- if (data.fTimestampRange)
126
- filters.timestampRange = data.fTimestampRange;
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 = MetricSortFieldSchema.safeParse(field);
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
- export function createServer({ client, prefix, login, metricsEnabled }) {
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
- const isMetricsEnabled = metricsEnabled ?? client.metricsEnabled;
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
- metricsEnabled: isMetricsEnabled,
529
+ spansEnabled: isSpansEnabled,
476
530
  authEnabled: !!login,
477
531
  };
478
532
  }, {
479
533
  response: {
480
534
  200: z.object({
481
- metricsEnabled: z.boolean(),
535
+ spansEnabled: z.boolean(),
482
536
  authEnabled: z.boolean(),
483
537
  }),
484
538
  500: ErrorResponseSchema,
485
539
  },
486
540
  })
487
- .get('/jobs/:id/metrics', async ({ params, query }) => {
488
- if (!isMetricsEnabled) {
489
- throw new Error('Metrics are not enabled. Use LocalTelemetryAdapter to enable metrics.');
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.getMetrics(options);
550
+ return client.getSpans(options);
497
551
  }, {
498
552
  params: JobIdParamsSchema,
499
- query: GetMetricsQuerySchema,
553
+ query: GetSpansQuerySchema,
500
554
  response: {
501
- 200: GetMetricsResultSchema,
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/metrics', async ({ params, query }) => {
509
- if (!isMetricsEnabled) {
510
- throw new Error('Metrics are not enabled. Use LocalTelemetryAdapter to enable metrics.');
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.getMetrics(options);
571
+ return client.getSpans(options);
518
572
  }, {
519
573
  params: StepIdParamsSchema,
520
- query: GetMetricsQuerySchema,
574
+ query: GetSpansQuerySchema,
521
575
  response: {
522
- 200: GetMetricsResultSchema,
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()