@ontemper/sdk 0.5.1 → 0.6.0-pr-7774.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
@@ -41,7 +41,7 @@ Kinds accept optional defaults that deploy seeds into stored platform records wh
41
41
  .annotate(Trigger, { kind: 'schedule', cron: '*/10 * * * *', timezone: 'UTC', budgetSeconds: 900 })
42
42
  ```
43
43
 
44
- `budgetSeconds` sets the handler budget in whole seconds. An HTTP route with `response: 'wait'` accepts 3–115; an `ack` HTTP route or Schedule accepts 3–1,800. Split work longer than 30 min into several Runs. The 3 s floor leaves time after the SDK's 2 s deadline margin. Invalid values fail the build. These ranges limit the declaration. A `k8s-pod` `ack` Run gets the lower of its declaration (or the stack default when it declares none) and the gateway drain-safe cap: the drain grace minus 25 seconds and the attempt margin, 265 seconds at the default 300-second drain. Firecracker Runs get the declared value. Without it, `wait` uses 115 seconds and `ack` uses the stack default (900 seconds unless configured). A stored Trigger takes precedence on redeploy, which reports budget drift.
44
+ `budgetSeconds` sets the handler budget in whole seconds. An HTTP route with `response: 'wait'` accepts 3–115; an `ack` HTTP route or Schedule accepts 3–1,800. Split work longer than 30 min into several Runs. The 3 s floor leaves time after the SDK's 2 s deadline margin. Invalid values fail the build. These ranges limit the declaration. `k8s-pod` and Firecracker Runs get the declared value. Without it, `wait` uses 115 seconds and `ack` uses the stack default (900 seconds unless configured). A stored Trigger takes precedence on redeploy, which reports budget drift.
45
45
 
46
46
  A manifest-created Schedule is disabled. Verify the deployed route and its bindings, then enable it
47
47
  through the Schedule surface. Deploying source MUST NOT start external work by itself.
@@ -295,6 +295,29 @@ Run token. The Run token goes only to `<UNNBOUND_API_URL>/api/edi-gateway`, and
295
295
  document. A failure is an `EdiError` whose `reason` is `validation`, `unauthorized`, `service`,
296
296
  `control_number`, or `configuration`, and whose `retryable` says whether the same call may succeed later.
297
297
 
298
+ ## AS2
299
+
300
+ `@temper/workflow/as2` exchanges AS2 (RFC 4130) messages through the platform AS2 service with the Run token. The
301
+ platform runs every S/MIME operation; the client carries bytes and the `as2_partner` and `as2_identity` records.
302
+
303
+ ```ts
304
+ import { As2 } from '@temper/workflow/as2';
305
+
306
+ const as2 = yield * As2;
307
+ // A raw `http` route: verify, handle, acknowledge, and answer with the sync MDN (or an empty 200 for async).
308
+ return yield * as2.inbound({ request, partner: (as2Id) => selectPartner(as2Id) }, (message) => store(message.payload));
309
+ // Outbound: pack, deliver, and settle the receipt; `outcome` is confirmed, failed, or pending.
310
+ const sent = yield * as2.send(document, { partner, idempotencyKey: order.id });
311
+ ```
312
+
313
+ Provide `As2.layer`, and mark each route a partner posts to with `.annotate(As2Route, true)`. `receive`, `confirm`,
314
+ and `deliverMdn` are the steps `inbound` composes. A Run that the gateway admits as AS2 (`triggerKind: 'as2'`), or any
315
+ request to a marked route, starts on a fresh trace, and its request lines log only allowlisted headers and no body. AS2 lines carry ids, outcomes, and byte counts, never the document, a receipt body, or a key. A
316
+ failure is an `As2Error` with `operation`, `code`, `status`, and `retryable`. Partner TLS settings and proxies are
317
+ not supported yet: `send` refuses them before it packs. In tests, provide `memoryAs2().layer` from
318
+ `@temper/workflow/as2/testing` and pass its `fetch` to `testPlatform`; it keeps the platform ledger rules and runs
319
+ no crypto.
320
+
298
321
  ## Versions
299
322
 
300
323
  CI publishes every version to npm as `@ontemper/sdk`; nobody publishes by hand. Workflow code keeps
@@ -308,9 +331,9 @@ npm install --save-exact @temper/workflow@npm:@ontemper/sdk@<version>
308
331
  A published version never changes. The workflow template and the examples pin one exact
309
332
  version; `pnpm sdk:pin` moves them all together.
310
333
 
311
- The package has six entry points: `@temper/workflow`, `@temper/workflow/testing`,
312
- `@temper/workflow/contract`, `@temper/workflow/sftp`, `@temper/workflow/sftp/testing`, and
313
- `@temper/workflow/edi`. Only `/sftp` loads `ssh2`. `@temper/workflow/contract` holds the runtime Resources HttpApi and the
334
+ The package has eight entry points: `@temper/workflow`, `@temper/workflow/testing`,
335
+ `@temper/workflow/contract`, `@temper/workflow/sftp`, `@temper/workflow/sftp/testing`,
336
+ `@temper/workflow/edi`, `@temper/workflow/as2`, and `@temper/workflow/as2/testing`. Only `/sftp` loads `ssh2`. `@temper/workflow/contract` holds the runtime Resources HttpApi and the
314
337
  manifest, trigger, and invocation schemas that the platform imports. Workflow code rarely needs it.
315
338
 
316
339
  ## Develop and release
package/dist/As2.d.ts ADDED
@@ -0,0 +1,155 @@
1
+ import { Context, Effect, Layer } from 'effect';
2
+ import { HttpClient, type HttpServerRequest, HttpServerResponse } from 'effect/http';
3
+ import { type LookupAddresses } from './As2Destination.js';
4
+ import { As2Error } from './As2Error.js';
5
+ import { As2IdentityResource, As2PartnerResource } from './As2Resource.js';
6
+ import { Invocation } from './Invocation.js';
7
+ export { As2Error } from './As2Error.js';
8
+ export { As2Route } from './As2Route.js';
9
+ export type { LookupAddresses } from './As2Destination.js';
10
+ export { As2IdentityResource, As2PartnerResource } from './As2Resource.js';
11
+ /** A Message Disposition Notification: the receipt one side signs for the other. */
12
+ export interface As2Mdn {
13
+ readonly headers: Readonly<Record<string, string>>;
14
+ readonly body: Uint8Array;
15
+ }
16
+ /** The receipt for one inbound message, and the HTTP answer that carries it. */
17
+ export interface As2Acknowledgement {
18
+ readonly messageId: string;
19
+ readonly mic: string;
20
+ readonly mdn: As2Mdn | null;
21
+ readonly mdnMode: 'sync' | 'async';
22
+ /** Where an async receipt goes: the partner's own Receipt-Delivery-Option, checked by the platform. */
23
+ readonly mdnDeliveryUrl: string | null;
24
+ readonly alreadyAcknowledged: boolean;
25
+ /** The exchange's trace in the platform ledger. */
26
+ readonly customerTraceId: string | null;
27
+ /** A sync receipt as the response body; an async receipt answers an empty 200. */
28
+ readonly response: HttpServerResponse.HttpServerResponse;
29
+ }
30
+ /** A verified, decrypted message that the workflow has not acknowledged yet. */
31
+ export interface As2Received {
32
+ readonly kind: 'received';
33
+ readonly messageId: string;
34
+ /** The business document. */
35
+ readonly payload: Uint8Array;
36
+ readonly contentType: string | null;
37
+ readonly mic: string;
38
+ readonly mdnMode: 'sync' | 'async';
39
+ /** The exchange's trace: the sending half's for a verified loopback, else minted by the platform. */
40
+ readonly customerTraceId: string | null;
41
+ /**
42
+ * Run only after the workflow handled the payload. Until it succeeds, the platform keeps the message
43
+ * processing and no success receipt reaches the partner.
44
+ */
45
+ readonly acknowledge: Effect.Effect<As2Acknowledgement, As2Error, Invocation>;
46
+ }
47
+ /** A message the platform already acknowledged: answer it with the stored receipt. */
48
+ export interface As2Duplicate extends As2Acknowledgement {
49
+ readonly kind: 'duplicate';
50
+ }
51
+ /** Another Run holds the message (`inFlight`) or the platform parked it (`parked`): the partner retries later. */
52
+ export interface As2Pending {
53
+ readonly kind: 'inFlight' | 'parked';
54
+ readonly messageId: string;
55
+ /** 503 with `retry-after: 60`. */
56
+ readonly response: HttpServerResponse.HttpServerResponse;
57
+ }
58
+ export type As2ReceiveResult = As2Received | As2Duplicate | As2Pending;
59
+ export interface As2ReceiveOptions {
60
+ /** The partner's POST, exactly as received: headers and body bytes go to the platform for verification. */
61
+ readonly request: HttpServerRequest.HttpServerRequest;
62
+ readonly partner: As2PartnerResource;
63
+ /** Default: the identity the partner record references. */
64
+ readonly identity?: As2IdentityResource | undefined;
65
+ }
66
+ export interface As2InboundOptions<E, R> {
67
+ readonly request: HttpServerRequest.HttpServerRequest;
68
+ /** The partner record for the sender's AS2-From (unquoted), such as a `ResourceType` select on `as2Id`. */
69
+ readonly partner: (as2From: string) => Effect.Effect<As2PartnerResource, E, R>;
70
+ readonly identity?: As2IdentityResource | undefined;
71
+ }
72
+ export interface As2SendOptions {
73
+ readonly partner: As2PartnerResource;
74
+ /** Default: the identity the partner record references. */
75
+ readonly identity?: As2IdentityResource | undefined;
76
+ /** Default `application/edi-x12`. */
77
+ readonly contentType?: string | undefined;
78
+ readonly subject?: string | undefined;
79
+ /** A retry with the same key re-delivers the original envelope instead of minting a new Message-ID. At most 255 characters. */
80
+ readonly idempotencyKey?: string | undefined;
81
+ /** Delivery URL in place of the partner's; it may not carry the partner's credentials to another origin. */
82
+ readonly url?: string | undefined;
83
+ /** Where the partner posts an async receipt. Default: `UNNBOUND_WORKFLOW_URL` plus `/as2/mdn`. */
84
+ readonly receiptUrl?: string | undefined;
85
+ }
86
+ export interface As2SendResult {
87
+ readonly messageId: string;
88
+ readonly mic: string;
89
+ /** The platform served this key's earlier envelope again. */
90
+ readonly replayed: boolean;
91
+ /** `confirmed`: the receipt verified and its MIC matched; `pending`: an async receipt is still due. */
92
+ readonly outcome: 'confirmed' | 'failed' | 'pending';
93
+ readonly disposition: string | null;
94
+ readonly customerTraceId: string | null;
95
+ }
96
+ export type As2ConfirmOptions = {
97
+ readonly partner: As2PartnerResource;
98
+ readonly identity?: As2IdentityResource | undefined;
99
+ /** An assertion only: the platform settles the message the signed receipt names, and fails when it names another. */
100
+ readonly originalMessageId?: string | undefined;
101
+ } & ({
102
+ readonly request: HttpServerRequest.HttpServerRequest;
103
+ readonly mdn?: never;
104
+ } | {
105
+ readonly mdn: As2Mdn;
106
+ readonly request?: never;
107
+ });
108
+ export interface As2ConfirmResult {
109
+ readonly outcome: 'confirmed' | 'failed';
110
+ /** The outbound message this receipt settled: its signed Original-Message-ID. */
111
+ readonly messageId: string;
112
+ readonly disposition: string | null;
113
+ readonly receivedMic: string | null;
114
+ readonly packMic: string | null;
115
+ readonly micMatched: boolean;
116
+ /** The trace that sent the message; an async receipt stays on its own trace and links to it. */
117
+ readonly originatingTraceId: string | null;
118
+ }
119
+ export interface As2Client {
120
+ /** Verifies and decrypts one inbound message on the platform, then sorts it: received, duplicate, in flight, or parked. */
121
+ readonly receive: (options: As2ReceiveOptions) => Effect.Effect<As2ReceiveResult, As2Error, Invocation>;
122
+ /**
123
+ * The whole inbound exchange, as legacy `as2Endpoint`: select the partner, receive, run `handle` on a new
124
+ * message, acknowledge, deliver an async receipt, and answer. Lines after verification carry the exchange's trace.
125
+ * An `As2Error` becomes the status a partner reads: 502, 503, 504 retry; 400, 413, 422 do not; else 500.
126
+ */
127
+ readonly inbound: <E, R, E2, R2>(options: As2InboundOptions<E, R>, handle: (message: As2Received) => Effect.Effect<void, E2, R2>) => Effect.Effect<HttpServerResponse.HttpServerResponse, Exclude<E | E2, As2Error>, R | R2 | Invocation>;
128
+ /** Packs on the platform, posts the envelope to the partner, and settles the receipt. */
129
+ readonly send: (payload: Uint8Array | string, options: As2SendOptions) => Effect.Effect<As2SendResult, As2Error, Invocation>;
130
+ /** Verifies a receipt, such as an async MDN a partner posts to `/as2/mdn`, and settles its message. */
131
+ readonly confirm: (options: As2ConfirmOptions) => Effect.Effect<As2ConfirmResult, As2Error, Invocation>;
132
+ /** Posts a receipt to the partner's async-MDN URL. The URL must resolve to public addresses only. */
133
+ readonly deliverMdn: (mdn: As2Mdn, url: string) => Effect.Effect<void, As2Error>;
134
+ }
135
+ /** The route an async receipt is posted to, under the sending workflow's own URL. */
136
+ export declare const AS2_ASYNC_RECEIPT_PATH = "/as2/mdn";
137
+ /** RFC 2045 quoted-string unquote for AS2-From and AS2-To: a bare token passes through. */
138
+ export declare const unquoteAs2Id: (value: string | undefined) => string;
139
+ /** Runs `effect` on the exchange's verified trace; with none, on the current one. */
140
+ export declare const withExchangeTrace: (customerTraceId: string | null) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
141
+ /** Legacy `as2Endpoint`: a partner decides whether to resend from the status, so it gets the status and a generic message. */
142
+ export declare const as2FailureResponse: (error: As2Error) => HttpServerResponse.HttpServerResponse;
143
+ declare const As2_base: Context.ServiceClass<As2, "@temper/workflow/As2", As2Client>;
144
+ /**
145
+ * First-party AS2 on the workflow's `HttpClient`, logger, and Run token: `yield* As2` in a handler layer and
146
+ * provide `As2.layer`. All S/MIME crypto runs on the platform; the SDK carries bytes and records.
147
+ */
148
+ export declare class As2 extends As2_base {
149
+ static readonly layer: Layer.Layer<As2, never, HttpClient.HttpClient>;
150
+ /** `layer` with a replaced name lookup for the async-MDN destination check. */
151
+ static readonly layerWith: (options: {
152
+ readonly lookupAddresses: LookupAddresses;
153
+ }) => Layer.Layer<As2, never, HttpClient.HttpClient>;
154
+ }
155
+ //# sourceMappingURL=As2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"As2.d.ts","sourceRoot":"","sources":["../src/As2.ts"],"names":[],"mappings":"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"}