@ontemper/sdk 0.3.6 → 0.4.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.
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, Schema } 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 { 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, 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<Schema.Json, EdiError, Invocation>;
21
+ /** The 997/999 acknowledgment the service builds for the interchange. */
22
+ readonly acknowledgeX12: (interchange: X12Interchange) => Effect.Effect<Schema.Json, 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,EAA+B,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7F,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,eAAe,CAAC;AACpE,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,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIrG,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,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxG,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,CAAC,WAAW,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC3G,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;CAC5G;;AA6RD;;;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,208 @@
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 } 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
+ });
16
+ const needsNumber = (value) => !value?.trim() || /^0+$/u.test(value.trim());
17
+ const ValidationDetails = Schema.Struct({ Details: Schema.Array(Schema.String) });
18
+ /** Only envelope identity reaches a log line: never the document, which carries partner data. */
19
+ const envelopeOf = (interchange) => ({
20
+ interchangeControlNumber: interchange.ISA.InterchangeControlNumber_13 ?? undefined,
21
+ senderId: interchange.ISA.InterchangeSenderID_6?.trim(),
22
+ receiverId: interchange.ISA.InterchangeReceiverID_8?.trim(),
23
+ groups: interchange.Groups.length,
24
+ transactions: interchange.Groups.reduce((count, group) => count + group.Transactions.length, 0),
25
+ });
26
+ const failureOf = (operation, response) => Effect.gen(function* () {
27
+ const status = response.status;
28
+ if (status === 401 || status === 403) {
29
+ return new EdiError({
30
+ operation,
31
+ reason: 'unauthorized',
32
+ retryable: false,
33
+ status,
34
+ message: 'The EDI service refused the credential (missing, expired, or invalid).',
35
+ });
36
+ }
37
+ const details = yield* response.json.pipe(Effect.flatMap(Schema.decodeUnknownEffect(ValidationDetails)), Effect.map((body) => body.Details), Effect.orElseSucceed(() => []));
38
+ return status === 400 && details.length > 0
39
+ ? new EdiError({
40
+ operation,
41
+ reason: 'validation',
42
+ retryable: false,
43
+ status,
44
+ details,
45
+ message: `EDI validation failed: ${details.join('; ')}`,
46
+ })
47
+ : new EdiError({
48
+ operation,
49
+ reason: 'service',
50
+ retryable: true,
51
+ status,
52
+ message: `The EDI service failed with HTTP ${status}.`,
53
+ });
54
+ });
55
+ const makeEdi = Effect.gen(function* () {
56
+ const client = yield* HttpClient.HttpClient;
57
+ // Allocation ordinals per Run attempt: deterministic for a sequential handler, so a re-dispatch reuses its numbers.
58
+ const ordinals = new WeakMap();
59
+ const endpoint = (operation, invocation) => Effect.gen(function* () {
60
+ const settings = yield* Settings.pipe(Effect.mapError((cause) => new EdiError({
61
+ operation,
62
+ reason: 'configuration',
63
+ retryable: false,
64
+ message: `EDI settings are unreadable: ${cause.message}`,
65
+ })));
66
+ const baseUrl = Option.filter(settings.baseUrl, (url) => url.length > 0);
67
+ const apiKey = Option.filter(settings.apiKey, (key) => Redacted.value(key).length > 0);
68
+ if (Option.isNone(baseUrl) && Option.isNone(apiKey)) {
69
+ return yield* new EdiError({
70
+ operation,
71
+ reason: 'configuration',
72
+ retryable: false,
73
+ message: 'EDI is not configured: set UNNBOUND_EDI_BASE_URL (platform service) or UNNBOUND_EDI_API_KEY (EDINation cloud).',
74
+ });
75
+ }
76
+ if (Option.isSome(apiKey))
77
+ yield* registerSecrets([Redacted.value(apiKey.value)]);
78
+ // The Run token is a Temper credential: it goes only to a platform base URL, never to the public cloud.
79
+ const key = Option.isSome(apiKey)
80
+ ? Redacted.value(apiKey.value)
81
+ : invocation.token.length > 0
82
+ ? invocation.token
83
+ : 'self-hosted';
84
+ return { baseUrl: Option.getOrElse(baseUrl, () => EDINATION_BASE_URL).replace(/\/+$/u, ''), key };
85
+ });
86
+ const call = (operation, path, body) => Effect.gen(function* () {
87
+ const { baseUrl, key } = yield* endpoint(operation, yield* Invocation);
88
+ const response = yield* client
89
+ .execute(body(HttpClientRequest.post(`${baseUrl}${path}`).pipe(HttpClientRequest.setHeader(SUBSCRIPTION_KEY, key))))
90
+ .pipe(
91
+ // The document is partner data; the EDI span line below logs its envelope instead of the HTTP exchange.
92
+ Effect.provideService(HttpClient.TracerDisabledWhen, () => true), Effect.mapError((cause) => new EdiError({
93
+ operation,
94
+ reason: 'service',
95
+ retryable: true,
96
+ message: `The EDI service did not answer: ${cause.message}`,
97
+ cause,
98
+ })));
99
+ if (response.status < 200 || response.status >= 300)
100
+ return yield* Effect.flatMap(failureOf(operation, response), Effect.fail);
101
+ return response;
102
+ });
103
+ const readBody = (operation, read) => read.pipe(Effect.mapError((cause) => new EdiError({
104
+ operation,
105
+ reason: 'service',
106
+ retryable: true,
107
+ message: 'The EDI service answered an unreadable body.',
108
+ cause,
109
+ })));
110
+ const nextControlNumber = (request) => Effect.gen(function* () {
111
+ return yield* allocateControlNumber(client, yield* Invocation, request);
112
+ });
113
+ const stamp = (interchange, options) => Effect.gen(function* () {
114
+ const invocation = yield* Invocation;
115
+ const ordinal = ordinals.get(invocation) ?? 0;
116
+ ordinals.set(invocation, ordinal + 1);
117
+ const prefix = options.allocationKey ?? `x12:${ordinal}`;
118
+ const isa = interchange.ISA;
119
+ const senderKey = `${(isa.SenderIDQualifier_5 ?? '').trim()}:${(isa.InterchangeSenderID_6 ?? '').trim()}`;
120
+ const receiverKey = `${(isa.ReceiverIDQualifier_7 ?? '').trim()}:${(isa.InterchangeReceiverID_8 ?? '').trim()}`;
121
+ // Every number is allocated before the copy changes, so a failed allocation leaves nothing half-stamped.
122
+ const isa13 = needsNumber(isa.InterchangeControlNumber_13)
123
+ ? yield* nextControlNumber({ counterName: 'ISA13', senderKey, receiverKey, allocationKey: `${prefix}:isa` })
124
+ : undefined;
125
+ const gs06 = yield* Effect.forEach(interchange.Groups, (group, index) => needsNumber(group.GS.GroupControlNumber_6)
126
+ ? nextControlNumber({ counterName: 'GS06', senderKey, receiverKey, allocationKey: `${prefix}:gs:${index}` })
127
+ : Effect.succeed(undefined));
128
+ return stamped(interchange, isa13, gs06);
129
+ });
130
+ return {
131
+ toX12: (interchange, options = {}) => Effect.gen(function* () {
132
+ // A workflow that cannot reach EDI fails before it spends a control number.
133
+ yield* endpoint('toX12', yield* Invocation);
134
+ const ready = yield* stamp(interchange, options);
135
+ const response = yield* call('toX12', '/x12/write', HttpClientRequest.bodyJsonUnsafe(ready));
136
+ return yield* readBody('toX12', response.text);
137
+ }).pipe(edi('JSON to X12', 'toX12', () => envelopeOf(interchange), (x12) => ({ bytes: x12.length }))),
138
+ fromX12: (document) => Effect.gen(function* () {
139
+ const bytes = document instanceof Uint8Array ? document : new TextEncoder().encode(document);
140
+ const response = yield* call('fromX12', '/x12/read', HttpClientRequest.bodyUint8Array(bytes, 'application/octet-stream'));
141
+ const json = yield* readBody('fromX12', response.json);
142
+ return yield* Schema.decodeUnknownEffect(Schema.Array(Schema.Any))(json).pipe(Effect.map((interchanges) => interchanges), Effect.mapError((cause) => new EdiError({
143
+ operation: 'fromX12',
144
+ reason: 'service',
145
+ retryable: false,
146
+ message: 'The EDI service answered no interchange list.',
147
+ cause,
148
+ })));
149
+ }).pipe(edi('X12 to JSON', 'fromX12', () => ({ bytes: document instanceof Uint8Array ? document.byteLength : document.length }), (interchanges) => ({ interchanges: interchanges.length }))),
150
+ validateX12: (interchange) => Effect.flatMap(call('validateX12', '/x12/validate', HttpClientRequest.bodyJsonUnsafe(interchange)), (response) => readBody('validateX12', response.json)).pipe(edi('Validate X12', 'validateX12', () => envelopeOf(interchange))),
151
+ acknowledgeX12: (interchange) => Effect.flatMap(call('acknowledgeX12', '/x12/ack', HttpClientRequest.bodyJsonUnsafe(interchange)), (response) => readBody('acknowledgeX12', response.json)).pipe(edi('Acknowledge X12', 'acknowledgeX12', () => envelopeOf(interchange))),
152
+ nextControlNumber,
153
+ };
154
+ });
155
+ /** `<name> started./completed./failed.` with `type: 'edi'` envelope fields, as legacy's EDI spans. */
156
+ const edi = (name, operation, input, output = () => ({})) => (effect) => effect.pipe(withSpanLines(name, (outcome) => {
157
+ const x12 = outcome?.result === undefined ? input() : { ...input(), ...output(outcome.result) };
158
+ return { type: 'edi', edi: { operation, type: 'x12', x12 } };
159
+ }), Effect.withSpan(name, { attributes: { 'edi.operation': operation } }));
160
+ /** ST02 and SE02 become `0001` when missing: every interchange opens a fresh group, as in legacy. */
161
+ const segmentNumber = (transaction, segment) => {
162
+ const fields = Predicate.hasProperty(transaction, segment) ? transaction[segment] : undefined;
163
+ if (!Predicate.isObject(fields))
164
+ return undefined;
165
+ const value = Predicate.hasProperty(fields, 'TransactionSetControlNumber_02')
166
+ ? fields.TransactionSetControlNumber_02
167
+ : undefined;
168
+ return { fields, value: Predicate.isString(value) ? value : undefined };
169
+ };
170
+ const withTransactionNumber = (transaction) => {
171
+ const st = segmentNumber(transaction, 'ST');
172
+ if (st === undefined || !needsNumber(st.value))
173
+ return transaction;
174
+ const se = segmentNumber(transaction, 'SE');
175
+ const numbered = { ...transaction, ST: { ...st.fields, TransactionSetControlNumber_02: '0001' } };
176
+ return se === undefined ? numbered : { ...numbered, SE: { ...se.fields, TransactionSetControlNumber_02: '0001' } };
177
+ };
178
+ const stamped = (interchange, isa13, gs06) => ({
179
+ ...interchange,
180
+ ISA: isa13 === undefined ? interchange.ISA : { ...interchange.ISA, InterchangeControlNumber_13: isa13 },
181
+ IEATrailers: isa13 === undefined || !interchange.IEATrailers?.length
182
+ ? interchange.IEATrailers
183
+ : [{ ...interchange.IEATrailers[0], InterchangeControlNumber_2: isa13 }, ...interchange.IEATrailers.slice(1)],
184
+ Groups: interchange.Groups.map((group, index) => {
185
+ const value = gs06[index];
186
+ const numbered = value === undefined
187
+ ? group
188
+ : {
189
+ ...group,
190
+ GS: { ...group.GS, GroupControlNumber_6: value },
191
+ GETrailers: group.GETrailers?.length
192
+ ? [{ ...group.GETrailers[0], GroupControlNumber_2: value }, ...group.GETrailers.slice(1)]
193
+ : group.GETrailers,
194
+ };
195
+ return {
196
+ ...numbered,
197
+ Transactions: numbered.Transactions.map(withTransactionNumber),
198
+ };
199
+ }),
200
+ });
201
+ /**
202
+ * First-party EDI on the workflow's `HttpClient`, logger, and Run token: `yield* Edi` in a handler layer and
203
+ * provide `Edi.layer`. The base URL and optional API key come from `UNNBOUND_EDI_BASE_URL` / `UNNBOUND_EDI_API_KEY`.
204
+ */
205
+ export class Edi extends Context.Service()('@temper/workflow/Edi') {
206
+ static layer = Layer.effect(Edi, makeEdi);
207
+ }
208
+ //# 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,EAAiC,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,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, Schema } from 'effect';
2
+ import { HttpClient, HttpClientRequest } from 'effect/unstable/http';
3
+ import { EdiError } 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
+ const Settings = Config.all({
8
+ apiUrl: Config.option(Config.String('UNNBOUND_API_URL')),
9
+ environment: Config.option(Config.String('TEMPER_ENVIRONMENT')),
10
+ legacyEnvironment: Config.option(Config.String('UNNBOUND_ENVIRONMENT')),
11
+ // Hosts other than Firecracker pass no Run token; their workflow token is in the environment.
12
+ envToken: Config.option(Config.Redacted('TEMPER_RUN_TOKEN')),
13
+ sandboxToken: Config.option(Config.Redacted('UNNBOUND_SANDBOX_JWT')),
14
+ });
15
+ const fail = (message, retryable, status, cause) => new EdiError({ operation: 'controlNumber', reason: 'control_number', retryable, status, message, cause });
16
+ /** No response, a timeout, throttling, or a server fault: the counter's state is unknown, and a retry with the same key is safe. */
17
+ const isTransient = (status) => status === 408 || status === 425 || status === 429 || status >= 500;
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(settings.envToken, () => 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}.`, isTransient(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,19 @@
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
+ export {};
19
+ //# 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"}
@@ -0,0 +1,17 @@
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
+ //# 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"}
@@ -0,0 +1,61 @@
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 X12Interchange {
53
+ readonly SegmentDelimiter: string;
54
+ readonly DataElementDelimiter: string;
55
+ readonly ISA: ISA;
56
+ readonly TA1?: TA1;
57
+ readonly Groups: ReadonlyArray<X12Group>;
58
+ readonly IEATrailers?: ReadonlyArray<IEA> | null;
59
+ }
60
+ export {};
61
+ //# 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdiModel.js","sourceRoot":"","sources":["../src/EdiModel.ts"],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import { HttpApi, type HttpApiGroup } from 'effect/unstable/httpapi';
2
2
  import { type WorkflowManifest } from './Contract/Manifest.js';
3
- export declare const SDK_VERSION = "0.3.6";
3
+ export declare const SDK_VERSION = "0.4.0";
4
4
  export declare const RUNTIME_API_VERSION = 1;
5
5
  /** The route the SDK serves for platform probes; an API declaring `GET` on it collides with it on every request. */
6
6
  export declare const HEALTHCHECK_PATH = "/healthcheck";
package/dist/Manifest.js CHANGED
@@ -5,7 +5,7 @@ import { declarationOf } from './Resource.js';
5
5
  import { Trigger } from './Trigger.js';
6
6
  const decodeTrigger = Schema.decodeUnknownSync(TriggerMetadata, { onExcessProperty: 'error' });
7
7
  const identityOf = (resource) => `${resource.kind}:${resource.kind === 'resourceType' ? resource.type : resource.key}`;
8
- export const SDK_VERSION = '0.3.6';
8
+ export const SDK_VERSION = '0.4.0';
9
9
  export const RUNTIME_API_VERSION = 1;
10
10
  /** The route the SDK serves for platform probes; an API declaring `GET` on it collides with it on every request. */
11
11
  export const HEALTHCHECK_PATH = '/healthcheck';