@happyvertical/smrt-jobs 0.49.2 → 0.49.4
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/AGENTS.md +1 -1
- package/README.md +10 -1
- package/dist/chunks/{runner-BsYIDzhc.js → runner-DPSBS7Wf.js} +53 -17
- package/dist/chunks/{runner-BsYIDzhc.js.map → runner-DPSBS7Wf.js.map} +1 -1
- package/dist/durable-payload-integrity.d.ts +16 -0
- package/dist/durable-payload-integrity.d.ts.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -3
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +391 -20
- package/dist/runner.d.ts +20 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +2 -2
- package/dist/smrt-knowledge.json +6 -6
- package/package.json +7 -7
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface DurableJobPayloadIntegrity {
|
|
2
|
+
version: 1;
|
|
3
|
+
keyId: string;
|
|
4
|
+
signature: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DurableJobPayloadSigner {
|
|
7
|
+
readonly keyId: string;
|
|
8
|
+
sign(payload: unknown): DurableJobPayloadIntegrity;
|
|
9
|
+
verify(payload: unknown, integrity: DurableJobPayloadIntegrity): boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Create a deterministic HMAC signer for JSON job payloads. The key is never persisted. */
|
|
12
|
+
export declare function createHmacDurableJobPayloadSigner(options: {
|
|
13
|
+
keyId: string;
|
|
14
|
+
key: string | Uint8Array;
|
|
15
|
+
}): DurableJobPayloadSigner;
|
|
16
|
+
//# sourceMappingURL=durable-payload-integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-payload-integrity.d.ts","sourceRoot":"","sources":["../src/durable-payload-integrity.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,0BAA0B,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,0BAA0B,GAAG,OAAO,CAAC;CAC1E;AAED,4FAA4F;AAC5F,wBAAgB,iCAAiC,CAAC,OAAO,EAAE;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;CAC1B,GAAG,uBAAuB,CAyC1B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { assertWithinTenantCreationCap, type BackgroundEligibleClass, backgroundEligible, clampRetries, DEFAULT_TENANT_JOB_CAP, getBackgroundEligibleMethods, isBackgroundEligibleMethod, MAX_JOB_RETRIES, markBackgroundEligible, TenantJobCapExceededError, } from './background-policy.js';
|
|
2
|
+
export { createHmacDurableJobPayloadSigner, type DurableJobPayloadIntegrity, type DurableJobPayloadSigner, } from './durable-payload-integrity.js';
|
|
2
3
|
export { redactErrorForPersistence, redactErrorMessage, } from './error-redaction.js';
|
|
3
4
|
export { type AcceptedForgeDelivery, type AcceptForgeDeliveryInput, type ClaimForgeDeliveryOptions, ForgeDelivery, ForgeDeliveryCollection, type ForgeDeliveryStatus, type ForgeObservation, type ForgeProjectionAuditEvent, type ForgeProjectionAuditHook, ForgeProjectionCheckpoint, type ForgeProjectionContext, ForgeProjectionRuntime, type ForgeProjectionRuntimeOptions, type ForgeProjector, } from './forge-projection.js';
|
|
4
5
|
export { JobBuilder, type Priority, parseDelay, priorityToNumber, } from './job-builder.js';
|
|
@@ -7,7 +8,7 @@ export { type JobContext, JobContextLogger, type JobEventInput, type JobExecutio
|
|
|
7
8
|
export { type CreateMcpTaskInput, createMcpTaskResult, getMcpTaskMarker, MCP_TASKS_EXTENSION, type McpTask, McpTaskCancelledError, type McpTaskJobMarker, McpTaskNotFoundError, type McpTaskStatus, McpTaskStore, requestMcpTaskInput, taskFromJob, } from './mcp-task.js';
|
|
8
9
|
export { type BackgroundCapable, type BgOptions, withBackgroundJobs, } from './object-extension.js';
|
|
9
10
|
export { DEFAULT_JOB_RETENTION, DEFAULT_RETENTION_SWEEP_INTERVAL_MS, JOB_EVENTS_RETENTION_TASK, JOBS_RETENTION_TASK, type JobRetentionOptions, type RetentionSweeper, type RetentionSweeperOptions, registerJobRetentionTasks, startRetentionSweeper, unregisterJobRetentionTasks, } from './retention.js';
|
|
10
|
-
export { createTaskRunner, JobTimeoutError, TaskRunner, type TaskRunnerConfig, type TaskRunnerEvents, } from './runner.js';
|
|
11
|
+
export { createTaskRunner, getActiveJobExecutionContext, isRunnerExecutionContext, JobTimeoutError, TaskRunner, type TaskRunnerConfig, type TaskRunnerEvents, } from './runner.js';
|
|
11
12
|
export { createScheduleRunner, getNextCronDate, type ScheduleInfo, ScheduleRunner, type ScheduleRunnerConfig, type ScheduleRunnerEvents, validateCronExpression, } from './schedule-runner.js';
|
|
12
13
|
export { type ClaimReadyOptions, type JobStatus, type ListReadyOptions, SmrtJob, SmrtJobCollection, type SmrtJobData, type TimeoutBehavior, } from './smrt-job.js';
|
|
13
14
|
export { type JobEventCursor, type ListJobEventsOptions, SmrtJobEvent, SmrtJobEventCollection, type SmrtJobEventData, type SmrtJobEventLevel, type SmrtJobEventType, } from './smrt-job-event.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAKH,OAAO,wBAAwB,CAAC;AAYhC,OAAO,EACL,6BAA6B,EAC7B,KAAK,uBAAuB,EAC5B,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,eAAe,EACf,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,65 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as SmrtJobCollection, C as JOB_EVENTS_RETENTION_TASK, D as SmrtJobEvent, E as unregisterJobRetentionTasks, F as backgroundEligible, I as clampRetries, L as getBackgroundEligibleMethods, M as MAX_JOB_RETRIES, N as TenantJobCapExceededError, O as SmrtJobEventCollection, P as assertWithinTenantCreationCap, R as isBackgroundEligibleMethod, S as JOBS_RETENTION_TASK, T as startRetentionSweeper, _ as JobContextLogger, a as isRunnerExecutionContext, b as DEFAULT_JOB_RETENTION, c as SmrtWorkerCollection, d as McpTaskNotFoundError, f as McpTaskStore, g as taskFromJob, h as requestMcpTaskInput, i as getActiveJobExecutionContext, j as DEFAULT_TENANT_JOB_CAP, k as SmrtJob, l as MCP_TASKS_EXTENSION, m as getMcpTaskMarker, n as TaskRunner, o as DEFAULT_TASK_HEARTBEAT_INTERVAL_MS, p as createMcpTaskResult, r as createTaskRunner, s as SmrtWorker, t as JobTimeoutError, u as McpTaskCancelledError, v as redactErrorForPersistence, w as registerJobRetentionTasks, x as DEFAULT_RETENTION_SWEEP_INTERVAL_MS, y as redactErrorMessage, z as markBackgroundEligible } from "./chunks/runner-DPSBS7Wf.js";
|
|
2
2
|
import { c as unregisterLiveWorker, i as registerLiveWorker, n as isWorkerAlive, t as createWorkerKey } from "./chunks/worker-liveness-C1Gjnhax.js";
|
|
3
3
|
import { ObjectRegistry, SmrtCollection, SmrtObject, detectEngine, field, smrt } from "@happyvertical/smrt-core";
|
|
4
4
|
import { createLogger } from "@happyvertical/logger";
|
|
5
5
|
import { TenantScoped, requireTenant, tenantId, withTenant } from "@happyvertical/smrt-tenancy";
|
|
6
|
-
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { createHmac, randomUUID, timingSafeEqual } from "node:crypto";
|
|
7
7
|
import { exponential } from "@happyvertical/jobs";
|
|
8
8
|
import { createId } from "@happyvertical/utils";
|
|
9
9
|
import { EventEmitter } from "node:events";
|
|
10
|
+
//#region src/durable-payload-integrity.ts
|
|
11
|
+
function createHmacDurableJobPayloadSigner(options) {
|
|
12
|
+
if (!options.keyId || options.keyId.length > 256) throw new Error("Durable job integrity keyId must contain 1-256 characters");
|
|
13
|
+
if ((typeof options.key === "string" ? Buffer.byteLength(options.key) : options.key.byteLength) < 32) throw new Error("Durable job integrity key must contain at least 32 bytes");
|
|
14
|
+
const signature = (payload) => createHmac("sha256", options.key).update(canonicalJson(payload)).digest("base64url");
|
|
15
|
+
return Object.freeze({
|
|
16
|
+
keyId: options.keyId,
|
|
17
|
+
sign(payload) {
|
|
18
|
+
return {
|
|
19
|
+
version: 1,
|
|
20
|
+
keyId: options.keyId,
|
|
21
|
+
signature: signature(payload)
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
verify(payload, integrity) {
|
|
25
|
+
if (integrity?.version !== 1 || integrity.keyId !== options.keyId || typeof integrity.signature !== "string") return false;
|
|
26
|
+
const expected = Buffer.from(signature(payload));
|
|
27
|
+
const actual = Buffer.from(integrity.signature);
|
|
28
|
+
return actual.length === expected.length && timingSafeEqual(actual, expected);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function canonicalJson(value) {
|
|
33
|
+
let persisted;
|
|
34
|
+
try {
|
|
35
|
+
persisted = JSON.stringify(value);
|
|
36
|
+
} catch {
|
|
37
|
+
throw new Error("Durable job integrity payload must be acyclic JSON");
|
|
38
|
+
}
|
|
39
|
+
if (persisted === void 0) throw new Error("Durable job integrity payload must be JSON-serializable");
|
|
40
|
+
const seen = /* @__PURE__ */ new Set();
|
|
41
|
+
const canonicalize = (item, inArray = false) => {
|
|
42
|
+
if (item === null || typeof item === "string" || typeof item === "boolean") return item;
|
|
43
|
+
if (typeof item === "number") return Number.isFinite(item) ? item : null;
|
|
44
|
+
if (item === void 0 || typeof item === "function" || typeof item === "symbol") return inArray ? null : void 0;
|
|
45
|
+
if (typeof item !== "object" || seen.has(item)) throw new Error("Durable job integrity payload must be acyclic JSON");
|
|
46
|
+
seen.add(item);
|
|
47
|
+
if (Array.isArray(item)) {
|
|
48
|
+
const result2 = item.map((entry) => canonicalize(entry, true));
|
|
49
|
+
seen.delete(item);
|
|
50
|
+
return result2;
|
|
51
|
+
}
|
|
52
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
53
|
+
for (const key of Object.keys(item).sort()) {
|
|
54
|
+
const entry = canonicalize(item[key]);
|
|
55
|
+
if (entry !== void 0) result[key] = entry;
|
|
56
|
+
}
|
|
57
|
+
seen.delete(item);
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
return JSON.stringify(canonicalize(JSON.parse(persisted)));
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
10
63
|
//#region src/forge-projection.ts
|
|
11
64
|
var __defProp = Object.defineProperty;
|
|
12
65
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -1182,6 +1235,6 @@ function createScheduleRunner(config) {
|
|
|
1182
1235
|
//#region src/index.ts
|
|
1183
1236
|
registerJobRetentionTasks();
|
|
1184
1237
|
//#endregion
|
|
1185
|
-
export { DEFAULT_JOB_RETENTION, DEFAULT_RETENTION_SWEEP_INTERVAL_MS, DEFAULT_TENANT_JOB_CAP, ForgeDelivery, ForgeDeliveryCollection, ForgeProjectionCheckpoint, ForgeProjectionRuntime, JOBS_RETENTION_TASK, JOB_EVENTS_RETENTION_TASK, JobBuilder, JobContextLogger, JobHandle, JobTimeoutError, MAX_JOB_RETRIES, MCP_TASKS_EXTENSION, McpTaskCancelledError, McpTaskNotFoundError, McpTaskStore, ScheduleRunner, SmrtJob, SmrtJobCollection, SmrtJobEvent, SmrtJobEventCollection, SmrtWorker, SmrtWorkerCollection, TaskRunner, TenantJobCapExceededError, assertWithinTenantCreationCap, backgroundEligible, clampRetries, createMcpTaskResult, createScheduleRunner, createTaskRunner, createWorkerKey, getBackgroundEligibleMethods, getMcpTaskMarker, getNextCronDate, isBackgroundEligibleMethod, isWorkerAlive, markBackgroundEligible, parseDelay, priorityToNumber, redactErrorForPersistence, redactErrorMessage, registerJobRetentionTasks, registerLiveWorker, requestMcpTaskInput, startRetentionSweeper, taskFromJob, unregisterJobRetentionTasks, unregisterLiveWorker, validateCronExpression, withBackgroundJobs };
|
|
1238
|
+
export { DEFAULT_JOB_RETENTION, DEFAULT_RETENTION_SWEEP_INTERVAL_MS, DEFAULT_TENANT_JOB_CAP, ForgeDelivery, ForgeDeliveryCollection, ForgeProjectionCheckpoint, ForgeProjectionRuntime, JOBS_RETENTION_TASK, JOB_EVENTS_RETENTION_TASK, JobBuilder, JobContextLogger, JobHandle, JobTimeoutError, MAX_JOB_RETRIES, MCP_TASKS_EXTENSION, McpTaskCancelledError, McpTaskNotFoundError, McpTaskStore, ScheduleRunner, SmrtJob, SmrtJobCollection, SmrtJobEvent, SmrtJobEventCollection, SmrtWorker, SmrtWorkerCollection, TaskRunner, TenantJobCapExceededError, assertWithinTenantCreationCap, backgroundEligible, clampRetries, createHmacDurableJobPayloadSigner, createMcpTaskResult, createScheduleRunner, createTaskRunner, createWorkerKey, getActiveJobExecutionContext, getBackgroundEligibleMethods, getMcpTaskMarker, getNextCronDate, isBackgroundEligibleMethod, isRunnerExecutionContext, isWorkerAlive, markBackgroundEligible, parseDelay, priorityToNumber, redactErrorForPersistence, redactErrorMessage, registerJobRetentionTasks, registerLiveWorker, requestMcpTaskInput, startRetentionSweeper, taskFromJob, unregisterJobRetentionTasks, unregisterLiveWorker, validateCronExpression, withBackgroundJobs };
|
|
1186
1239
|
|
|
1187
1240
|
//# sourceMappingURL=index.js.map
|