@ontemper/sdk 0.3.6 → 0.4.1

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/README.md CHANGED
@@ -169,6 +169,54 @@ const module = workflowModule.withPlatform(test.platform);
169
169
  Without `resources`, declarations read through the runtime API at `UNNBOUND_API_URL`, answered by the
170
170
  `fetch` option. `WorkflowPlatform.resources` replaces the reader outside tests.
171
171
 
172
+ ## SFTP
173
+
174
+ `@temper/workflow/sftp` connects for the life of an Effect scope. Closing the scope, including on the Run
175
+ deadline, closes the connection. Every connection needs the server's host-key pin; without a matching
176
+ pin the connection fails before any credential is sent.
177
+
178
+ ```ts
179
+ import { Sftp } from '@temper/workflow/sftp';
180
+ import { Config, Effect } from 'effect';
181
+
182
+ const copy = Effect.scoped(
183
+ Effect.gen(function* () {
184
+ const sftp = yield* Sftp;
185
+ const mailbox = yield* sftp.connect({
186
+ host: 'sftp.example.invalid',
187
+ username: 'acme',
188
+ password: yield* Config.Redacted('PARTNER_SFTP_PASSWORD'),
189
+ // `ssh-keyscan <host> | ssh-keygen -lf -`
190
+ hostKeyFingerprints: ['SHA256:<base64>'],
191
+ });
192
+ const data = yield* mailbox.get('/outbound/order.xml');
193
+ yield* mailbox.put(data, '/archive/order.xml');
194
+ }),
195
+ );
196
+ ```
197
+
198
+ Provide `Sftp.layer`. Each operation logs `SFTP <operation> started./completed./failed.` with the host and
199
+ path; `get` and `put` log a byte count, never the contents. `get`, `put`, `download`, and `upload` keep
200
+ 16 requests of 32 KiB in flight (`chunkBytes`, `concurrency`). `get` buffers at most 256 MiB
201
+ (`maxBufferBytes`); stream larger files with `download`. In tests, provide `memorySftp({ hosts }).layer` from
202
+ `@temper/workflow/sftp/testing` and pin its `fingerprint`.
203
+
204
+ ## EDI
205
+
206
+ `@temper/workflow/edi` calls the platform EDI service through the workflow `HttpClient` with the Run token.
207
+ `toX12` fills a missing ISA13 and GS06 from the platform control-number counter, then serializes.
208
+
209
+ ```ts
210
+ import { Edi } from '@temper/workflow/edi';
211
+
212
+ const x12 = yield* (yield* Edi).toX12(interchange);
213
+ ```
214
+
215
+ Provide `Edi.layer`. The service URL is `UNNBOUND_EDI_BASE_URL`; `UNNBOUND_EDI_API_KEY`, when set, replaces the
216
+ Run token. Lines such as `JSON to X12 completed.` carry the envelope (sender, receiver, counts), not the
217
+ document. A failure is an `EdiError` whose `reason` is `validation`, `unauthorized`, `service`,
218
+ `control_number`, or `configuration`, and whose `retryable` says whether the same call may succeed later.
219
+
172
220
  ## Versions
173
221
 
174
222
  CI publishes every version to npm as `@ontemper/sdk`; nobody publishes by hand. Workflow code keeps
@@ -182,8 +230,9 @@ npm install --save-exact @temper/workflow@npm:@ontemper/sdk@<version>
182
230
  A published version never changes. The workflow template and the examples pin one exact
183
231
  version; `pnpm sdk:pin` moves them all together.
184
232
 
185
- The package has three entry points: `@temper/workflow`, `@temper/workflow/testing`, and
186
- `@temper/workflow/contract`. `@temper/workflow/contract` holds the runtime Resources HttpApi and the
233
+ The package has six entry points: `@temper/workflow`, `@temper/workflow/testing`,
234
+ `@temper/workflow/contract`, `@temper/workflow/sftp`, `@temper/workflow/sftp/testing`, and
235
+ `@temper/workflow/edi`. Only `/sftp` loads `ssh2`. `@temper/workflow/contract` holds the runtime Resources HttpApi and the
187
236
  manifest, trigger, and invocation schemas that the platform imports. Workflow code rarely needs it.
188
237
 
189
238
  ## Develop and release
package/dist/Edi.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import { Context, Effect, Layer } from 'effect';
2
+ import { HttpClient } from 'effect/unstable/http';
3
+ import { type ControlNumberRequest } from './EdiControlNumbers.js';
4
+ import { EdiError } from './EdiError.js';
5
+ import type { OperationResult, X12Interchange } from './EdiModel.js';
6
+ import { Invocation } from './Invocation.js';
7
+ export type { ControlNumberCounter, ControlNumberRequest } from './EdiControlNumbers.js';
8
+ export { EdiError } from './EdiError.js';
9
+ export type { GE, GS, IEA, ISA, OperationDetail, OperationResult, TA1, X12Group, X12Interchange, X12Transaction, } from './EdiModel.js';
10
+ export interface ToX12Options {
11
+ /** Prefix of the control-number idempotency keys (`<prefix>:isa`, `<prefix>:gs:<group>`); default: this call's ordinal in the Run. */
12
+ readonly allocationKey?: string | undefined;
13
+ }
14
+ export interface EdiClient {
15
+ /** Stamps missing ISA13, GS06, and ST02 numbers from the platform counters, then serializes to X12 text. */
16
+ readonly toX12: (interchange: X12Interchange, options?: ToX12Options) => Effect.Effect<string, EdiError, Invocation>;
17
+ /** Parses X12 text into interchanges. */
18
+ readonly fromX12: (document: string | Uint8Array) => Effect.Effect<ReadonlyArray<X12Interchange>, EdiError, Invocation>;
19
+ /** The service's validation result; `Status` is `success`, `warning`, or `error`. */
20
+ readonly validateX12: (interchange: X12Interchange) => Effect.Effect<OperationResult, EdiError, Invocation>;
21
+ /** The 997/999 acknowledgment the service builds for the interchange. */
22
+ readonly acknowledgeX12: (interchange: X12Interchange) => Effect.Effect<ReadonlyArray<X12Interchange>, EdiError, Invocation>;
23
+ /** The next number of one platform counter, zero-padded to 9 digits. */
24
+ readonly nextControlNumber: (request: ControlNumberRequest) => Effect.Effect<string, EdiError, Invocation>;
25
+ }
26
+ declare const Edi_base: Context.ServiceClass<Edi, "@temper/workflow/Edi", EdiClient>;
27
+ /**
28
+ * First-party EDI on the workflow's `HttpClient`, logger, and Run token: `yield* Edi` in a handler layer and
29
+ * provide `Edi.layer`. The base URL and optional API key come from `UNNBOUND_EDI_BASE_URL` / `UNNBOUND_EDI_API_KEY`.
30
+ */
31
+ export declare class Edi extends Edi_base {
32
+ static readonly layer: Layer.Layer<Edi, never, HttpClient.HttpClient>;
33
+ }
34
+ //# sourceMappingURL=Edi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Edi.d.ts","sourceRoot":"","sources":["../src/Edi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,OAAO,EAAE,MAAM,EAAE,KAAK,EAAuC,MAAM,QAAQ,CAAC;AAC7F,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAkB,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EACV,EAAE,EACF,EAAE,EACF,GAAG,EACH,GAAG,EACH,eAAe,EACf,eAAe,EACf,GAAG,EACH,QAAQ,EACR,cAAc,EACd,cAAc,GACf,MAAM,eAAe,CAAC;AAIvB,MAAM,WAAW,YAAY;IAC3B,sIAAsI;IACtI,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,SAAS;IACxB,4GAA4G;IAC5G,QAAQ,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrH,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,CAChB,QAAQ,EAAE,MAAM,GAAG,UAAU,KAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxE,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5G,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,CACvB,WAAW,EAAE,cAAc,KACxB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxE,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;CAC5G;;AAqVD;;;GAGG;AACH,qBAAa,GAAI,SAAQ,QAAyD;IAChF,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,CAA8B;CACpG"}
package/dist/Edi.js ADDED
@@ -0,0 +1,244 @@
1
+ import { Config, Context, Effect, Layer, Option, Predicate, Redacted, Schema } from 'effect';
2
+ import { HttpClient, HttpClientRequest } from 'effect/unstable/http';
3
+ import { allocateControlNumber } from './EdiControlNumbers.js';
4
+ import { EdiError, isTransientStatus } from './EdiError.js';
5
+ import { Invocation } from './Invocation.js';
6
+ import { withSpanLines } from './LogContext.js';
7
+ import { registerSecrets } from './Redaction.js';
8
+ export { EdiError } from './EdiError.js';
9
+ /** The public EDINation cloud, used only with a customer `UNNBOUND_EDI_API_KEY` and no base URL. */
10
+ const EDINATION_BASE_URL = 'https://api.edination.com/v2';
11
+ const SUBSCRIPTION_KEY = 'Ocp-Apim-Subscription-Key';
12
+ const Settings = Config.all({
13
+ baseUrl: Config.option(Config.String('UNNBOUND_EDI_BASE_URL')),
14
+ apiKey: Config.option(Config.Redacted('UNNBOUND_EDI_API_KEY')),
15
+ apiUrl: Config.option(Config.String('UNNBOUND_API_URL')),
16
+ });
17
+ /** The Run token authenticates only to the platform's own EDI gateway, on the Temper API origin. */
18
+ const isPlatformGateway = (baseUrl, apiUrl) => Option.isSome(apiUrl) && URL.canParse(baseUrl) && URL.canParse(apiUrl.value)
19
+ ? new URL(baseUrl).origin === new URL(apiUrl.value).origin
20
+ : false;
21
+ const needsNumber = (value) => !value?.trim() || /^0+$/u.test(value.trim());
22
+ const ValidationDetails = Schema.Struct({ Details: Schema.Array(Schema.String) });
23
+ // The EDI service owns the segment model; the SDK checks the outer shape and passes segments through.
24
+ const Interchanges = Schema.Array(Schema.Any);
25
+ const ValidationResult = Schema.Struct({
26
+ Status: Schema.optional(Schema.NullOr(Schema.String)),
27
+ LastIndex: Schema.optional(Schema.Number),
28
+ Details: Schema.optional(Schema.NullOr(Schema.Array(Schema.Any))),
29
+ });
30
+ /** Only envelope identity reaches a log line: never the document, which carries partner data. */
31
+ const envelopeOf = (interchange) => ({
32
+ interchangeControlNumber: interchange.ISA.InterchangeControlNumber_13 ?? undefined,
33
+ senderId: interchange.ISA.InterchangeSenderID_6?.trim(),
34
+ receiverId: interchange.ISA.InterchangeReceiverID_8?.trim(),
35
+ groups: interchange.Groups.length,
36
+ transactions: interchange.Groups.reduce((count, group) => count + group.Transactions.length, 0),
37
+ });
38
+ const failureOf = (operation, response) => Effect.gen(function* () {
39
+ const status = response.status;
40
+ if (status === 401 || status === 403) {
41
+ return new EdiError({
42
+ operation,
43
+ reason: 'unauthorized',
44
+ retryable: false,
45
+ status,
46
+ message: 'The EDI service refused the credential (missing, expired, or invalid).',
47
+ });
48
+ }
49
+ const details = yield* response.json.pipe(Effect.flatMap(Schema.decodeUnknownEffect(ValidationDetails)), Effect.map((body) => body.Details), Effect.orElseSucceed(() => []));
50
+ return status === 400 && details.length > 0
51
+ ? new EdiError({
52
+ operation,
53
+ reason: 'validation',
54
+ retryable: false,
55
+ status,
56
+ details,
57
+ message: `EDI validation failed: ${details.join('; ')}`,
58
+ })
59
+ : new EdiError({
60
+ operation,
61
+ reason: 'service',
62
+ retryable: isTransientStatus(status),
63
+ status,
64
+ message: `The EDI service failed with HTTP ${status}.`,
65
+ });
66
+ });
67
+ const makeEdi = Effect.gen(function* () {
68
+ const client = yield* HttpClient.HttpClient;
69
+ // Allocation ordinals per Run attempt: deterministic for a sequential handler, so a re-dispatch reuses its numbers.
70
+ const ordinals = new WeakMap();
71
+ const endpoint = (operation, invocation) => Effect.gen(function* () {
72
+ const settings = yield* Settings.pipe(Effect.mapError((cause) => new EdiError({
73
+ operation,
74
+ reason: 'configuration',
75
+ retryable: false,
76
+ message: `EDI settings are unreadable: ${cause.message}`,
77
+ })));
78
+ const baseUrl = Option.filter(settings.baseUrl, (url) => url.length > 0);
79
+ const apiKey = Option.filter(settings.apiKey, (key) => Redacted.value(key).length > 0);
80
+ if (Option.isNone(baseUrl) && Option.isNone(apiKey)) {
81
+ return yield* new EdiError({
82
+ operation,
83
+ reason: 'configuration',
84
+ retryable: false,
85
+ message: 'EDI is not configured: set UNNBOUND_EDI_BASE_URL (platform service) or UNNBOUND_EDI_API_KEY (EDINation cloud).',
86
+ });
87
+ }
88
+ if (Option.isSome(apiKey))
89
+ yield* registerSecrets([Redacted.value(apiKey.value)]);
90
+ const url = Option.getOrElse(baseUrl, () => EDINATION_BASE_URL).replace(/\/+$/u, '');
91
+ // The Run token is a Temper credential: only the platform gateway gets it. The in-cluster EDI service
92
+ // ignores the header, and a workflow-chosen URL never sees the token.
93
+ const key = Option.isSome(apiKey)
94
+ ? Redacted.value(apiKey.value)
95
+ : invocation.token.length > 0 && isPlatformGateway(url, settings.apiUrl)
96
+ ? invocation.token
97
+ : 'self-hosted';
98
+ return { baseUrl: url, key };
99
+ });
100
+ const call = (operation, path, body) => Effect.gen(function* () {
101
+ const { baseUrl, key } = yield* endpoint(operation, yield* Invocation);
102
+ const response = yield* client
103
+ .execute(body(HttpClientRequest.post(`${baseUrl}${path}`).pipe(HttpClientRequest.setHeader(SUBSCRIPTION_KEY, key))))
104
+ .pipe(
105
+ // The document is partner data; the EDI span line below logs its envelope instead of the HTTP exchange.
106
+ Effect.provideService(HttpClient.TracerDisabledWhen, () => true), Effect.mapError((cause) => new EdiError({
107
+ operation,
108
+ reason: 'service',
109
+ retryable: true,
110
+ message: `The EDI service did not answer: ${cause.message}`,
111
+ cause,
112
+ })));
113
+ if (response.status < 200 || response.status >= 300)
114
+ return yield* Effect.flatMap(failureOf(operation, response), Effect.fail);
115
+ return response;
116
+ });
117
+ const readBody = (operation, read) => read.pipe(Effect.mapError((cause) => new EdiError({
118
+ operation,
119
+ reason: 'service',
120
+ retryable: true,
121
+ message: 'The EDI service answered an unreadable body.',
122
+ cause,
123
+ })));
124
+ const decodeBody = (operation, response, schema) => Effect.flatMap(readBody(operation, response.json), (json) => Schema.decodeUnknownEffect(schema)(json).pipe(Effect.mapError((cause) => new EdiError({
125
+ operation,
126
+ reason: 'service',
127
+ retryable: false,
128
+ message: 'The EDI service answered an unexpected body.',
129
+ cause,
130
+ }))));
131
+ const nextControlNumber = (request) => Effect.gen(function* () {
132
+ return yield* allocateControlNumber(client, yield* Invocation, request);
133
+ });
134
+ const stamp = (interchange, options) => Effect.gen(function* () {
135
+ const invocation = yield* Invocation;
136
+ const ordinal = ordinals.get(invocation) ?? 0;
137
+ ordinals.set(invocation, ordinal + 1);
138
+ const prefix = options.allocationKey ?? `x12:${ordinal}`;
139
+ const isa = interchange.ISA;
140
+ const senderKey = `${(isa.SenderIDQualifier_5 ?? '').trim()}:${(isa.InterchangeSenderID_6 ?? '').trim()}`;
141
+ const receiverKey = `${(isa.ReceiverIDQualifier_7 ?? '').trim()}:${(isa.InterchangeReceiverID_8 ?? '').trim()}`;
142
+ // Every number is allocated before the copy changes, so a failed allocation leaves nothing half-stamped.
143
+ const isa13 = needsNumber(isa.InterchangeControlNumber_13)
144
+ ? yield* nextControlNumber({ counterName: 'ISA13', senderKey, receiverKey, allocationKey: `${prefix}:isa` })
145
+ : undefined;
146
+ const gs06 = yield* Effect.forEach(interchange.Groups, (group, index) => needsNumber(group.GS.GroupControlNumber_6)
147
+ ? nextControlNumber({ counterName: 'GS06', senderKey, receiverKey, allocationKey: `${prefix}:gs:${index}` })
148
+ : Effect.succeed(undefined));
149
+ return stamped(interchange, isa13, gs06);
150
+ });
151
+ return {
152
+ toX12: (interchange, options = {}) => Effect.gen(function* () {
153
+ // A workflow that cannot reach EDI fails before it spends a control number.
154
+ yield* endpoint('toX12', yield* Invocation);
155
+ const ready = yield* stamp(interchange, options);
156
+ const response = yield* call('toX12', '/x12/write', HttpClientRequest.bodyJsonUnsafe(ready));
157
+ return yield* readBody('toX12', response.text);
158
+ }).pipe(edi('JSON to X12', 'toX12', () => envelopeOf(interchange), (x12) => ({ bytes: x12.length }))),
159
+ fromX12: (document) => Effect.gen(function* () {
160
+ const bytes = document instanceof Uint8Array ? document : new TextEncoder().encode(document);
161
+ const response = yield* call('fromX12', '/x12/read', HttpClientRequest.bodyUint8Array(bytes, 'application/octet-stream'));
162
+ return yield* decodeBody('fromX12', response, Interchanges);
163
+ }).pipe(edi('X12 to JSON', 'fromX12', () => ({ bytes: document instanceof Uint8Array ? document.byteLength : document.length }), (interchanges) => ({ interchanges: interchanges.length }))),
164
+ validateX12: (interchange) => Effect.gen(function* () {
165
+ const response = yield* call('validateX12', '/x12/validate', HttpClientRequest.bodyJsonUnsafe(interchange));
166
+ return yield* decodeBody('validateX12', response, ValidationResult);
167
+ }).pipe(edi('Validate X12', 'validateX12', () => envelopeOf(interchange), (result) => ({ status: result.Status ?? undefined }))),
168
+ acknowledgeX12: (interchange) => Effect.gen(function* () {
169
+ const response = yield* call('acknowledgeX12', '/x12/ack', HttpClientRequest.bodyJsonUnsafe(interchange));
170
+ return yield* decodeBody('acknowledgeX12', response, Interchanges);
171
+ }).pipe(edi('Acknowledge X12', 'acknowledgeX12', () => envelopeOf(interchange), (acknowledgments) => ({ interchanges: acknowledgments.length }))),
172
+ nextControlNumber,
173
+ };
174
+ });
175
+ /** `<name> started./completed./failed.` with `type: 'edi'` envelope fields, as legacy's EDI spans. */
176
+ const edi = (name, operation, input, output = () => ({})) => (effect) => effect.pipe(withSpanLines(name, (outcome) => {
177
+ const x12 = outcome?.result === undefined ? input() : { ...input(), ...output(outcome.result) };
178
+ return { type: 'edi', edi: { operation, type: 'x12', x12 } };
179
+ }), Effect.withSpan(name, { attributes: { 'edi.operation': operation } }));
180
+ /** A missing ST02 gets the next number unused in its group, from `0001`, as X12 requires one per transaction set. */
181
+ const segmentNumber = (transaction, segment) => {
182
+ const fields = Predicate.hasProperty(transaction, segment) ? transaction[segment] : undefined;
183
+ if (!Predicate.isObject(fields))
184
+ return undefined;
185
+ const value = Predicate.hasProperty(fields, 'TransactionSetControlNumber_02')
186
+ ? fields.TransactionSetControlNumber_02
187
+ : undefined;
188
+ return { fields, value: Predicate.isString(value) ? value : undefined };
189
+ };
190
+ const withTransactionNumber = (transaction, value) => {
191
+ const st = segmentNumber(transaction, 'ST');
192
+ if (st === undefined)
193
+ return transaction;
194
+ const se = segmentNumber(transaction, 'SE');
195
+ const numbered = { ...transaction, ST: { ...st.fields, TransactionSetControlNumber_02: value } };
196
+ return se === undefined ? numbered : { ...numbered, SE: { ...se.fields, TransactionSetControlNumber_02: value } };
197
+ };
198
+ const withTransactionNumbers = (transactions) => {
199
+ const used = new Set(transactions.flatMap((transaction) => {
200
+ const value = segmentNumber(transaction, 'ST')?.value;
201
+ return value === undefined || needsNumber(value) ? [] : [Number.parseInt(value, 10)];
202
+ }));
203
+ let next = 1;
204
+ return transactions.map((transaction) => {
205
+ const st = segmentNumber(transaction, 'ST');
206
+ if (st === undefined || !needsNumber(st.value))
207
+ return transaction;
208
+ while (used.has(next))
209
+ next++;
210
+ used.add(next);
211
+ return withTransactionNumber(transaction, String(next).padStart(4, '0'));
212
+ });
213
+ };
214
+ const stamped = (interchange, isa13, gs06) => ({
215
+ ...interchange,
216
+ ISA: isa13 === undefined ? interchange.ISA : { ...interchange.ISA, InterchangeControlNumber_13: isa13 },
217
+ IEATrailers: isa13 === undefined || !interchange.IEATrailers?.length
218
+ ? interchange.IEATrailers
219
+ : [{ ...interchange.IEATrailers[0], InterchangeControlNumber_2: isa13 }, ...interchange.IEATrailers.slice(1)],
220
+ Groups: interchange.Groups.map((group, index) => {
221
+ const value = gs06[index];
222
+ const numbered = value === undefined
223
+ ? group
224
+ : {
225
+ ...group,
226
+ GS: { ...group.GS, GroupControlNumber_6: value },
227
+ GETrailers: group.GETrailers?.length
228
+ ? [{ ...group.GETrailers[0], GroupControlNumber_2: value }, ...group.GETrailers.slice(1)]
229
+ : group.GETrailers,
230
+ };
231
+ return {
232
+ ...numbered,
233
+ Transactions: withTransactionNumbers(numbered.Transactions),
234
+ };
235
+ }),
236
+ });
237
+ /**
238
+ * First-party EDI on the workflow's `HttpClient`, logger, and Run token: `yield* Edi` in a handler layer and
239
+ * provide `Edi.layer`. The base URL and optional API key come from `UNNBOUND_EDI_BASE_URL` / `UNNBOUND_EDI_API_KEY`.
240
+ */
241
+ export class Edi extends Context.Service()('@temper/workflow/Edi') {
242
+ static layer = Layer.effect(Edi, makeEdi);
243
+ }
244
+ //# sourceMappingURL=Edi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Edi.js","sourceRoot":"","sources":["../src/Edi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Effect } from 'effect';
2
+ import { HttpClient } from 'effect/unstable/http';
3
+ import type { InvocationContext } from './Contract/Invocation.js';
4
+ import { EdiError } from './EdiError.js';
5
+ export type ControlNumberCounter = 'ISA13' | 'GS06';
6
+ export interface ControlNumberRequest {
7
+ readonly counterName: ControlNumberCounter;
8
+ /** Sender qualifier and ID, `ZZ:SENDER`. */
9
+ readonly senderKey: string;
10
+ /** Receiver qualifier and ID, `ZZ:RECEIVER`. */
11
+ readonly receiverKey: string;
12
+ /**
13
+ * Idempotency key within the Run: a retry or re-dispatch with the same key gets the same number.
14
+ * Sent only with a Run token; use a deterministic value such as `isa:0`.
15
+ */
16
+ readonly allocationKey?: string | undefined;
17
+ }
18
+ /**
19
+ * Allocates the next number from the platform counter for this Temper environment
20
+ * (`POST /api/v2/internal/edi/control-numbers/{environment}/increment`) with the Run token. The partner key
21
+ * keeps legacy's `<sender>:<receiver>` shape, so Firecracker and `k8s-pod` share one sequence.
22
+ */
23
+ export declare const allocateControlNumber: (client: HttpClient.HttpClient, invocation: InvocationContext, request: ControlNumberRequest) => Effect.Effect<string, EdiError>;
24
+ //# sourceMappingURL=EdiControlNumbers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdiControlNumbers.d.ts","sourceRoot":"","sources":["../src/EdiControlNumbers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAA4B,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAqBD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,WACxB,UAAU,CAAC,UAAU,cACjB,iBAAiB,WACpB,oBAAoB,KAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAqE7B,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { Config, Effect, Option, Redacted, Schema } from 'effect';
2
+ import { HttpClient, HttpClientRequest } from 'effect/unstable/http';
3
+ import { EdiError, isTransientStatus } from './EdiError.js';
4
+ const ENVIRONMENTS = ['sandbox', 'staging', 'production'];
5
+ const Allocated = Schema.Struct({ value: Schema.Finite });
6
+ const nonEmpty = (value) => Option.filter(value, (text) => text.length > 0);
7
+ // An empty variable is set, not missing; it must not shadow the next token source.
8
+ const present = (token) => Option.filter(token, (value) => Redacted.value(value).length > 0);
9
+ const Settings = Config.all({
10
+ apiUrl: Config.option(Config.String('UNNBOUND_API_URL')),
11
+ environment: Config.option(Config.String('TEMPER_ENVIRONMENT')),
12
+ legacyEnvironment: Config.option(Config.String('UNNBOUND_ENVIRONMENT')),
13
+ // Hosts other than Firecracker pass no Run token; their workflow token is in the environment.
14
+ envToken: Config.option(Config.Redacted('TEMPER_RUN_TOKEN')),
15
+ sandboxToken: Config.option(Config.Redacted('UNNBOUND_SANDBOX_JWT')),
16
+ });
17
+ const fail = (message, retryable, status, cause) => new EdiError({ operation: 'controlNumber', reason: 'control_number', retryable, status, message, cause });
18
+ /**
19
+ * Allocates the next number from the platform counter for this Temper environment
20
+ * (`POST /api/v2/internal/edi/control-numbers/{environment}/increment`) with the Run token. The partner key
21
+ * keeps legacy's `<sender>:<receiver>` shape, so Firecracker and `k8s-pod` share one sequence.
22
+ */
23
+ export const allocateControlNumber = (client, invocation, request) => Effect.gen(function* () {
24
+ const settings = yield* Settings.pipe(Effect.mapError((cause) => fail(`Control-number settings are unreadable: ${cause.message}`, false)));
25
+ const apiUrl = nonEmpty(settings.apiUrl);
26
+ if (Option.isNone(apiUrl))
27
+ return yield* fail('UNNBOUND_API_URL is not set; the control-number service is unreachable.', false);
28
+ const environment = Option.getOrUndefined(Option.orElse(nonEmpty(settings.environment), () => nonEmpty(settings.legacyEnvironment)));
29
+ if (!ENVIRONMENTS.some((known) => known === environment)) {
30
+ return yield* fail('TEMPER_ENVIRONMENT must be sandbox, staging, or production to route control numbers.', false);
31
+ }
32
+ const runToken = invocation.token.length > 0;
33
+ const token = runToken
34
+ ? Option.some(invocation.token)
35
+ : Option.orElse(present(settings.envToken), () => present(settings.sandboxToken));
36
+ const url = `${apiUrl.value.replace(/\/+$/u, '')}/api/v2/internal/edi/control-numbers/${environment}/increment`;
37
+ const key = { tradingPartnerKey: `${request.senderKey}:${request.receiverKey}`, counterName: request.counterName };
38
+ // Only a Run token scopes an idempotency key; the server refuses one with any other credential.
39
+ const body = runToken && request.allocationKey !== undefined ? { ...key, allocationKey: request.allocationKey } : key;
40
+ const response = yield* client
41
+ .execute(HttpClientRequest.post(url).pipe((outgoing) => (Option.isSome(token) ? HttpClientRequest.bearerToken(outgoing, token.value) : outgoing), HttpClientRequest.bodyJsonUnsafe(body)))
42
+ .pipe(
43
+ // Legacy allocated outside its HTTP tracer; the EDI span line that needs the number reports the outcome.
44
+ Effect.provideService(HttpClient.TracerDisabledWhen, () => true), Effect.mapError((cause) => fail(`The control-number service did not answer: ${cause.message}`, true, undefined, cause)));
45
+ if (response.status === 404)
46
+ return yield* fail('The Temper API does not serve environment-scoped EDI control numbers.', false, 404);
47
+ if (response.status === 400) {
48
+ return yield* fail("Invalid control-number request: use counter 'ISA13' or 'GS06' with trading partner IDs.", false, 400);
49
+ }
50
+ if (response.status === 401 || response.status === 403) {
51
+ return yield* new EdiError({
52
+ operation: 'controlNumber',
53
+ reason: 'unauthorized',
54
+ retryable: false,
55
+ status: response.status,
56
+ message: 'The control-number service refused the Run token.',
57
+ });
58
+ }
59
+ if (response.status < 200 || response.status >= 300) {
60
+ return yield* fail(`The control-number service failed with HTTP ${response.status}.`, isTransientStatus(response.status), response.status);
61
+ }
62
+ const allocated = yield* response.json.pipe(Effect.flatMap(Schema.decodeUnknownEffect(Allocated)), Effect.mapError((cause) => fail('The control-number service answered without a numeric value.', true, response.status, cause)));
63
+ return String(allocated.value).padStart(9, '0');
64
+ });
65
+ //# sourceMappingURL=EdiControlNumbers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdiControlNumbers.js","sourceRoot":"","sources":["../src/EdiControlNumbers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Schema } from 'effect';
2
+ declare const EdiError_base: Schema.Class<EdiError, Schema.TaggedStruct<"EdiError", {
3
+ readonly operation: Schema.String;
4
+ readonly reason: Schema.Literals<readonly ["configuration", "unauthorized", "validation", "service", "control_number"]>;
5
+ readonly retryable: Schema.Boolean;
6
+ readonly status: Schema.optional<Schema.Number>;
7
+ readonly details: Schema.optional<Schema.$Array<Schema.String>>;
8
+ readonly message: Schema.String;
9
+ readonly cause: Schema.optional<Schema.Defect>;
10
+ }>, import("effect/Cause").YieldableError>;
11
+ /**
12
+ * An EDI call failed. `validation`: the service rejected the document (`details` lists why); `unauthorized`:
13
+ * the credential was refused; `service` and `control_number`: the service failed, and `retryable` says whether
14
+ * the same call may succeed later; `configuration`: the workflow environment cannot reach EDI.
15
+ */
16
+ export declare class EdiError extends EdiError_base {
17
+ }
18
+ /** No answer yet on the request's outcome, throttling, or a server fault: the same call may succeed later. */
19
+ export declare const isTransientStatus: (status: number) => boolean;
20
+ export {};
21
+ //# sourceMappingURL=EdiError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdiError.d.ts","sourceRoot":"","sources":["../src/EdiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;;;;;AAEhC;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,aAQ5B;CAAG;AAEL,8GAA8G;AAC9G,eAAO,MAAM,iBAAiB,WAAY,MAAM,KAAG,OACkB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Schema } from 'effect';
2
+ /**
3
+ * An EDI call failed. `validation`: the service rejected the document (`details` lists why); `unauthorized`:
4
+ * the credential was refused; `service` and `control_number`: the service failed, and `retryable` says whether
5
+ * the same call may succeed later; `configuration`: the workflow environment cannot reach EDI.
6
+ */
7
+ export class EdiError extends Schema.TaggedError()('EdiError', {
8
+ operation: Schema.String,
9
+ reason: Schema.Literals(['configuration', 'unauthorized', 'validation', 'service', 'control_number']),
10
+ retryable: Schema.Boolean,
11
+ status: Schema.optional(Schema.Number),
12
+ details: Schema.optional(Schema.Array(Schema.String)),
13
+ message: Schema.String,
14
+ cause: Schema.optional(Schema.Defect()),
15
+ }) {
16
+ }
17
+ /** No answer yet on the request's outcome, throttling, or a server fault: the same call may succeed later. */
18
+ export const isTransientStatus = (status) => status === 408 || status === 425 || status === 429 || status >= 500;
19
+ //# sourceMappingURL=EdiError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdiError.js","sourceRoot":"","sources":["../src/EdiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;GAIG;AACH,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,WAAW,EAAY,CAAC,UAAU,EAAE;IACvE,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACrG,SAAS,EAAE,MAAM,CAAC,OAAO;IACzB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;CACxC,CAAC;CAAG;AAEL,8GAA8G;AAC9G,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAW,EAAE,CAC3D,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC"}
@@ -0,0 +1,83 @@
1
+ type Element = string | null;
2
+ export interface ISA {
3
+ readonly AuthorizationInformationQualifier_1?: Element;
4
+ readonly AuthorizationInformation_2?: Element;
5
+ readonly SecurityInformationQualifier_3?: Element;
6
+ readonly SecurityInformation_4?: Element;
7
+ readonly SenderIDQualifier_5?: Element;
8
+ readonly InterchangeSenderID_6?: Element;
9
+ readonly ReceiverIDQualifier_7?: Element;
10
+ readonly InterchangeReceiverID_8?: Element;
11
+ readonly InterchangeDate_9?: Element;
12
+ readonly InterchangeTime_10?: Element;
13
+ readonly InterchangeControlStandardsIdentifier_11?: Element;
14
+ readonly InterchangeControlVersionNumber_12?: Element;
15
+ readonly InterchangeControlNumber_13?: Element;
16
+ readonly AcknowledgementRequested_14?: Element;
17
+ readonly UsageIndicator_15?: Element;
18
+ readonly ComponentElementSeparator_16?: Element;
19
+ }
20
+ export interface TA1 {
21
+ readonly InterchangeControlNumber_1?: Element;
22
+ readonly InterchangeDate_2?: Element;
23
+ readonly InterchangeTime_3?: Element;
24
+ readonly InterchangeAcknowledgmentCode_4?: Element;
25
+ readonly InterchangeNoteCode_5?: Element;
26
+ }
27
+ export interface GS {
28
+ readonly CodeIdentifyingInformationType_1?: Element;
29
+ readonly SenderIDCode_2?: Element;
30
+ readonly ReceiverIDCode_3?: Element;
31
+ readonly Date_4?: Element;
32
+ readonly Time_5?: Element;
33
+ readonly GroupControlNumber_6?: Element;
34
+ readonly TransactionTypeCode_7?: Element;
35
+ readonly VersionAndRelease_8?: Element;
36
+ }
37
+ export interface GE {
38
+ readonly NumberOfIncludedSets_1?: Element;
39
+ readonly GroupControlNumber_2?: Element;
40
+ }
41
+ export interface IEA {
42
+ readonly NumberOfIncludedGroups_1?: Element;
43
+ readonly InterchangeControlNumber_2?: Element;
44
+ }
45
+ /** One transaction set (`ST` … `SE`) in the workflow's own model, such as an EdiNation 214 or 315. */
46
+ export type X12Transaction = object;
47
+ export interface X12Group {
48
+ readonly GS: GS;
49
+ readonly Transactions: ReadonlyArray<X12Transaction>;
50
+ readonly GETrailers?: ReadonlyArray<GE> | null;
51
+ }
52
+ export interface OperationDetail {
53
+ readonly Index?: number;
54
+ readonly TransactionIndex?: number;
55
+ readonly TransactionRef?: Element;
56
+ readonly SpecRef?: Element;
57
+ readonly SegmentId?: Element;
58
+ readonly DataElementId?: Element;
59
+ readonly DataElementIndex?: number;
60
+ readonly CompositeIndex?: number;
61
+ readonly RepIndex?: number;
62
+ readonly Value?: Element;
63
+ readonly Message?: Element;
64
+ readonly Status?: Element;
65
+ }
66
+ /** The service's verdict on a document: `Status` is `success`, `warning`, or `error`. */
67
+ export interface OperationResult {
68
+ readonly LastIndex?: number;
69
+ readonly Details?: ReadonlyArray<OperationDetail> | null;
70
+ readonly Status?: Element;
71
+ }
72
+ export interface X12Interchange {
73
+ readonly SegmentDelimiter: string;
74
+ readonly DataElementDelimiter: string;
75
+ readonly ISA: ISA;
76
+ readonly TA1?: TA1;
77
+ readonly Groups: ReadonlyArray<X12Group>;
78
+ readonly IEATrailers?: ReadonlyArray<IEA> | null;
79
+ /** Set by `fromX12` when the service reports on the parsed interchange. */
80
+ readonly Result?: OperationResult;
81
+ }
82
+ export {};
83
+ //# sourceMappingURL=EdiModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdiModel.d.ts","sourceRoot":"","sources":["../src/EdiModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EdiModel.js.map