duron 0.3.0-beta.10 → 0.3.0-beta.11

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 (60) hide show
  1. package/dist/action-job.d.ts +31 -0
  2. package/dist/action-job.d.ts.map +1 -1
  3. package/dist/action-job.js +59 -0
  4. package/dist/action-manager.d.ts +42 -0
  5. package/dist/action-manager.d.ts.map +1 -1
  6. package/dist/action-manager.js +61 -0
  7. package/dist/action.d.ts +143 -0
  8. package/dist/action.d.ts.map +1 -1
  9. package/dist/action.js +131 -0
  10. package/dist/adapters/adapter.d.ts +359 -0
  11. package/dist/adapters/adapter.d.ts.map +1 -1
  12. package/dist/adapters/adapter.js +208 -0
  13. package/dist/adapters/postgres/base.d.ts +166 -0
  14. package/dist/adapters/postgres/base.d.ts.map +1 -1
  15. package/dist/adapters/postgres/base.js +268 -17
  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.js +11 -1
  23. package/dist/adapters/schemas.d.ts +9 -0
  24. package/dist/adapters/schemas.d.ts.map +1 -1
  25. package/dist/adapters/schemas.js +73 -1
  26. package/dist/client.d.ts +224 -0
  27. package/dist/client.d.ts.map +1 -1
  28. package/dist/client.js +311 -1
  29. package/dist/constants.js +6 -0
  30. package/dist/errors.d.ts +119 -0
  31. package/dist/errors.d.ts.map +1 -1
  32. package/dist/errors.js +111 -0
  33. package/dist/server.d.ts +44 -0
  34. package/dist/server.d.ts.map +1 -1
  35. package/dist/server.js +56 -0
  36. package/dist/step-manager.d.ts +83 -0
  37. package/dist/step-manager.d.ts.map +1 -1
  38. package/dist/step-manager.js +237 -5
  39. package/dist/telemetry/adapter.d.ts +322 -0
  40. package/dist/telemetry/adapter.d.ts.map +1 -1
  41. package/dist/telemetry/adapter.js +145 -0
  42. package/dist/telemetry/index.js +1 -0
  43. package/dist/telemetry/local.d.ts +48 -0
  44. package/dist/telemetry/local.d.ts.map +1 -1
  45. package/dist/telemetry/local.js +102 -0
  46. package/dist/telemetry/noop.d.ts +10 -0
  47. package/dist/telemetry/noop.d.ts.map +1 -1
  48. package/dist/telemetry/noop.js +43 -0
  49. package/dist/telemetry/opentelemetry.d.ts +23 -0
  50. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  51. package/dist/telemetry/opentelemetry.js +39 -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/package.json +1 -1
  59. package/src/adapters/postgres/base.ts +40 -17
  60. package/src/adapters/schemas.ts +11 -1
@@ -1011,26 +1011,38 @@ export class PostgresBaseAdapter<Database extends DrizzleDatabase, Connection> e
1011
1011
  * Internal method to get a job by its ID. Does not include step information.
1012
1012
  */
1013
1013
  protected async _getJobById(jobId: string): Promise<Job | null> {
1014
+ const jobsTable = this.tables.jobsTable
1015
+
1016
+ // Calculate duration as a SQL expression (finishedAt - startedAt in milliseconds)
1017
+ const durationMs = sql<number | null>`
1018
+ CASE
1019
+ WHEN ${jobsTable.started_at} IS NOT NULL AND ${jobsTable.finished_at} IS NOT NULL
1020
+ THEN EXTRACT(EPOCH FROM (${jobsTable.finished_at} - ${jobsTable.started_at})) * 1000
1021
+ ELSE NULL
1022
+ END
1023
+ `.as('duration_ms')
1024
+
1014
1025
  const [job] = await this.db
1015
1026
  .select({
1016
- id: this.tables.jobsTable.id,
1017
- actionName: this.tables.jobsTable.action_name,
1018
- groupKey: this.tables.jobsTable.group_key,
1019
- input: this.tables.jobsTable.input,
1020
- output: this.tables.jobsTable.output,
1021
- error: this.tables.jobsTable.error,
1022
- status: this.tables.jobsTable.status,
1023
- timeoutMs: this.tables.jobsTable.timeout_ms,
1024
- expiresAt: this.tables.jobsTable.expires_at,
1025
- startedAt: this.tables.jobsTable.started_at,
1026
- finishedAt: this.tables.jobsTable.finished_at,
1027
- createdAt: this.tables.jobsTable.created_at,
1028
- updatedAt: this.tables.jobsTable.updated_at,
1029
- concurrencyLimit: this.tables.jobsTable.concurrency_limit,
1030
- clientId: this.tables.jobsTable.client_id,
1027
+ id: jobsTable.id,
1028
+ actionName: jobsTable.action_name,
1029
+ groupKey: jobsTable.group_key,
1030
+ input: jobsTable.input,
1031
+ output: jobsTable.output,
1032
+ error: jobsTable.error,
1033
+ status: jobsTable.status,
1034
+ timeoutMs: jobsTable.timeout_ms,
1035
+ expiresAt: jobsTable.expires_at,
1036
+ startedAt: jobsTable.started_at,
1037
+ finishedAt: jobsTable.finished_at,
1038
+ createdAt: jobsTable.created_at,
1039
+ updatedAt: jobsTable.updated_at,
1040
+ concurrencyLimit: jobsTable.concurrency_limit,
1041
+ clientId: jobsTable.client_id,
1042
+ durationMs,
1031
1043
  })
1032
- .from(this.tables.jobsTable)
1033
- .where(eq(this.tables.jobsTable.id, jobId))
1044
+ .from(jobsTable)
1045
+ .where(eq(jobsTable.id, jobId))
1034
1046
  .limit(1)
1035
1047
 
1036
1048
  return job ?? null
@@ -1194,6 +1206,15 @@ export class PostgresBaseAdapter<Database extends DrizzleDatabase, Connection> e
1194
1206
  }
1195
1207
  }
1196
1208
 
1209
+ // Calculate duration as a SQL expression (finishedAt - startedAt in milliseconds)
1210
+ const durationMs = sql<number | null>`
1211
+ CASE
1212
+ WHEN ${jobsTable.started_at} IS NOT NULL AND ${jobsTable.finished_at} IS NOT NULL
1213
+ THEN EXTRACT(EPOCH FROM (${jobsTable.finished_at} - ${jobsTable.started_at})) * 1000
1214
+ ELSE NULL
1215
+ END
1216
+ `.as('duration_ms')
1217
+
1197
1218
  const sortFieldMap: Record<JobSort['field'], any> = {
1198
1219
  createdAt: jobsTable.created_at,
1199
1220
  startedAt: jobsTable.started_at,
@@ -1201,6 +1222,7 @@ export class PostgresBaseAdapter<Database extends DrizzleDatabase, Connection> e
1201
1222
  status: jobsTable.status,
1202
1223
  actionName: jobsTable.action_name,
1203
1224
  expiresAt: jobsTable.expires_at,
1225
+ duration: durationMs,
1204
1226
  }
1205
1227
 
1206
1228
  const jobs = await this.db
@@ -1220,6 +1242,7 @@ export class PostgresBaseAdapter<Database extends DrizzleDatabase, Connection> e
1220
1242
  updatedAt: jobsTable.updated_at,
1221
1243
  concurrencyLimit: jobsTable.concurrency_limit,
1222
1244
  clientId: jobsTable.client_id,
1245
+ durationMs,
1223
1246
  })
1224
1247
  .from(jobsTable)
1225
1248
  .where(where)
@@ -46,6 +46,8 @@ export const JobSchema = z.object({
46
46
  updatedAt: DateSchema,
47
47
  concurrencyLimit: z.coerce.number(),
48
48
  clientId: z.string().nullable().optional(),
49
+ /** Duration in milliseconds (finishedAt - startedAt). Null if job hasn't finished. */
50
+ durationMs: z.coerce.number().nullable().default(null),
49
51
  })
50
52
 
51
53
  // ============================================================================
@@ -85,7 +87,15 @@ export const JobStepWithoutOutputSchema = JobStepSchema.omit({ output: true })
85
87
 
86
88
  export const SortOrderSchema = z.enum(['asc', 'desc'])
87
89
 
88
- export const JobSortFieldSchema = z.enum(['createdAt', 'startedAt', 'finishedAt', 'status', 'actionName', 'expiresAt'])
90
+ export const JobSortFieldSchema = z.enum([
91
+ 'createdAt',
92
+ 'startedAt',
93
+ 'finishedAt',
94
+ 'status',
95
+ 'actionName',
96
+ 'expiresAt',
97
+ 'duration',
98
+ ])
89
99
 
90
100
  export const JobSortSchema = z.object({
91
101
  field: JobSortFieldSchema,