effect-jobs 0.1.0-alpha.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 (157) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +22 -0
  3. package/README.md +142 -0
  4. package/dist/Job.d.ts +33 -0
  5. package/dist/Job.d.ts.map +1 -0
  6. package/dist/Job.js +66 -0
  7. package/dist/Job.js.map +1 -0
  8. package/dist/JobConsumer.d.ts +34 -0
  9. package/dist/JobConsumer.d.ts.map +1 -0
  10. package/dist/JobConsumer.js +28 -0
  11. package/dist/JobConsumer.js.map +1 -0
  12. package/dist/JobContract.d.ts +128 -0
  13. package/dist/JobContract.d.ts.map +1 -0
  14. package/dist/JobContract.js +15 -0
  15. package/dist/JobContract.js.map +1 -0
  16. package/dist/JobFailure.d.ts +51 -0
  17. package/dist/JobFailure.d.ts.map +1 -0
  18. package/dist/JobFailure.js +34 -0
  19. package/dist/JobFailure.js.map +1 -0
  20. package/dist/JobId.d.ts +5 -0
  21. package/dist/JobId.d.ts.map +1 -0
  22. package/dist/JobId.js +4 -0
  23. package/dist/JobId.js.map +1 -0
  24. package/dist/JobIdentity.d.ts +54 -0
  25. package/dist/JobIdentity.d.ts.map +1 -0
  26. package/dist/JobIdentity.js +82 -0
  27. package/dist/JobIdentity.js.map +1 -0
  28. package/dist/JobLifecycle.d.ts +173 -0
  29. package/dist/JobLifecycle.d.ts.map +1 -0
  30. package/dist/JobLifecycle.js +234 -0
  31. package/dist/JobLifecycle.js.map +1 -0
  32. package/dist/JobPayload.d.ts +18 -0
  33. package/dist/JobPayload.d.ts.map +1 -0
  34. package/dist/JobPayload.js +10 -0
  35. package/dist/JobPayload.js.map +1 -0
  36. package/dist/JobPayloadCodec.d.ts +14 -0
  37. package/dist/JobPayloadCodec.d.ts.map +1 -0
  38. package/dist/JobPayloadCodec.js +78 -0
  39. package/dist/JobPayloadCodec.js.map +1 -0
  40. package/dist/JobPolicy.d.ts +50 -0
  41. package/dist/JobPolicy.d.ts.map +1 -0
  42. package/dist/JobPolicy.js +85 -0
  43. package/dist/JobPolicy.js.map +1 -0
  44. package/dist/JobProducer.d.ts +14 -0
  45. package/dist/JobProducer.d.ts.map +1 -0
  46. package/dist/JobProducer.js +23 -0
  47. package/dist/JobProducer.js.map +1 -0
  48. package/dist/JobQueue.d.ts +16 -0
  49. package/dist/JobQueue.d.ts.map +1 -0
  50. package/dist/JobQueue.js +16 -0
  51. package/dist/JobQueue.js.map +1 -0
  52. package/dist/JobRegistry.d.ts +37 -0
  53. package/dist/JobRegistry.d.ts.map +1 -0
  54. package/dist/JobRegistry.js +47 -0
  55. package/dist/JobRegistry.js.map +1 -0
  56. package/dist/JobStore.d.ts +348 -0
  57. package/dist/JobStore.d.ts.map +1 -0
  58. package/dist/JobStore.js +19 -0
  59. package/dist/JobStore.js.map +1 -0
  60. package/dist/JobTelemetry.d.ts +7 -0
  61. package/dist/JobTelemetry.d.ts.map +1 -0
  62. package/dist/JobTelemetry.js +61 -0
  63. package/dist/JobTelemetry.js.map +1 -0
  64. package/dist/JobTransaction.d.ts +24 -0
  65. package/dist/JobTransaction.d.ts.map +1 -0
  66. package/dist/JobTransaction.js +7 -0
  67. package/dist/JobTransaction.js.map +1 -0
  68. package/dist/JobWorker.d.ts +24 -0
  69. package/dist/JobWorker.d.ts.map +1 -0
  70. package/dist/JobWorker.js +155 -0
  71. package/dist/JobWorker.js.map +1 -0
  72. package/dist/JobWorkerRuntime.d.ts +18 -0
  73. package/dist/JobWorkerRuntime.d.ts.map +1 -0
  74. package/dist/JobWorkerRuntime.js +5 -0
  75. package/dist/JobWorkerRuntime.js.map +1 -0
  76. package/dist/PollingJobWorker.d.ts +9 -0
  77. package/dist/PollingJobWorker.d.ts.map +1 -0
  78. package/dist/PollingJobWorker.js +54 -0
  79. package/dist/PollingJobWorker.js.map +1 -0
  80. package/dist/PostgreSqlDrizzleSchema.d.ts +432 -0
  81. package/dist/PostgreSqlDrizzleSchema.d.ts.map +1 -0
  82. package/dist/PostgreSqlDrizzleSchema.js +72 -0
  83. package/dist/PostgreSqlDrizzleSchema.js.map +1 -0
  84. package/dist/PostgreSqlJobs.d.ts +25 -0
  85. package/dist/PostgreSqlJobs.d.ts.map +1 -0
  86. package/dist/PostgreSqlJobs.js +38 -0
  87. package/dist/PostgreSqlJobs.js.map +1 -0
  88. package/dist/PostgreSqlSchema.d.ts +30 -0
  89. package/dist/PostgreSqlSchema.d.ts.map +1 -0
  90. package/dist/PostgreSqlSchema.js +63 -0
  91. package/dist/PostgreSqlSchema.js.map +1 -0
  92. package/dist/PostgreSqlTransaction.d.ts +42 -0
  93. package/dist/PostgreSqlTransaction.d.ts.map +1 -0
  94. package/dist/PostgreSqlTransaction.js +9 -0
  95. package/dist/PostgreSqlTransaction.js.map +1 -0
  96. package/dist/index.d.ts +7 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +7 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/internal/JobTransaction.d.ts +16 -0
  101. package/dist/internal/JobTransaction.d.ts.map +1 -0
  102. package/dist/internal/JobTransaction.js +21 -0
  103. package/dist/internal/JobTransaction.js.map +1 -0
  104. package/dist/internal/codec/CanonicalJson.d.ts +9 -0
  105. package/dist/internal/codec/CanonicalJson.d.ts.map +1 -0
  106. package/dist/internal/codec/CanonicalJson.js +184 -0
  107. package/dist/internal/codec/CanonicalJson.js.map +1 -0
  108. package/dist/internal/codec/ProtectedProjection.d.ts +12 -0
  109. package/dist/internal/codec/ProtectedProjection.d.ts.map +1 -0
  110. package/dist/internal/codec/ProtectedProjection.js +121 -0
  111. package/dist/internal/codec/ProtectedProjection.js.map +1 -0
  112. package/dist/internal/lifecycle/Artifacts.d.ts +6 -0
  113. package/dist/internal/lifecycle/Artifacts.d.ts.map +1 -0
  114. package/dist/internal/lifecycle/Artifacts.js +49 -0
  115. package/dist/internal/lifecycle/Artifacts.js.map +1 -0
  116. package/dist/internal/lifecycle/Reconciliation.d.ts +82 -0
  117. package/dist/internal/lifecycle/Reconciliation.d.ts.map +1 -0
  118. package/dist/internal/lifecycle/Reconciliation.js +98 -0
  119. package/dist/internal/lifecycle/Reconciliation.js.map +1 -0
  120. package/dist/internal/postgresql/Producer.d.ts +14 -0
  121. package/dist/internal/postgresql/Producer.d.ts.map +1 -0
  122. package/dist/internal/postgresql/Producer.js +55 -0
  123. package/dist/internal/postgresql/Producer.js.map +1 -0
  124. package/dist/internal/postgresql/Readiness.d.ts +5 -0
  125. package/dist/internal/postgresql/Readiness.d.ts.map +1 -0
  126. package/dist/internal/postgresql/Readiness.js +53 -0
  127. package/dist/internal/postgresql/Readiness.js.map +1 -0
  128. package/dist/internal/postgresql/Rows.d.ts +45 -0
  129. package/dist/internal/postgresql/Rows.d.ts.map +1 -0
  130. package/dist/internal/postgresql/Rows.js +75 -0
  131. package/dist/internal/postgresql/Rows.js.map +1 -0
  132. package/dist/internal/postgresql/Store.d.ts +5 -0
  133. package/dist/internal/postgresql/Store.d.ts.map +1 -0
  134. package/dist/internal/postgresql/Store.js +211 -0
  135. package/dist/internal/postgresql/Store.js.map +1 -0
  136. package/dist/internal/worker/Capability.d.ts +106 -0
  137. package/dist/internal/worker/Capability.d.ts.map +1 -0
  138. package/dist/internal/worker/Capability.js +11 -0
  139. package/dist/internal/worker/Capability.js.map +1 -0
  140. package/dist/internal/worker/Drain.d.ts +22 -0
  141. package/dist/internal/worker/Drain.d.ts.map +1 -0
  142. package/dist/internal/worker/Drain.js +59 -0
  143. package/dist/internal/worker/Drain.js.map +1 -0
  144. package/dist/internal/worker/Execution.d.ts +7 -0
  145. package/dist/internal/worker/Execution.d.ts.map +1 -0
  146. package/dist/internal/worker/Execution.js +125 -0
  147. package/dist/internal/worker/Execution.js.map +1 -0
  148. package/dist/internal/worker/Results.d.ts +108 -0
  149. package/dist/internal/worker/Results.d.ts.map +1 -0
  150. package/dist/internal/worker/Results.js +3 -0
  151. package/dist/internal/worker/Results.js.map +1 -0
  152. package/package.json +169 -0
  153. package/specs/architecture-decisions.md +841 -0
  154. package/specs/core-contract.md +323 -0
  155. package/specs/drizzle-compatibility.md +167 -0
  156. package/specs/postgresql-backend.md +291 -0
  157. package/specs/release-qualification.md +107 -0
@@ -0,0 +1,63 @@
1
+ import { Data } from "effect";
2
+ import { createHash } from "node:crypto";
3
+ export class PostgreSqlConfigurationError extends Data.TaggedError("PostgreSqlConfigurationError") {
4
+ }
5
+ const identifier = (value, field) => {
6
+ if (!/^[a-z_][a-z0-9_]{0,62}$/.test(value)) {
7
+ throw new PostgreSqlConfigurationError({ field });
8
+ }
9
+ return value;
10
+ };
11
+ /** Configuration only; no database access. Names are PostgreSQL identifiers, not SQL. */
12
+ export const tables = (options = {}) => {
13
+ const schema = identifier(options.schema ?? "public", "schema");
14
+ const jobsTable = identifier(options.jobsTable ?? "jobs", "jobsTable");
15
+ const payloadsTable = identifier(options.payloadsTable ?? "job_payloads", "payloadsTable");
16
+ if (jobsTable === payloadsTable) {
17
+ throw new PostgreSqlConfigurationError({ field: "payloadsTable" });
18
+ }
19
+ return Object.freeze({ schema, jobsTable, payloadsTable });
20
+ };
21
+ /** Quote only validated names; never interpolate producer/catalog values. */
22
+ export const relations = (mapping) => {
23
+ const checked = tables(mapping);
24
+ return {
25
+ jobs: `"${checked.schema}"."${checked.jobsTable}"`,
26
+ payloads: `"${checked.schema}"."${checked.payloadsTable}"`
27
+ };
28
+ };
29
+ /** Schema-wide index names remain bounded without truncating away table identity. */
30
+ export const indexPrefix = (mapping) => `${mapping.jobsTable.slice(0, 32)}_${createHash("sha256").update(mapping.jobsTable).digest("hex").slice(0, 16)}`;
31
+ /** Application migration input. Runtime never invokes this DDL. Schema must already exist. */
32
+ export const migration = (mapping = tables()) => {
33
+ const { jobs, payloads } = relations(mapping);
34
+ // Index names are table-local derivatives bounded below PostgreSQL's 63-byte limit.
35
+ const prefix = indexPrefix(mapping);
36
+ return `CREATE TABLE ${jobs} (
37
+ id text PRIMARY KEY,
38
+ operation text NOT NULL, operation_id text NOT NULL, slot text NOT NULL,
39
+ queue text NOT NULL, kind text NOT NULL, version integer NOT NULL,
40
+ policy jsonb NOT NULL, initial_available_at bigint,
41
+ state text NOT NULL CHECK (state IN ('Pending','Active','RetryScheduled','Completed','Dead','Isolated')),
42
+ available_at bigint NOT NULL, updated_at bigint NOT NULL,
43
+ attempts_made bigint NOT NULL DEFAULT 0 CHECK (attempts_made >= 0),
44
+ stalled_count bigint NOT NULL DEFAULT 0 CHECK (stalled_count >= 0),
45
+ lifecycle_version bigint NOT NULL DEFAULT 0 CHECK (lifecycle_version >= 0),
46
+ lease_token text, lease_expires_at bigint, completed_at bigint, last_failure_code text, cleanup_at bigint,
47
+ UNIQUE (operation, operation_id, slot), UNIQUE (lease_token),
48
+ CHECK ((state = 'Active') = (lease_token IS NOT NULL AND lease_expires_at IS NOT NULL)),
49
+ CHECK (state = 'Active' OR (lease_token IS NULL AND lease_expires_at IS NULL)),
50
+ CHECK ((state IN ('Completed','Dead')) = (completed_at IS NOT NULL))
51
+ );
52
+ CREATE TABLE ${payloads} (
53
+ job_id text PRIMARY KEY REFERENCES ${jobs}(id) ON DELETE CASCADE,
54
+ format_version integer NOT NULL,
55
+ payload bytea NOT NULL CHECK (octet_length(payload) BETWEEN 1 AND 65536),
56
+ projection bytea NOT NULL CHECK (octet_length(projection) BETWEEN 1 AND 65536)
57
+ );
58
+ CREATE INDEX "${prefix}_due" ON ${jobs} (queue, kind, version, available_at, id)
59
+ WHERE state IN ('Pending','RetryScheduled');
60
+ CREATE INDEX "${prefix}_expired" ON ${jobs} (lease_expires_at, id) WHERE state = 'Active';
61
+ CREATE INDEX "${prefix}_terminal" ON ${jobs} (cleanup_at, id) WHERE state IN ('Completed','Dead');`;
62
+ };
63
+ //# sourceMappingURL=PostgreSqlSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlSchema.js","sourceRoot":"","sources":["../src/PostgreSqlSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,OAAO,4BAA6B,SAAQ,IAAI,CAAC,WAAW,CAChE,8BAA8B,CAO9B;CAAG;AAWL,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,KAA+C,EAAE,EAAE;IACpF,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,4BAA4B,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AACD,yFAAyF;AACzF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,GAAiB,EAAE,EAAU,EAAE;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,WAAW,CAAC,CAAA;IACtE,MAAM,aAAa,GAAG,UAAU,CAC9B,OAAO,CAAC,aAAa,IAAI,cAAc,EACvC,eAAe,CAChB,CAAA;IACD,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;QAChC,MAAM,IAAI,4BAA4B,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;AAC5D,CAAC,CAAA;AACD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAE;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO;QACL,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,SAAS,GAAG;QAClD,QAAQ,EAAE,IAAI,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,aAAa,GAAG;KAC3D,CAAA;AACH,CAAC,CAAA;AACD,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAU,EAAE,CACrD,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;AAClH,8FAA8F;AAC9F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAO,GAAW,MAAM,EAAE,EAAU,EAAE;IAC9D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7C,oFAAoF;IACpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACnC,OAAO,gBAAgB,IAAI;;;;;;;;;;;;;;;;eAgBd,QAAQ;uCACgB,IAAI;;;;;gBAK3B,MAAM,YAAY,IAAI;;gBAEtB,MAAM,gBAAgB,IAAI;gBAC1B,MAAM,iBAAiB,IAAI,wDAAwD,CAAA;AACnG,CAAC,CAAA"}
@@ -0,0 +1,42 @@
1
+ import { Context } from "effect";
2
+ import type { Effect } from "effect";
3
+ declare const PostgreSqlFailure_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
4
+ readonly _tag: "PostgreSqlFailure";
5
+ } & Readonly<A>;
6
+ /** Sanitized adapter failure. Never attach SQL, parameters or provider Causes. */
7
+ export declare class PostgreSqlFailure extends PostgreSqlFailure_base<{
8
+ readonly commitKnowledge: "NotCommitted" | "Unknown";
9
+ }> {
10
+ }
11
+ declare const PostgreSqlInvalidHandle_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
12
+ readonly _tag: "PostgreSqlInvalidHandle";
13
+ } & Readonly<A>;
14
+ export declare class PostgreSqlInvalidHandle extends PostgreSqlInvalidHandle_base<{
15
+ readonly reason: "foreign-source" | "unqualified-handle" | "inactive-handle" | "active-transaction";
16
+ }> {
17
+ }
18
+ export type PostgreSqlError = PostgreSqlFailure | PostgreSqlInvalidHandle;
19
+ /** Only the owning adapter supplies this exact-connection query capability. */
20
+ export interface TransactionQuery {
21
+ readonly query: (text: string, values?: ReadonlyArray<unknown>) => Effect.Effect<ReadonlyArray<Record<string, unknown>>, PostgreSqlError>;
22
+ }
23
+ /**
24
+ * Explicit trusted extension contract, NOT a structural SQL-client constructor.
25
+ * validate must prove private registration, source identity and active invocation.
26
+ * withTransaction delegates join-or-establish to the application's manager.
27
+ * ownedTransaction must reject ambient transactions, commit before returning, and
28
+ * report uncertain COMMIT/response delivery as Unknown. No automatic replay.
29
+ * A COMMIT command tag of ROLLBACK is a NotCommitted failure, not success.
30
+ * All acquisition/query/control/release paths must have finite application bounds.
31
+ * The application owns rollback, pool lifetime, readiness and migrations.
32
+ */
33
+ export interface ApplicationAdapter {
34
+ readonly validate: (handle: unknown) => Effect.Effect<TransactionQuery, PostgreSqlError>;
35
+ readonly withTransaction: <A, E, R>(body: (handle: unknown) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | PostgreSqlError, R>;
36
+ readonly ownedTransaction: <A, E, R>(body: (query: TransactionQuery) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | PostgreSqlError, R>;
37
+ }
38
+ declare const PostgreSqlApplication_base: Context.ServiceClass<PostgreSqlApplication, "effect-jobs/PostgreSqlApplication", ApplicationAdapter>;
39
+ export declare class PostgreSqlApplication extends PostgreSqlApplication_base {
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=PostgreSqlTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlTransaction.d.ts","sourceRoot":"","sources":["../src/PostgreSqlTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,QAAQ,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;;;;AAEpC,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,eAAe,EAAE,cAAc,GAAG,SAAS,CAAA;CACrD,CAAC;CAAG;;;;AACL,qBAAa,uBAAwB,SAAQ,6BAA4C;IACvF,QAAQ,CAAC,MAAM,EACX,gBAAgB,GAChB,oBAAoB,GACpB,iBAAiB,GACjB,oBAAoB,CAAA;CACzB,CAAC;CAAG;AACL,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG,uBAAuB,CAAA;AAEzE,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;CAC5E;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAA;IACxF,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,CAAC,CAAA;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACjC,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACtD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,CAAC,CAAA;CAC9C;;AACD,qBAAa,qBAAsB,SAAQ,0BAGH;CAAG"}
@@ -0,0 +1,9 @@
1
+ import { Context, Data } from "effect";
2
+ /** Sanitized adapter failure. Never attach SQL, parameters or provider Causes. */
3
+ export class PostgreSqlFailure extends Data.TaggedError("PostgreSqlFailure") {
4
+ }
5
+ export class PostgreSqlInvalidHandle extends Data.TaggedError("PostgreSqlInvalidHandle") {
6
+ }
7
+ export class PostgreSqlApplication extends Context.Service()("effect-jobs/PostgreSqlApplication") {
8
+ }
9
+ //# sourceMappingURL=PostgreSqlTransaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlTransaction.js","sourceRoot":"","sources":["../src/PostgreSqlTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAGtC,kFAAkF;AAClF,MAAM,OAAO,iBAAkB,SAAQ,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAEzE;CAAG;AACL,MAAM,OAAO,uBAAwB,SAAQ,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAMrF;CAAG;AA8BL,MAAM,OAAO,qBAAsB,SAAQ,OAAO,CAAC,OAAO,EAGvD,CAAC,mCAAmC,CAAC;CAAG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * effect-jobs package entrypoint.
3
+ * Use focused JobId/JobIdentity/JobPolicy/JobFailure/JobContract/JobTransaction
4
+ * subpaths. The root intentionally does not load an all-modules barrel.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * effect-jobs package entrypoint.
3
+ * Use focused JobId/JobIdentity/JobPolicy/JobFailure/JobContract/JobTransaction
4
+ * subpaths. The root intentionally does not load an all-modules barrel.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { Effect } from "effect";
2
+ import type { EnqueueResult, JobIntegrityConflict, PreparedJob } from "../JobContract.js";
3
+ import { JobsTransactionClosed, type JobsTransaction } from "../JobTransaction.js";
4
+ /** Internal-only: never a package subpath or root export. */
5
+ export declare const JobsTransactionTypeId: unique symbol;
6
+ /** Qualified bridges call this only within the application's active transaction. */
7
+ export declare const withJoinedTransaction: <A, E, R, BackendError, BackendRequirements>(insertOrCompare: (prepared: PreparedJob) => Effect.Effect<EnqueueResult, BackendError | JobIntegrityConflict, BackendRequirements>, body: (transaction: JobsTransaction<BackendError, BackendRequirements>) => Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
8
+ /** Only the definition/producer implementation calls this; no ambient store. */
9
+ export declare const insertPrepared: <E, R>(transaction: JobsTransaction<E, R>, prepared: PreparedJob) => Effect.Effect<{
10
+ readonly _tag: "AlreadyPresent";
11
+ readonly jobId: import("../JobId.js").JobId;
12
+ } | {
13
+ readonly _tag: "Inserted";
14
+ readonly jobId: import("../JobId.js").JobId;
15
+ }, E | JobIntegrityConflict | JobsTransactionClosed, R>;
16
+ //# sourceMappingURL=JobTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobTransaction.d.ts","sourceRoot":"","sources":["../../src/internal/JobTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACzF,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAElF,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,EAAE,OAAO,MAA8C,CAAA;AAEzF,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,mBAAmB,mBAC7D,CACf,QAAQ,EAAE,WAAW,KAClB,MAAM,CAAC,MAAM,CAChB,aAAa,EACb,YAAY,GAAG,oBAAoB,EACnC,mBAAmB,CACpB,QACK,CACJ,WAAW,EAAE,eAAe,CAAC,YAAY,EAAE,mBAAmB,CAAC,KAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CA0BrB,CAAA;AAEH,gFAAgF;AAChF,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,eACpB,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,YACxB,WAAW;;;;;;uDAC0C,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { Effect } from "effect";
2
+ import { JobsTransactionClosed } from "../JobTransaction.js";
3
+ /** Internal-only: never a package subpath or root export. */
4
+ export const JobsTransactionTypeId = Symbol("effect-jobs/JobsTransaction");
5
+ /** Qualified bridges call this only within the application's active transaction. */
6
+ export const withJoinedTransaction = (insertOrCompare, body) => Effect.acquireUseRelease(Effect.sync(() => {
7
+ const lifetime = { active: true };
8
+ const transaction = Object.freeze({
9
+ [JobsTransactionTypeId]: Object.freeze({
10
+ insertOrCompare: (prepared) => Effect.suspend(() => lifetime.active
11
+ ? insertOrCompare(prepared)
12
+ : Effect.fail(new JobsTransactionClosed({ reason: "callback-exited" })))
13
+ })
14
+ });
15
+ return { lifetime, transaction };
16
+ }), ({ transaction }) => Effect.suspend(() => body(transaction)).pipe(Effect.scoped), ({ lifetime }) => Effect.sync(() => {
17
+ lifetime.active = false;
18
+ }));
19
+ /** Only the definition/producer implementation calls this; no ambient store. */
20
+ export const insertPrepared = (transaction, prepared) => transaction[JobsTransactionTypeId].insertOrCompare(prepared);
21
+ //# sourceMappingURL=JobTransaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobTransaction.js","sourceRoot":"","sources":["../../src/internal/JobTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAA;AAElF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAkB,MAAM,CAAC,6BAA6B,CAAC,CAAA;AAEzF,oFAAoF;AACpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,eAMC,EACD,IAE2B,EACH,EAAE,CAC1B,MAAM,CAAC,iBAAiB,CACtB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACjC,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,CAAC;QACZ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;YACrC,eAAe,EAAE,CAAC,QAAqB,EAAE,EAAE,CACzC,MAAM,CAAC,OAAO,CAIZ,GAAG,EAAE,CACL,QAAQ,CAAC,MAAM;gBACb,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC;gBAC3B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAC1E;SACJ,CAAC;KACH,CAAC,CAAA;IACJ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;AAClC,CAAC,CAAC,EACF,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAChF,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CACf,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAA;AACzB,CAAC,CAAC,CACL,CAAA;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,WAAkC,EAClC,QAAqB,EACrB,EAAE,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { Effect } from "effect";
2
+ import { JobPayloadCodecError } from "../../JobContract.js";
3
+ export declare const canonicalText: (value: unknown, maximum: number, reason: "payload-too-large" | "projection-too-large", rootDepth?: number) => string;
4
+ export declare const canonicalBytes: (value: unknown, maximum: number, reason: "payload-too-large" | "projection-too-large", rootDepth?: number) => Effect.Effect<Uint8Array<ArrayBuffer>, JobPayloadCodecError, never>;
5
+ export declare const bytesEqual: (left: Uint8Array, right: Uint8Array) => boolean;
6
+ /** Detect cycles/depth before Schema traverses plain decoded containers, without
7
+ * coercing domain objects (dates, etc.) whose encoded side is validated later. */
8
+ export declare const checkDecodedContainers: (value: unknown) => Effect.Effect<void, JobPayloadCodecError, never>;
9
+ //# sourceMappingURL=CanonicalJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanonicalJson.d.ts","sourceRoot":"","sources":["../../../src/internal/codec/CanonicalJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,oBAAoB,EAA0B,MAAM,sBAAsB,CAAA;AAenF,eAAO,MAAM,aAAa,UACjB,OAAO,WACL,MAAM,UACP,mBAAmB,GAAG,sBAAsB,yBAEnD,MAsGF,CAAA;AAED,eAAO,MAAM,cAAc,UAClB,OAAO,WACL,MAAM,UACP,mBAAmB,GAAG,sBAAsB,4FAelD,CAAA;AAEJ,eAAO,MAAM,UAAU,SAAU,UAAU,SAAS,UAAU,KAAG,OACmB,CAAA;AAEpF;kFACkF;AAClF,eAAO,MAAM,sBAAsB,UAAW,OAAO,qDA2DjD,CAAA"}
@@ -0,0 +1,184 @@
1
+ import { Effect } from "effect";
2
+ import { JobPayloadCodecError, maximumJobPayloadDepth } from "../../JobContract.js";
3
+ const encoder = new TextEncoder();
4
+ const validScalars = (value) => {
5
+ for (const scalar of value) {
6
+ const code = scalar.codePointAt(0);
7
+ if (code >= 0xd800 && code <= 0xdfff) {
8
+ return false;
9
+ }
10
+ }
11
+ return true;
12
+ };
13
+ // Serialization is a synchronous JS boundary. Only bounded operation-owned
14
+ // errors escape it; accessors/toJSON and arbitrary object coercion are forbidden.
15
+ export const canonicalText = (value, maximum, reason, rootDepth = 0) => {
16
+ const seen = new Set();
17
+ let length = 0;
18
+ const emit = (text) => {
19
+ length += encoder.encode(text).byteLength;
20
+ if (length > maximum) {
21
+ throw new JobPayloadCodecError({ reason });
22
+ }
23
+ return text;
24
+ };
25
+ const quote = (text) => {
26
+ if (text.length > maximum) {
27
+ throw new JobPayloadCodecError({ reason });
28
+ }
29
+ if (!validScalars(text)) {
30
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
31
+ }
32
+ return emit(JSON.stringify(text));
33
+ };
34
+ const visit = (item, depth) => {
35
+ if (depth > maximumJobPayloadDepth) {
36
+ throw new JobPayloadCodecError({ reason: "payload-too-deep" });
37
+ }
38
+ if (item === null) {
39
+ return emit("null");
40
+ }
41
+ switch (typeof item) {
42
+ case "boolean":
43
+ return emit(JSON.stringify(item));
44
+ case "string":
45
+ return quote(item);
46
+ case "number":
47
+ if (Number.isFinite(item)) {
48
+ return emit(JSON.stringify(item));
49
+ }
50
+ break;
51
+ case "object": {
52
+ if (seen.has(item)) {
53
+ break;
54
+ }
55
+ const array = Array.isArray(item);
56
+ if (!array &&
57
+ Object.getPrototypeOf(item) !== Object.prototype &&
58
+ Object.getPrototypeOf(item) !== null) {
59
+ break;
60
+ }
61
+ seen.add(item);
62
+ const descriptors = Object.getOwnPropertyDescriptors(item);
63
+ const keys = Reflect.ownKeys(descriptors);
64
+ for (const key of keys) {
65
+ if (array && key === "length") {
66
+ continue;
67
+ }
68
+ const descriptor = descriptors[key];
69
+ if (typeof key !== "string" ||
70
+ !validScalars(key) ||
71
+ !descriptor.enumerable ||
72
+ !("value" in descriptor)) {
73
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
74
+ }
75
+ }
76
+ let text;
77
+ if (array) {
78
+ emit("[]");
79
+ if (keys.length !== item.length + 1) {
80
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
81
+ }
82
+ const entries = [];
83
+ for (let index = 0; index < item.length; index++) {
84
+ if (index > 0) {
85
+ emit(",");
86
+ }
87
+ const descriptor = descriptors[String(index)];
88
+ if (descriptor === undefined) {
89
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
90
+ }
91
+ entries.push(visit(descriptor.value, depth + 1));
92
+ }
93
+ text = `[${entries.join(",")}]`;
94
+ }
95
+ else {
96
+ emit("{}");
97
+ text = `{${keys
98
+ .sort()
99
+ .map((key, index) => {
100
+ if (index > 0) {
101
+ emit(",");
102
+ }
103
+ return `${quote(key)}${emit(":")}${visit(descriptors[key].value, depth + 1)}`;
104
+ })
105
+ .join(",")}}`;
106
+ }
107
+ seen.delete(item);
108
+ return text;
109
+ }
110
+ }
111
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
112
+ };
113
+ return visit(value, rootDepth);
114
+ };
115
+ export const canonicalBytes = (value, maximum, reason, rootDepth = 0) => Effect.try({
116
+ try: () => {
117
+ const bytes = encoder.encode(canonicalText(value, maximum, reason, rootDepth));
118
+ if (bytes.byteLength > maximum) {
119
+ throw new JobPayloadCodecError({ reason });
120
+ }
121
+ return bytes;
122
+ },
123
+ catch: (error) => error instanceof JobPayloadCodecError
124
+ ? error
125
+ : new JobPayloadCodecError({ reason: "invalid-json-value" })
126
+ });
127
+ export const bytesEqual = (left, right) => left.length === right.length && left.every((byte, index) => byte === right[index]);
128
+ /** Detect cycles/depth before Schema traverses plain decoded containers, without
129
+ * coercing domain objects (dates, etc.) whose encoded side is validated later. */
130
+ export const checkDecodedContainers = (value) => Effect.try({
131
+ try: () => {
132
+ const seen = new Set();
133
+ const visit = (item, depth) => {
134
+ if (depth > maximumJobPayloadDepth) {
135
+ throw new JobPayloadCodecError({ reason: "payload-too-deep" });
136
+ }
137
+ if (typeof item === "number" && !Number.isFinite(item)) {
138
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
139
+ }
140
+ if (item === null || typeof item !== "object") {
141
+ return;
142
+ }
143
+ if (!Array.isArray(item) &&
144
+ Object.getPrototypeOf(item) !== Object.prototype &&
145
+ Object.getPrototypeOf(item) !== null) {
146
+ return;
147
+ }
148
+ if (seen.has(item)) {
149
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
150
+ }
151
+ seen.add(item);
152
+ const descriptors = Object.getOwnPropertyDescriptors(item);
153
+ if (Array.isArray(item)) {
154
+ if (Reflect.ownKeys(descriptors).length !== item.length + 1) {
155
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
156
+ }
157
+ for (let index = 0; index < item.length; index++) {
158
+ if (!Object.hasOwn(descriptors, String(index))) {
159
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
160
+ }
161
+ }
162
+ }
163
+ for (const key of Reflect.ownKeys(descriptors)) {
164
+ if (Array.isArray(item) && key === "length") {
165
+ continue;
166
+ }
167
+ const descriptor = descriptors[key];
168
+ if (typeof key !== "string" ||
169
+ !validScalars(key) ||
170
+ !descriptor.enumerable ||
171
+ !("value" in descriptor)) {
172
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
173
+ }
174
+ visit(descriptor.value, depth + 1);
175
+ }
176
+ seen.delete(item);
177
+ };
178
+ visit(value, 0);
179
+ },
180
+ catch: (error) => error instanceof JobPayloadCodecError
181
+ ? error
182
+ : new JobPayloadCodecError({ reason: "invalid-json-value" })
183
+ });
184
+ //# sourceMappingURL=CanonicalJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanonicalJson.js","sourceRoot":"","sources":["../../../src/internal/codec/CanonicalJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Effect, Schema, SchemaAST } from "effect";
2
+ import { JobPayloadCodecError } from "../../JobContract.js";
3
+ /** No traversal may silently lose a marker across a transformation/custom shape.
4
+ * Scalar/domain transforms without protected mappings use their encoded AST. */
5
+ export declare const prepareProjection: (schema: Schema.Top) => Effect.Effect<SchemaAST.AST, JobPayloadCodecError, never>;
6
+ export declare const project: (ast: SchemaAST.AST, value: unknown) => Effect.Effect<{
7
+ data: unknown;
8
+ protected: {
9
+ [k: string]: unknown;
10
+ };
11
+ }, JobPayloadCodecError, never>;
12
+ //# sourceMappingURL=ProtectedProjection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtectedProjection.d.ts","sourceRoot":"","sources":["../../../src/internal/codec/ProtectedProjection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClD,OAAO,EACL,oBAAoB,EAGrB,MAAM,sBAAsB,CAAA;AAM7B;gFACgF;AAChF,eAAO,MAAM,iBAAiB,WAAY,MAAM,CAAC,GAAG,8DAkDhD,CAAA;AAEJ,eAAO,MAAM,OAAO,QAAS,SAAS,CAAC,GAAG,SAAS,OAAO;;;;;+BAuFtD,CAAA"}
@@ -0,0 +1,121 @@
1
+ import { Effect, Schema, SchemaAST } from "effect";
2
+ import { JobPayloadCodecError, maximumJobPayloadSchemaPathBytes, maximumProtectedJobPayloadSubtrees } from "../../JobContract.js";
3
+ const marked = (ast) => ast.annotations?.effectJobsProtectedPayload === true;
4
+ const encoder = new TextEncoder();
5
+ /** No traversal may silently lose a marker across a transformation/custom shape.
6
+ * Scalar/domain transforms without protected mappings use their encoded AST. */
7
+ export const prepareProjection = (schema) => Effect.try({
8
+ try: () => {
9
+ const visit = (ast, transformed, protectedParent, ancestors) => {
10
+ if (ancestors.has(ast) || SchemaAST.isSuspend(ast)) {
11
+ throw new JobPayloadCodecError({ reason: "invalid-schema" });
12
+ }
13
+ const boundary = transformed || ast.encoding !== undefined;
14
+ const protectedHere = marked(ast);
15
+ if (protectedHere && (boundary || protectedParent)) {
16
+ throw new JobPayloadCodecError({ reason: "invalid-schema" });
17
+ }
18
+ ancestors.add(ast);
19
+ const child = (node) => visit(node, boundary, protectedParent || protectedHere, ancestors);
20
+ if (SchemaAST.isObjects(ast)) {
21
+ if (ast.indexSignatures.length > 0 ||
22
+ ast.propertySignatures.some((property) => typeof property.name !== "string")) {
23
+ throw new JobPayloadCodecError({ reason: "invalid-schema" });
24
+ }
25
+ ast.propertySignatures.forEach((property) => child(property.type));
26
+ }
27
+ else if (SchemaAST.isArrays(ast)) {
28
+ if (ast.elements.length !== 0 || ast.rest.length !== 1) {
29
+ throw new JobPayloadCodecError({ reason: "invalid-schema" });
30
+ }
31
+ ast.rest.forEach(child);
32
+ }
33
+ else if (SchemaAST.isUnion(ast)) {
34
+ ast.types.forEach(child);
35
+ }
36
+ else if (SchemaAST.isDeclaration(ast)) {
37
+ if (ast.encoding === undefined) {
38
+ throw new JobPayloadCodecError({ reason: "invalid-schema" });
39
+ }
40
+ ast.typeParameters.forEach(child);
41
+ }
42
+ ast.encoding?.forEach((link) => child(link.to));
43
+ ancestors.delete(ast);
44
+ };
45
+ visit(schema.ast, false, false, new Set());
46
+ const encoded = SchemaAST.toEncoded(schema.ast);
47
+ visit(encoded, false, false, new Set());
48
+ return encoded;
49
+ },
50
+ catch: () => new JobPayloadCodecError({ reason: "invalid-schema" })
51
+ });
52
+ export const project = (ast, value) => Effect.try({
53
+ try: () => {
54
+ let count = 0;
55
+ const protectedFields = [];
56
+ const visit = (node, item, path) => {
57
+ if (encoder.encode(path).byteLength > maximumJobPayloadSchemaPathBytes) {
58
+ throw new JobPayloadCodecError({ reason: "schema-path-too-long" });
59
+ }
60
+ if (marked(node)) {
61
+ if (++count > maximumProtectedJobPayloadSubtrees) {
62
+ throw new JobPayloadCodecError({ reason: "too-many-protected-subtrees" });
63
+ }
64
+ if (item === null ||
65
+ typeof item !== "object" ||
66
+ Array.isArray(item) ||
67
+ !Object.hasOwn(item, "fingerprint")) {
68
+ throw new JobPayloadCodecError({ reason: "invalid-protected-value" });
69
+ }
70
+ const fingerprint = Object.getOwnPropertyDescriptor(item, "fingerprint");
71
+ if ((Object.getPrototypeOf(item) !== Object.prototype &&
72
+ Object.getPrototypeOf(item) !== null) ||
73
+ !fingerprint.enumerable ||
74
+ !("value" in fingerprint)) {
75
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
76
+ }
77
+ protectedFields.push([path, fingerprint.value]);
78
+ return null;
79
+ }
80
+ if (SchemaAST.isUnion(node)) {
81
+ const branch = node.types.find((member) => Schema.decodeUnknownExit(Schema.make(member), {
82
+ onExcessProperty: "error"
83
+ })(item)._tag === "Success");
84
+ if (branch === undefined) {
85
+ throw new JobPayloadCodecError({ reason: "invalid-schema" });
86
+ }
87
+ return visit(branch, item, path);
88
+ }
89
+ if (SchemaAST.isArrays(node) && Array.isArray(item)) {
90
+ return item.map((entry, index) => visit(node.rest[0], entry, `${path}/${index}`));
91
+ }
92
+ if (SchemaAST.isObjects(node) && item !== null && typeof item === "object") {
93
+ if (Object.getPrototypeOf(item) !== Object.prototype &&
94
+ Object.getPrototypeOf(item) !== null) {
95
+ throw new JobPayloadCodecError({ reason: "invalid-json-value" });
96
+ }
97
+ // Keep every validated property, including the empty Struct case. Never
98
+ // create an accidental equivalence by dropping unknown JSON properties.
99
+ return Object.fromEntries(Object.entries(item).map(([key, entry]) => {
100
+ const property = node.propertySignatures.find((field) => field.name === key);
101
+ return [
102
+ key,
103
+ property === undefined
104
+ ? entry
105
+ : visit(property.type, entry, `${path}/${key.replaceAll("~", "~0").replaceAll("/", "~1")}`)
106
+ ];
107
+ }));
108
+ }
109
+ return item;
110
+ };
111
+ // Application JSON is always inside data, never interpreted as metadata.
112
+ // null placeholders preserve positions; the separate path map distinguishes
113
+ // protected nodes from public nulls, including inside Schema.Unknown.
114
+ const data = visit(ast, value, "");
115
+ return { data, protected: Object.fromEntries(protectedFields) };
116
+ },
117
+ catch: (error) => error instanceof JobPayloadCodecError
118
+ ? error
119
+ : new JobPayloadCodecError({ reason: "invalid-schema" })
120
+ });
121
+ //# sourceMappingURL=ProtectedProjection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtectedProjection.js","sourceRoot":"","sources":["../../../src/internal/codec/ProtectedProjection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Result } from "effect";
2
+ import * as Contract from "../../JobContract.js";
3
+ import { JobStoreProtocolError, type ClaimedJob } from "../../JobStore.js";
4
+ /** Validates portable structure only. Codec must still validate canonical bytes/schema/projection before execution. */
5
+ export declare const validateClaimArtifact: (claim: ClaimedJob) => Result.Result<Contract.PreparedJob, JobStoreProtocolError>;
6
+ //# sourceMappingURL=Artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Artifacts.d.ts","sourceRoot":"","sources":["../../../src/internal/lifecycle/Artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAIhD,OAAO,EAAE,qBAAqB,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAmB1E,uHAAuH;AACvH,eAAO,MAAM,qBAAqB,UACzB,UAAU,KAChB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAyCxD,CAAA"}