@ontemper/sdk 0.5.0 → 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 +62 -4
- package/dist/As2.d.ts +155 -0
- package/dist/As2.d.ts.map +1 -0
- package/dist/As2.js +708 -0
- package/dist/As2.js.map +1 -0
- package/dist/As2Destination.d.ts +8 -0
- package/dist/As2Destination.d.ts.map +1 -0
- package/dist/As2Destination.js +61 -0
- package/dist/As2Destination.js.map +1 -0
- package/dist/As2Error.d.ts +19 -0
- package/dist/As2Error.d.ts.map +1 -0
- package/dist/As2Error.js +16 -0
- package/dist/As2Error.js.map +1 -0
- package/dist/As2Route.d.ts +13 -0
- package/dist/As2Route.d.ts.map +1 -0
- package/dist/As2Route.js +13 -0
- package/dist/As2Route.js.map +1 -0
- package/dist/As2Testing.d.ts +73 -0
- package/dist/As2Testing.d.ts.map +1 -0
- package/dist/As2Testing.js +354 -0
- package/dist/As2Testing.js.map +1 -0
- package/dist/DeploySchema.d.ts +7 -0
- package/dist/DeploySchema.d.ts.map +1 -0
- package/dist/DeploySchema.js +225 -0
- package/dist/DeploySchema.js.map +1 -0
- package/dist/Manifest.d.ts +1 -1
- package/dist/Manifest.d.ts.map +1 -1
- package/dist/Manifest.js +1 -1
- package/dist/Manifest.js.map +1 -1
- package/dist/Middleware.d.ts.map +1 -1
- package/dist/Middleware.js +49 -14
- package/dist/Middleware.js.map +1 -1
- package/dist/Resource.d.ts +1 -1
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +4 -12
- package/dist/Resource.js.map +1 -1
- package/dist/Workflow.d.ts.map +1 -1
- package/dist/Workflow.js +15 -2
- package/dist/Workflow.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +10 -2
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.
|
|
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.
|
|
@@ -170,6 +170,41 @@ const { key, value } = yield * partners.select({ tenantKey }); // ResourceNotFou
|
|
|
170
170
|
- `makeManifest` lists the declarations of each endpoint in its `resources`. Deploy fails, with one
|
|
171
171
|
message for each problem, when a declaration has no binding, a bound resource has a different type,
|
|
172
172
|
a value breaks the declared schema, or the organization does not have a declared resource type.
|
|
173
|
+
- Deploy checks a value against the JSON Schema of the declared schema. Declaring a `Resource` or
|
|
174
|
+
`ResourceType` throws, naming the key and the field, when a check exports a weaker rule than decoding
|
|
175
|
+
runs. Without the throw, a value would pass deploy and fail every run with a `500`. For a string, use
|
|
176
|
+
the form that deploy checks exactly:
|
|
177
|
+
|
|
178
|
+
| Throws | Use instead |
|
|
179
|
+
| ------------------------------------------ | ---------------------------------------------- |
|
|
180
|
+
| `Schema.isPattern(/^[a-z0-9.-]+$/)` | `Schema.isPattern(/^[a-z0-9.-]+$/u)` |
|
|
181
|
+
| `Schema.isPattern(/^[a-z]+$/i)` | `Schema.isPattern(/^[A-Za-z]+$/u)` |
|
|
182
|
+
| `Schema.isMinLength(n)`, `n` above 1 | `Schema.isMinCodePoints(n)` |
|
|
183
|
+
| `Schema.isMaxLength(n)`, `n` above 0 | `Schema.isMaxCodePoints(n)` |
|
|
184
|
+
| `Schema.isBetweenLength(minimum, maximum)` | `Schema.isBetweenCodePoints(minimum, maximum)` |
|
|
185
|
+
|
|
186
|
+
A pattern exports only with the `u` flag (`g`, `d`, and `y` may join it). JSON Schema counts code
|
|
187
|
+
points and JavaScript counts UTF-16 units, so the code-point checks are the ones both sides count alike.
|
|
188
|
+
On an array, the length checks export exact `minItems` and `maxItems` and build unchanged.
|
|
189
|
+
Deploy runs `pattern` with RE2, which reads some JavaScript syntax differently or does not compile it.
|
|
190
|
+
A pattern that uses one of these throws too, with the rewrite that both engines read alike:
|
|
191
|
+
|
|
192
|
+
| Syntax | Write instead |
|
|
193
|
+
| ---------------------------- | ------------------------------------------------------------------------ |
|
|
194
|
+
| `.` | `[^\n\r\p{Zl}\p{Zp}]` |
|
|
195
|
+
| `\s`, `\S` | `[\t\n\v\f\r\p{Z}]`, `[^\t\n\v\f\r\p{Z}]`, or `[\s\S]` for any character |
|
|
196
|
+
| `[^]` | `[\s\S]` |
|
|
197
|
+
| `\u0041`, `\cA` | the character itself, or `\x41` |
|
|
198
|
+
| `(?i:…)`, `(?m:…)`, `(?s:…)` | the group without the modifier, for example `[Aa]` for `(?i:a)` |
|
|
199
|
+
| lookarounds, backreferences | a pattern without them, or the annotation below |
|
|
200
|
+
|
|
201
|
+
The `\s` rewrites differ from `\s` only on U+FEFF. `\p{…}` reads each engine's own Unicode tables:
|
|
202
|
+
they agree on Node 22.23 and Node 26.8 (Unicode 17), while a release on Unicode 16, such as Node 24.2,
|
|
203
|
+
reads letters added in Unicode 17 as not `\p{L}`.
|
|
204
|
+
|
|
205
|
+
A built-in check whose pattern uses them, such as `Schema.Trimmed`, takes the annotation below.
|
|
206
|
+
To keep a check that deploy does not run, annotate it: `Schema.isPattern(regExp, { toJsonSchema: () => ({}) })`.
|
|
207
|
+
A `Schema.makeFilter` predicate without `toJsonSchema` runs only when the workflow decodes the value.
|
|
173
208
|
|
|
174
209
|
## Invoke in a test
|
|
175
210
|
|
|
@@ -260,6 +295,29 @@ Run token. The Run token goes only to `<UNNBOUND_API_URL>/api/edi-gateway`, and
|
|
|
260
295
|
document. A failure is an `EdiError` whose `reason` is `validation`, `unauthorized`, `service`,
|
|
261
296
|
`control_number`, or `configuration`, and whose `retryable` says whether the same call may succeed later.
|
|
262
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
|
+
|
|
263
321
|
## Versions
|
|
264
322
|
|
|
265
323
|
CI publishes every version to npm as `@ontemper/sdk`; nobody publishes by hand. Workflow code keeps
|
|
@@ -273,9 +331,9 @@ npm install --save-exact @temper/workflow@npm:@ontemper/sdk@<version>
|
|
|
273
331
|
A published version never changes. The workflow template and the examples pin one exact
|
|
274
332
|
version; `pnpm sdk:pin` moves them all together.
|
|
275
333
|
|
|
276
|
-
The package has
|
|
277
|
-
`@temper/workflow/contract`, `@temper/workflow/sftp`, `@temper/workflow/sftp/testing`,
|
|
278
|
-
`@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
|
|
279
337
|
manifest, trigger, and invocation schemas that the platform imports. Workflow code rarely needs it.
|
|
280
338
|
|
|
281
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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"}
|