@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
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { Option, Predicate, Schema } from 'effect';
|
|
3
|
+
import { As2, unquoteAs2Id } from './As2.js';
|
|
4
|
+
const PROCESSED = 'automatic-action/MDN-sent-automatically; processed';
|
|
5
|
+
const MDN_TYPE = 'multipart/report; report-type=disposition-notification; boundary=memory-as2';
|
|
6
|
+
const ENVELOPE_TYPE = 'application/pkcs7-mime; smime-type=enveloped-data';
|
|
7
|
+
// The request bodies of apps/api/src/Platform/As2/Domain.ts, as far as the memory engine reads them.
|
|
8
|
+
const Parties = {
|
|
9
|
+
partner: Schema.Struct({
|
|
10
|
+
as2Id: Schema.String,
|
|
11
|
+
url: Schema.optional(Schema.NullOr(Schema.String)),
|
|
12
|
+
receipt: Schema.optional(Schema.Literals(['none', 'sync', 'async'])),
|
|
13
|
+
}),
|
|
14
|
+
identity: Schema.Struct({ as2Id: Schema.String }),
|
|
15
|
+
};
|
|
16
|
+
const Optional = Schema.optional(Schema.NullOr(Schema.String));
|
|
17
|
+
const ReceiveBody = Schema.Struct({
|
|
18
|
+
...Parties,
|
|
19
|
+
headers: Schema.Record(Schema.String, Schema.String),
|
|
20
|
+
bodyB64: Schema.String,
|
|
21
|
+
});
|
|
22
|
+
const AcknowledgeBody = Schema.Struct({ deliveryToken: Schema.String });
|
|
23
|
+
const PackBody = Schema.Struct({
|
|
24
|
+
...Parties,
|
|
25
|
+
payloadB64: Schema.String,
|
|
26
|
+
payloadContentType: Schema.optional(Schema.String),
|
|
27
|
+
subject: Optional,
|
|
28
|
+
idempotencyKey: Optional,
|
|
29
|
+
receiptUrl: Optional,
|
|
30
|
+
});
|
|
31
|
+
const ConfirmBody = Schema.Struct({ originalMessageId: Optional, mdnBodyB64: Schema.String });
|
|
32
|
+
const SettleBody = Schema.Struct({ messageId: Schema.String });
|
|
33
|
+
const decode = (schema) => (text) => Schema.decodeUnknownOption(Schema.fromJsonString(schema))(text);
|
|
34
|
+
const micOf = (bytes) => `${createHash('sha256').update(bytes).digest('base64')}, sha-256`;
|
|
35
|
+
const b64 = (bytes) => Buffer.from(bytes).toString('base64');
|
|
36
|
+
const lower = (headers) => Object.fromEntries(Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value]));
|
|
37
|
+
const json = (body, status = 200) => new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
|
|
38
|
+
const failure = (status, code, message) => json({ error: { code, message } }, status);
|
|
39
|
+
const unparseable = () => failure(400, 'BAD_REQUEST', 'unparseable request body');
|
|
40
|
+
const headersOf = (init) => init.headers instanceof Headers
|
|
41
|
+
? Object.fromEntries(init.headers.entries())
|
|
42
|
+
: Array.isArray(init.headers)
|
|
43
|
+
? Object.fromEntries(init.headers)
|
|
44
|
+
: lower({ ...(init.headers ?? {}) });
|
|
45
|
+
const bodyOf = async (init) => new Uint8Array(await new Response(init.body ?? null).arrayBuffer());
|
|
46
|
+
const mdnBody = (messageId, mic, disposition) => `Original-Message-ID: ${messageId}\r\nDisposition: ${disposition}\r\nReceived-Content-MIC: ${mic}\r\n`;
|
|
47
|
+
// The platform ledger's receipt rules (apps/api/src/Platform/As2/Ledger.ts): `processed`, with or without a warning.
|
|
48
|
+
const successfulDisposition = (disposition) => disposition !== null && /;\s*processed(?:\s*\/\s*warning(?::.*)?)?\s*$/u.test(disposition.trim().toLowerCase());
|
|
49
|
+
/** Digest exact, algorithm token folded: `sha-256`, `SHA256`, and `sha_256` are one algorithm. */
|
|
50
|
+
const micsMatch = (left, right) => {
|
|
51
|
+
const split = (value) => {
|
|
52
|
+
const comma = value.lastIndexOf(',');
|
|
53
|
+
return comma === -1
|
|
54
|
+
? undefined
|
|
55
|
+
: {
|
|
56
|
+
digest: value.slice(0, comma).trim(),
|
|
57
|
+
algorithm: value
|
|
58
|
+
.slice(comma + 1)
|
|
59
|
+
.toLowerCase()
|
|
60
|
+
.replace(/[^a-z0-9]/gu, ''),
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const a = split(left);
|
|
64
|
+
const b = split(right);
|
|
65
|
+
return a === undefined || b === undefined
|
|
66
|
+
? left.trim() === right.trim()
|
|
67
|
+
: a.digest === b.digest && a.algorithm === b.algorithm;
|
|
68
|
+
};
|
|
69
|
+
const fieldOf = (text, name) => new RegExp(`^${name}:\\s*(.+?)\\s*$`, 'imu').exec(text)?.[1] ?? null;
|
|
70
|
+
/**
|
|
71
|
+
* An in-memory AS2 platform and partner for workflow tests: the SDK client runs unchanged on top of it, so the
|
|
72
|
+
* Run token, retries, outcomes, span lines, and redaction behave as in production. It keeps the platform's ledger
|
|
73
|
+
* rules (duplicates, in-flight claims, idempotent packs, receipt settlement) but runs no crypto: an envelope is the
|
|
74
|
+
* document, and a receipt is plain text that names its message, disposition, and MIC.
|
|
75
|
+
*/
|
|
76
|
+
export const memoryAs2 = (options = {}) => {
|
|
77
|
+
const apiUrl = (options.apiUrl ?? 'https://api.example.invalid').replace(/\/+$/u, '');
|
|
78
|
+
const partners = new Map();
|
|
79
|
+
const outbound = new Map();
|
|
80
|
+
const byKey = new Map();
|
|
81
|
+
const inbound = new Map();
|
|
82
|
+
const tokens = new Map();
|
|
83
|
+
const parked = new Set();
|
|
84
|
+
const deliveries = [];
|
|
85
|
+
const mdns = [];
|
|
86
|
+
const calls = [];
|
|
87
|
+
let sequence = 0;
|
|
88
|
+
const nextId = (prefix) => `${prefix}-${++sequence}`;
|
|
89
|
+
const mdnOf = (from, to, messageId, mic, disposition) => ({
|
|
90
|
+
headers: {
|
|
91
|
+
'content-type': MDN_TYPE,
|
|
92
|
+
'as2-from': from,
|
|
93
|
+
'as2-to': to,
|
|
94
|
+
'message-id': `<${nextId('mdn')}@memory.as2>`,
|
|
95
|
+
},
|
|
96
|
+
body: new TextEncoder().encode(mdnBody(messageId, mic, disposition)),
|
|
97
|
+
});
|
|
98
|
+
const receive = (body) => {
|
|
99
|
+
const { partner, identity } = body;
|
|
100
|
+
const sent = lower(body.headers);
|
|
101
|
+
const messageId = sent['message-id'];
|
|
102
|
+
if (messageId === undefined)
|
|
103
|
+
return failure(422, 'MALFORMED_ENVELOPE', 'Message-ID is missing');
|
|
104
|
+
if (unquoteAs2Id(sent['as2-from']) !== partner.as2Id)
|
|
105
|
+
return failure(422, 'As2PartnerMismatchError', 'AS2-From does not match the partner');
|
|
106
|
+
if (unquoteAs2Id(sent['as2-to']) !== identity.as2Id)
|
|
107
|
+
return failure(422, 'As2PartnerMismatchError', 'AS2-To does not match the identity');
|
|
108
|
+
if (parked.has(messageId))
|
|
109
|
+
return json({ kind: 'parked', messageId });
|
|
110
|
+
const key = `${partner.as2Id}|${identity.as2Id}|${messageId}`;
|
|
111
|
+
const known = inbound.get(key);
|
|
112
|
+
if (known !== undefined && !known.acknowledged)
|
|
113
|
+
return json({ kind: 'inFlight', messageId });
|
|
114
|
+
if (known !== undefined) {
|
|
115
|
+
return json({
|
|
116
|
+
kind: 'duplicate',
|
|
117
|
+
messageId,
|
|
118
|
+
mic: known.mic,
|
|
119
|
+
mdnHeaders: known.mdn?.headers ?? null,
|
|
120
|
+
mdnBodyB64: known.mdn === null ? null : b64(known.mdn.body),
|
|
121
|
+
mdnMode: known.mdnMode,
|
|
122
|
+
mdnDeliveryUrl: known.mdnDeliveryUrl,
|
|
123
|
+
customerTraceId: known.customerTraceId,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const record = {
|
|
127
|
+
messageId,
|
|
128
|
+
from: partner.as2Id,
|
|
129
|
+
to: identity.as2Id,
|
|
130
|
+
payloadB64: body.bodyB64,
|
|
131
|
+
contentType: sent['content-type'] ?? null,
|
|
132
|
+
mic: micOf(Buffer.from(body.bodyB64, 'base64')),
|
|
133
|
+
mdnMode: sent['receipt-delivery-option'] === undefined ? 'sync' : 'async',
|
|
134
|
+
mdnDeliveryUrl: sent['receipt-delivery-option'] ?? null,
|
|
135
|
+
customerTraceId: crypto.randomUUID(),
|
|
136
|
+
mdn: null,
|
|
137
|
+
acknowledged: false,
|
|
138
|
+
};
|
|
139
|
+
inbound.set(key, record);
|
|
140
|
+
const deliveryToken = nextId('delivery');
|
|
141
|
+
tokens.set(deliveryToken, key);
|
|
142
|
+
return json({
|
|
143
|
+
kind: 'received',
|
|
144
|
+
messageId,
|
|
145
|
+
payloadB64: record.payloadB64,
|
|
146
|
+
payloadContentType: record.contentType,
|
|
147
|
+
mic: record.mic,
|
|
148
|
+
deliveryToken,
|
|
149
|
+
mdnMode: record.mdnMode,
|
|
150
|
+
customerTraceId: record.customerTraceId,
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
const acknowledge = (body) => {
|
|
154
|
+
const key = tokens.get(body.deliveryToken);
|
|
155
|
+
const record = key === undefined ? undefined : inbound.get(key);
|
|
156
|
+
if (record === undefined)
|
|
157
|
+
return failure(409, 'As2ClaimLostError', 'the delivery claim is unknown');
|
|
158
|
+
const already = record.acknowledged;
|
|
159
|
+
record.acknowledged = true;
|
|
160
|
+
record.mdn ??= mdnOf(record.to, record.from, record.messageId, record.mic, PROCESSED);
|
|
161
|
+
return json({
|
|
162
|
+
messageId: record.messageId,
|
|
163
|
+
mic: record.mic,
|
|
164
|
+
mdnHeaders: record.mdn.headers,
|
|
165
|
+
mdnBodyB64: b64(record.mdn.body),
|
|
166
|
+
mdnMode: record.mdnMode,
|
|
167
|
+
mdnDeliveryUrl: record.mdnDeliveryUrl,
|
|
168
|
+
alreadyAcknowledged: already,
|
|
169
|
+
customerTraceId: record.customerTraceId,
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
const packed = (body, receipt, contentType, fingerprint) => {
|
|
173
|
+
const messageId = `<${nextId('message')}@as2.ontemper.com>`;
|
|
174
|
+
const receiptHeaders = receipt === 'none'
|
|
175
|
+
? []
|
|
176
|
+
: [
|
|
177
|
+
['Disposition-Notification-To', body.identity.as2Id],
|
|
178
|
+
['Disposition-Notification-Options', 'signed-receipt-protocol=required, pkcs7-signature'],
|
|
179
|
+
];
|
|
180
|
+
const deliveryHeaders = receipt === 'async' && body.receiptUrl !== undefined && body.receiptUrl !== null
|
|
181
|
+
? [['Receipt-Delivery-Option', body.receiptUrl]]
|
|
182
|
+
: [];
|
|
183
|
+
return {
|
|
184
|
+
messageId,
|
|
185
|
+
mic: micOf(Buffer.from(body.payloadB64, 'base64')),
|
|
186
|
+
mdnMode: receipt,
|
|
187
|
+
fingerprint,
|
|
188
|
+
partner: body.partner.as2Id,
|
|
189
|
+
identity: body.identity.as2Id,
|
|
190
|
+
as2Headers: Object.fromEntries([
|
|
191
|
+
['AS2-From', body.identity.as2Id],
|
|
192
|
+
['AS2-To', body.partner.as2Id],
|
|
193
|
+
['AS2-Version', '1.2'],
|
|
194
|
+
['Message-ID', messageId],
|
|
195
|
+
['Content-Type', ENVELOPE_TYPE],
|
|
196
|
+
['X-Memory-As2-Content-Type', contentType],
|
|
197
|
+
...receiptHeaders,
|
|
198
|
+
...deliveryHeaders,
|
|
199
|
+
]),
|
|
200
|
+
payloadB64: body.payloadB64,
|
|
201
|
+
partnerUrl: body.partner.url ?? null,
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
const pack = (body) => {
|
|
205
|
+
const receipt = body.partner.receipt ?? 'sync';
|
|
206
|
+
if (receipt === 'async' && (body.receiptUrl === undefined || body.receiptUrl === null))
|
|
207
|
+
return failure(422, 'As2ConfigError', `partner ${body.partner.as2Id} requests async receipts; receiptUrl is required`);
|
|
208
|
+
const contentType = body.payloadContentType ?? 'application/edi-x12';
|
|
209
|
+
const fingerprint = `${body.payloadB64}\0${contentType}\0${body.subject ?? ''}`;
|
|
210
|
+
// The platform scopes a key to the workflow, our identity, and the partner.
|
|
211
|
+
const idempotencyKey = body.idempotencyKey === undefined || body.idempotencyKey === null
|
|
212
|
+
? undefined
|
|
213
|
+
: `${body.identity.as2Id}|${body.partner.as2Id}|${body.idempotencyKey}`;
|
|
214
|
+
const replay = idempotencyKey === undefined ? undefined : outbound.get(byKey.get(idempotencyKey) ?? '');
|
|
215
|
+
if (replay !== undefined && replay.fingerprint !== fingerprint)
|
|
216
|
+
return failure(409, 'As2MessageConflictError', 'the idempotency key names another document');
|
|
217
|
+
const record = replay ?? packed(body, receipt, contentType, fingerprint);
|
|
218
|
+
outbound.set(record.messageId, record);
|
|
219
|
+
if (idempotencyKey !== undefined)
|
|
220
|
+
byKey.set(idempotencyKey, record.messageId);
|
|
221
|
+
return json({
|
|
222
|
+
messageId: record.messageId,
|
|
223
|
+
as2Headers: record.as2Headers,
|
|
224
|
+
envelopeBodyB64: record.payloadB64,
|
|
225
|
+
mic: record.mic,
|
|
226
|
+
partnerUrl: record.partnerUrl,
|
|
227
|
+
mdnMode: record.mdnMode,
|
|
228
|
+
replayed: replay !== undefined,
|
|
229
|
+
customerTraceId: null,
|
|
230
|
+
});
|
|
231
|
+
};
|
|
232
|
+
const confirm = (body) => {
|
|
233
|
+
const text = Buffer.from(body.mdnBodyB64, 'base64').toString('utf8');
|
|
234
|
+
const original = fieldOf(text, 'Original-Message-ID');
|
|
235
|
+
const record = original === null ? undefined : outbound.get(original);
|
|
236
|
+
if (record === undefined)
|
|
237
|
+
return failure(404, 'As2MessageNotFoundError', 'no outbound message matches the receipt');
|
|
238
|
+
if (body.originalMessageId !== undefined && body.originalMessageId !== null && body.originalMessageId !== original)
|
|
239
|
+
return failure(409, 'As2MessageConflictError', 'the receipt names another message');
|
|
240
|
+
const already = record.verdict !== undefined;
|
|
241
|
+
if (record.verdict === undefined) {
|
|
242
|
+
const disposition = fieldOf(text, 'Disposition');
|
|
243
|
+
const receivedMic = fieldOf(text, 'Received-Content-MIC');
|
|
244
|
+
const micMatched = receivedMic !== null && micsMatch(receivedMic, record.mic);
|
|
245
|
+
const outcome = micMatched && successfulDisposition(disposition) ? 'confirmed' : 'failed';
|
|
246
|
+
record.verdict = { outcome, disposition, receivedMic, micMatched };
|
|
247
|
+
}
|
|
248
|
+
return json({
|
|
249
|
+
...record.verdict,
|
|
250
|
+
messageId: record.messageId,
|
|
251
|
+
packMic: record.mic,
|
|
252
|
+
alreadyRecorded: already,
|
|
253
|
+
originatingTraceId: null,
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
const settle = (body) => {
|
|
257
|
+
const record = outbound.get(body.messageId);
|
|
258
|
+
if (record === undefined)
|
|
259
|
+
return failure(404, 'As2MessageNotFoundError', 'no outbound message has this id');
|
|
260
|
+
const already = record.verdict !== undefined;
|
|
261
|
+
record.verdict ??= { outcome: 'confirmed', disposition: null, receivedMic: null, micMatched: false };
|
|
262
|
+
return json({ outcome: 'confirmed', messageId: record.messageId, alreadyRecorded: already, customerTraceId: null });
|
|
263
|
+
};
|
|
264
|
+
const route = (path, text) => {
|
|
265
|
+
switch (path) {
|
|
266
|
+
case 'receive':
|
|
267
|
+
return Option.match(decode(ReceiveBody)(text), { onNone: unparseable, onSome: receive });
|
|
268
|
+
case 'acknowledge':
|
|
269
|
+
return Option.match(decode(AcknowledgeBody)(text), { onNone: unparseable, onSome: acknowledge });
|
|
270
|
+
case 'pack':
|
|
271
|
+
return Option.match(decode(PackBody)(text), { onNone: unparseable, onSome: pack });
|
|
272
|
+
case 'confirm':
|
|
273
|
+
return Option.match(decode(ConfirmBody)(text), { onNone: unparseable, onSome: confirm });
|
|
274
|
+
case 'settle-delivery':
|
|
275
|
+
return Option.match(decode(SettleBody)(text), { onNone: unparseable, onSome: settle });
|
|
276
|
+
default:
|
|
277
|
+
return failure(404, 'NOT_FOUND', `no AS2 route ${path}`);
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
const platform = (path, headers, text) => {
|
|
281
|
+
const token = /^Bearer (.+)$/u.exec(headers.authorization ?? '')?.[1];
|
|
282
|
+
calls.push({ path, token });
|
|
283
|
+
if (token === undefined)
|
|
284
|
+
return failure(401, 'UNAUTHORIZED', 'AS2 requires a workflow-scoped token');
|
|
285
|
+
return route(path, text);
|
|
286
|
+
};
|
|
287
|
+
const deliver = async (url, partnerOptions, headers, payload) => {
|
|
288
|
+
const messageId = headers['message-id'] ?? '';
|
|
289
|
+
deliveries.push({ url, messageId, payload, headers });
|
|
290
|
+
if ((partnerOptions.status ?? 200) >= 300)
|
|
291
|
+
return new Response('partner failure', { status: partnerOptions.status });
|
|
292
|
+
const record = outbound.get(messageId);
|
|
293
|
+
if (record === undefined || record.mdnMode !== 'sync' || partnerOptions.omitMdn === true)
|
|
294
|
+
return new Response(null, { status: partnerOptions.status ?? 200 });
|
|
295
|
+
const mdn = mdnOf(record.partner, record.identity, messageId, micOf(payload), partnerOptions.disposition ?? PROCESSED);
|
|
296
|
+
return new Response(Buffer.from(mdn.body), { status: 200, headers: mdn.headers });
|
|
297
|
+
};
|
|
298
|
+
const fetch = async (url, init) => {
|
|
299
|
+
const headers = headersOf(init);
|
|
300
|
+
const body = await bodyOf(init);
|
|
301
|
+
const prefix = `${apiUrl}/api/v2/internal/as2/`;
|
|
302
|
+
if (url.href.startsWith(prefix)) {
|
|
303
|
+
return platform(url.href.slice(prefix.length), headers, new TextDecoder().decode(body));
|
|
304
|
+
}
|
|
305
|
+
const partnerOptions = partners.get(url.href);
|
|
306
|
+
if (partnerOptions !== undefined)
|
|
307
|
+
return deliver(url.href, partnerOptions, headers, body);
|
|
308
|
+
if (headers['content-type']?.startsWith('multipart/report') === true) {
|
|
309
|
+
mdns.push({ url: url.href, headers, body });
|
|
310
|
+
return new Response(null, { status: 200 });
|
|
311
|
+
}
|
|
312
|
+
if (options.fetch !== undefined)
|
|
313
|
+
return options.fetch(url, init);
|
|
314
|
+
throw new Error(`Unexpected outbound request: ${init.method ?? 'GET'} ${url.href}`);
|
|
315
|
+
};
|
|
316
|
+
return {
|
|
317
|
+
fetch,
|
|
318
|
+
layer: As2.layerWith({
|
|
319
|
+
lookupAddresses: async (hostname) => options.addresses?.[hostname] ?? ['93.184.216.34'],
|
|
320
|
+
}),
|
|
321
|
+
partner: (url, partnerOptions = {}) => {
|
|
322
|
+
partners.set(new URL(url).href, partnerOptions);
|
|
323
|
+
},
|
|
324
|
+
inboundRequest: (request) => {
|
|
325
|
+
const receipt = request.receiptUrl === undefined ? [] : [['receipt-delivery-option', request.receiptUrl]];
|
|
326
|
+
const headers = Object.fromEntries([
|
|
327
|
+
['content-type', request.contentType ?? 'application/edi-x12'],
|
|
328
|
+
['as2-from', request.from],
|
|
329
|
+
['as2-to', request.to],
|
|
330
|
+
['as2-version', '1.2'],
|
|
331
|
+
['message-id', request.messageId ?? `<${nextId('inbound')}@memory.as2>`],
|
|
332
|
+
['x-forwarded-proto', 'https'],
|
|
333
|
+
['disposition-notification-to', request.from],
|
|
334
|
+
...receipt,
|
|
335
|
+
...Object.entries(request.headers ?? {}),
|
|
336
|
+
]);
|
|
337
|
+
const body = Predicate.isString(request.payload) ? request.payload : Buffer.from(request.payload);
|
|
338
|
+
return new Request(request.url, { method: 'POST', headers, body });
|
|
339
|
+
},
|
|
340
|
+
mdnFor: (messageId, disposition = PROCESSED) => {
|
|
341
|
+
const record = outbound.get(messageId);
|
|
342
|
+
if (record === undefined)
|
|
343
|
+
throw new Error(`memoryAs2 has no outbound message ${messageId}`);
|
|
344
|
+
return mdnOf(record.partner, record.identity, messageId, record.mic, disposition);
|
|
345
|
+
},
|
|
346
|
+
park: (messageId) => {
|
|
347
|
+
parked.add(messageId);
|
|
348
|
+
},
|
|
349
|
+
deliveries,
|
|
350
|
+
mdns,
|
|
351
|
+
calls,
|
|
352
|
+
};
|
|
353
|
+
};
|
|
354
|
+
//# sourceMappingURL=As2Testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"As2Testing.js","sourceRoot":"","sources":["../src/As2Testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
/**
|
|
3
|
+
* The JSON Schema of the encoded form, which deploy validates a bound value against. Fails when a check exports a
|
|
4
|
+
* weaker constraint than decoding runs, because deploy would then accept a value that every run rejects.
|
|
5
|
+
*/
|
|
6
|
+
export declare const deploySchemaOf: (subject: string, schema: Schema.Top) => Record<string, Schema.Json>;
|
|
7
|
+
//# sourceMappingURL=DeploySchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeploySchema.d.ts","sourceRoot":"","sources":["../src/DeploySchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,MAAM,EAAwB,MAAM,QAAQ,CAAC;AAuO/E;;;GAGG;AACH,eAAO,MAAM,cAAc,YAAa,MAAM,UAAU,MAAM,CAAC,GAAG,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAuB9F,CAAC"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { Array as Arr, Predicate, Schema, SchemaRepresentation } from 'effect';
|
|
2
|
+
import { JsonSchemaObject } from './Contract/Manifest.js';
|
|
3
|
+
/** The check, named by its representation id, whose export deploy validates exactly. */
|
|
4
|
+
const fixFor = (id) => {
|
|
5
|
+
switch (id) {
|
|
6
|
+
case 'effect/schema/isPattern':
|
|
7
|
+
return 'use a regular expression whose flags are only `u` (with `g`, `d`, or `y` if needed), for example /^[a-z0-9.-]+$/u; write `i`, `m`, or `s` into the pattern, for example [A-Za-z] for `i`';
|
|
8
|
+
case 'effect/schema/isMinLength':
|
|
9
|
+
return 'use Schema.isMinCodePoints(n)';
|
|
10
|
+
case 'effect/schema/isMaxLength':
|
|
11
|
+
return 'use Schema.isMaxCodePoints(n)';
|
|
12
|
+
case 'effect/schema/isBetweenLength':
|
|
13
|
+
return 'use Schema.isBetweenCodePoints(minimum, maximum)';
|
|
14
|
+
default:
|
|
15
|
+
return 'give the check a toJsonSchema annotation that states what deploy checks; `toJsonSchema: () => ({})` accepts that deploy does not check it';
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const toJsonSchemaOf = (check) => {
|
|
19
|
+
const callback = check.annotations?.toJsonSchema;
|
|
20
|
+
// SAFETY: effect keeps a check's `toJsonSchema` annotation here and its compiler calls it with this signature.
|
|
21
|
+
return Predicate.isFunction(callback) ? callback : undefined;
|
|
22
|
+
};
|
|
23
|
+
// Deploy runs `pattern` with RE2 (`re2js` in the API's resource validator); each construct below reads otherwise there
|
|
24
|
+
// than in JavaScript with `u`, or does not compile, so its fix names a form both engines read alike.
|
|
25
|
+
const re2Fixes = {
|
|
26
|
+
dot: 'write [^\\n\\r\\p{Zl}\\p{Zp}] for `.`: RE2 matches \\r, U+2028, and U+2029 with `.`, JavaScript does not',
|
|
27
|
+
space: 'write [\\t\\n\\v\\f\\r\\p{Z}] for \\s and [^\\t\\n\\v\\f\\r\\p{Z}] for \\S (only U+FEFF differs), or [\\s\\S] for any character: RE2 reads \\s and \\S as ASCII only',
|
|
28
|
+
escape: 'write the character itself, or \\x.. for one below U+0100, for \\u and \\c: RE2 does not compile them',
|
|
29
|
+
lookaround: 'rewrite without lookarounds and backreferences, or annotate the check with toJsonSchema: () => ({}): RE2 has neither',
|
|
30
|
+
emptyClass: 'write [\\s\\S] for [^], and drop []: RE2 does not compile an empty class',
|
|
31
|
+
modifier: 'write the group without its (?i:), (?m:), or (?s:) modifier, for example [Aa] for (?i:a): RE2 reads them unlike JavaScript',
|
|
32
|
+
};
|
|
33
|
+
/** The fixes for each construct in `pattern` that RE2 reads unlike JavaScript with `u`. */
|
|
34
|
+
const re2Gaps = (pattern) => {
|
|
35
|
+
const gaps = new Set();
|
|
36
|
+
// `[\s\S]` matches every character in both engines; only a class with one of the two differs.
|
|
37
|
+
const classSpaces = new Set();
|
|
38
|
+
let inClass = false;
|
|
39
|
+
for (let index = 0; index < pattern.length; index++) {
|
|
40
|
+
const char = pattern[index];
|
|
41
|
+
if (char === '\\') {
|
|
42
|
+
const escaped = pattern[index + 1] ?? '';
|
|
43
|
+
if (escaped === 's' || escaped === 'S') {
|
|
44
|
+
if (inClass)
|
|
45
|
+
classSpaces.add(escaped);
|
|
46
|
+
else
|
|
47
|
+
gaps.add('space');
|
|
48
|
+
}
|
|
49
|
+
if (escaped === 'u' || escaped === 'c')
|
|
50
|
+
gaps.add('escape');
|
|
51
|
+
if (escaped === 'k' || (escaped >= '1' && escaped <= '9'))
|
|
52
|
+
gaps.add('lookaround');
|
|
53
|
+
index++;
|
|
54
|
+
}
|
|
55
|
+
else if (inClass) {
|
|
56
|
+
inClass = char !== ']';
|
|
57
|
+
if (!inClass && classSpaces.size === 1)
|
|
58
|
+
gaps.add('space');
|
|
59
|
+
if (!inClass)
|
|
60
|
+
classSpaces.clear();
|
|
61
|
+
}
|
|
62
|
+
else if (char === '[') {
|
|
63
|
+
inClass = true;
|
|
64
|
+
if (pattern.startsWith(']', index + 1) || pattern.startsWith('^]', index + 1))
|
|
65
|
+
gaps.add('emptyClass');
|
|
66
|
+
}
|
|
67
|
+
else if (char === '.') {
|
|
68
|
+
gaps.add('dot');
|
|
69
|
+
}
|
|
70
|
+
else if (pattern.startsWith('(?', index)) {
|
|
71
|
+
// Only `(?:` and `(?<name>` read alike; any other `(?` group is a lookaround or a modifier.
|
|
72
|
+
const group = pattern.slice(index + 2);
|
|
73
|
+
if (/^<?[=!]/.test(group))
|
|
74
|
+
gaps.add('lookaround');
|
|
75
|
+
else if (!/^(?::|<[^=!])/.test(group))
|
|
76
|
+
gaps.add('modifier');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return [...gaps].map((gap) => re2Fixes[gap]);
|
|
80
|
+
};
|
|
81
|
+
const fieldOf = (parent, name) => (parent === '' ? name : `${parent}.${name}`);
|
|
82
|
+
/**
|
|
83
|
+
* Copies a representation document so that each check callback reports when it answers `[fragment, true]`: effect's
|
|
84
|
+
* marker for an export weaker than the check decoding runs. Effect's own compiler then decides which callbacks run and
|
|
85
|
+
* with which `type`. A filter with no callback is a predicate JSON Schema cannot state, so decoding alone runs it.
|
|
86
|
+
*/
|
|
87
|
+
const makeTracer = (report, definition, uses, references) => {
|
|
88
|
+
const traceCheck = (check, field) => {
|
|
89
|
+
// Effect compiles a check's nested schemas before its callback, so their findings wait for the parent's answer.
|
|
90
|
+
const nested = [];
|
|
91
|
+
const traceNested = makeTracer((weak) => nested.push(weak), definition, uses, references);
|
|
92
|
+
const schemas = check.representation?.schemas?.map((schema) => traceNested(schema, `${field}[key]`));
|
|
93
|
+
const representation = check.representation === undefined || schemas === undefined
|
|
94
|
+
? check.representation
|
|
95
|
+
: { ...check.representation, schemas };
|
|
96
|
+
const callback = toJsonSchemaOf(check);
|
|
97
|
+
const toJsonSchema = callback === undefined
|
|
98
|
+
? undefined
|
|
99
|
+
: (input) => {
|
|
100
|
+
const output = callback(input);
|
|
101
|
+
const fragment = Array.isArray(output) ? output[0] : output;
|
|
102
|
+
// Only an empty answer, such as `() => ({})`, surely drops the nested schemas; any other may keep them.
|
|
103
|
+
if (Object.keys(fragment).length > 0)
|
|
104
|
+
nested.forEach(report);
|
|
105
|
+
const expected = check.annotations?.expected;
|
|
106
|
+
const describe = Predicate.isString(expected) ? expected : 'a custom check';
|
|
107
|
+
if (Array.isArray(output)) {
|
|
108
|
+
report({ field, definition, expected: describe, fix: fixFor(check.representation?.id) });
|
|
109
|
+
}
|
|
110
|
+
else if (Predicate.isString(fragment.pattern)) {
|
|
111
|
+
const gaps = re2Gaps(fragment.pattern).join('; ');
|
|
112
|
+
// An author rewrites their own regular expression; a built-in check such as `isTrimmed` takes the annotation.
|
|
113
|
+
const fix = check.representation?.id === 'effect/schema/isPattern'
|
|
114
|
+
? gaps
|
|
115
|
+
: `annotate the check with toJsonSchema: () => ({}) to run it only at decode (${gaps})`;
|
|
116
|
+
if (gaps.length > 0)
|
|
117
|
+
report({ field, definition, expected: describe, fix });
|
|
118
|
+
}
|
|
119
|
+
return output;
|
|
120
|
+
};
|
|
121
|
+
const annotations = toJsonSchema === undefined ? check.annotations : { ...check.annotations, toJsonSchema };
|
|
122
|
+
return check._tag === 'FilterGroup'
|
|
123
|
+
? { ...check, representation, annotations, checks: Arr.map(check.checks, (child) => traceCheck(child, field)) }
|
|
124
|
+
: { ...check, representation, annotations };
|
|
125
|
+
};
|
|
126
|
+
const trace = (node, field) => {
|
|
127
|
+
switch (node._tag) {
|
|
128
|
+
case 'Reference':
|
|
129
|
+
uses.set(node.$ref, [...(uses.get(node.$ref) ?? []), { field, definition }]);
|
|
130
|
+
return node;
|
|
131
|
+
case 'Suspend':
|
|
132
|
+
return { ...node, thunk: trace(node.thunk, field) };
|
|
133
|
+
case 'Declaration':
|
|
134
|
+
return {
|
|
135
|
+
...node,
|
|
136
|
+
checks: node.checks.map((check) => traceCheck(check, field)),
|
|
137
|
+
typeParameters: node.typeParameters.map((parameter) => trace(parameter, field)),
|
|
138
|
+
};
|
|
139
|
+
case 'Union':
|
|
140
|
+
return {
|
|
141
|
+
...node,
|
|
142
|
+
checks: node.checks.map((check) => traceCheck(check, field)),
|
|
143
|
+
types: node.types.map((member) => trace(member, field)),
|
|
144
|
+
};
|
|
145
|
+
case 'Arrays':
|
|
146
|
+
// Effect drops the item schemas of a tuple with two or more rest elements and keeps only `minItems`.
|
|
147
|
+
if (node.rest.length > 1 && node.rest.some((rest) => !acceptsAnything(rest, references))) {
|
|
148
|
+
report({
|
|
149
|
+
field: `${field}[]`,
|
|
150
|
+
definition,
|
|
151
|
+
expected: 'a tuple with more than one rest element',
|
|
152
|
+
fix: 'use one rest element, or a union of the rest element types',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
...node,
|
|
157
|
+
checks: node.checks.map((check) => traceCheck(check, field)),
|
|
158
|
+
elements: node.elements.map((element, index) => ({
|
|
159
|
+
...element,
|
|
160
|
+
type: trace(element.type, `${field}[${index}]`),
|
|
161
|
+
})),
|
|
162
|
+
rest: node.rest.map((rest) => trace(rest, `${field}[]`)),
|
|
163
|
+
};
|
|
164
|
+
case 'Objects':
|
|
165
|
+
return {
|
|
166
|
+
...node,
|
|
167
|
+
checks: node.checks.map((check) => traceCheck(check, field)),
|
|
168
|
+
propertySignatures: node.propertySignatures.map((property) => ({
|
|
169
|
+
...property,
|
|
170
|
+
type: trace(property.type, fieldOf(field, String(property.name))),
|
|
171
|
+
})),
|
|
172
|
+
indexSignatures: node.indexSignatures.map((index) => ({
|
|
173
|
+
parameter: trace(index.parameter, `${field}[key]`),
|
|
174
|
+
type: trace(index.type, `${field}[*]`),
|
|
175
|
+
})),
|
|
176
|
+
};
|
|
177
|
+
default:
|
|
178
|
+
return { ...node, checks: node.checks.map((check) => traceCheck(check, field)) };
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
return trace;
|
|
182
|
+
};
|
|
183
|
+
/** Whether effect exports `node` as `{}`, the schema every JSON value matches. */
|
|
184
|
+
const acceptsAnything = (node, references) => Object.keys(SchemaRepresentation.toJsonSchemaDocument({ representation: node, references }).schema).length === 0;
|
|
185
|
+
/** The resource fields that reach `definition`, followed through the named schemas that use it. */
|
|
186
|
+
const fieldsUsing = (definition, uses, seen = new Set()) => (uses.get(definition) ?? []).flatMap(({ field, definition: within }) => {
|
|
187
|
+
if (within === undefined)
|
|
188
|
+
return [field];
|
|
189
|
+
if (seen.has(within))
|
|
190
|
+
return [];
|
|
191
|
+
// A path traced inside a named schema starts with that schema's key.
|
|
192
|
+
const rest = field.slice(within.length);
|
|
193
|
+
return fieldsUsing(within, uses, new Set([...seen, definition])).map((outer) => outer === '' ? rest.replace(/^\./, '') : `${outer}${rest}`);
|
|
194
|
+
});
|
|
195
|
+
const describe = ({ field, definition, expected, fix }, uses) => {
|
|
196
|
+
const where = field === '' ? 'the value' : field;
|
|
197
|
+
const fields = definition === undefined ? [] : [...new Set(fieldsUsing(definition, uses))];
|
|
198
|
+
const usedBy = fields.length === 0 ? '' : ` (used by ${fields.map((name) => (name === '' ? 'the value' : name)).join(', ')})`;
|
|
199
|
+
return `- ${where}${usedBy}: ${expected}. Fix: ${fix}.`;
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* The JSON Schema of the encoded form, which deploy validates a bound value against. Fails when a check exports a
|
|
203
|
+
* weaker constraint than decoding runs, because deploy would then accept a value that every run rejects.
|
|
204
|
+
*/
|
|
205
|
+
export const deploySchemaOf = (subject, schema) => {
|
|
206
|
+
const document = SchemaRepresentation.toRepresentation(Schema.toCodecJson(schema).ast);
|
|
207
|
+
const weak = [];
|
|
208
|
+
const uses = new Map();
|
|
209
|
+
const report = (found) => weak.push(found);
|
|
210
|
+
const representation = makeTracer(report, undefined, uses, document.references)(document.representation, '');
|
|
211
|
+
const references = Object.fromEntries(Object.entries(document.references).map(([key, value]) => [
|
|
212
|
+
key,
|
|
213
|
+
makeTracer(report, key, uses, document.references)(value, key),
|
|
214
|
+
]));
|
|
215
|
+
const { schema: root, definitions } = SchemaRepresentation.toJsonSchemaDocument({ representation, references });
|
|
216
|
+
if (weak.length > 0) {
|
|
217
|
+
throw new Error([
|
|
218
|
+
`${subject}: deploy checks a weaker form of ${weak.length === 1 ? 'one rule' : `${weak.length} rules`} in the declared schema, so a bound value that breaks ${weak.length === 1 ? 'it' : 'one'} would pass deploy and fail every run.`,
|
|
219
|
+
...weak.map((found) => describe(found, uses)),
|
|
220
|
+
].join('\n'));
|
|
221
|
+
}
|
|
222
|
+
const json = Object.keys(definitions).length === 0 ? root : { ...root, $defs: definitions };
|
|
223
|
+
return Schema.decodeUnknownSync(JsonSchemaObject)(json);
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=DeploySchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeploySchema.js","sourceRoot":"","sources":["../src/DeploySchema.ts"],"names":[],"mappings":"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"}
|