@ontemper/sdk 0.5.1 → 0.6.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 +28 -4
- package/dist/As2.d.ts +158 -0
- package/dist/As2.d.ts.map +1 -0
- package/dist/As2.js +529 -0
- package/dist/As2.js.map +1 -0
- package/dist/As2Destination.d.ts +10 -0
- package/dist/As2Destination.d.ts.map +1 -0
- package/dist/As2Destination.js +63 -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 +78 -0
- package/dist/As2Testing.d.ts.map +1 -0
- package/dist/As2Testing.js +355 -0
- package/dist/As2Testing.js.map +1 -0
- package/dist/As2Transport.d.ts +30 -0
- package/dist/As2Transport.d.ts.map +1 -0
- package/dist/As2Transport.js +88 -0
- package/dist/As2Transport.js.map +1 -0
- package/dist/As2Wire.d.ts +338 -0
- package/dist/As2Wire.d.ts.map +1 -0
- package/dist/As2Wire.js +202 -0
- package/dist/As2Wire.js.map +1 -0
- package/dist/HttpClient.d.ts +19 -0
- package/dist/HttpClient.d.ts.map +1 -1
- package/dist/HttpClient.js +10 -5
- package/dist/HttpClient.js.map +1 -1
- package/dist/Manifest.d.ts +1 -1
- package/dist/Manifest.js +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/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/dist/As2.js
ADDED
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
import { Context, Duration, Effect, Layer, Option, Redacted, Schema, Stream } from 'effect';
|
|
2
|
+
import { FetchHttpClient, HttpClient, HttpClientRequest, HttpServerResponse, } from 'effect/http';
|
|
3
|
+
import { lookupAllAddresses, publicAddressesOf } from './As2Destination.js';
|
|
4
|
+
import { As2Error } from './As2Error.js';
|
|
5
|
+
import { bunFetch, deliveryTransport, pinnedDestination } from './As2Transport.js';
|
|
6
|
+
import { AcknowledgeAnswer, answerAs2Failures, as2Line, bytesOf, CAPACITY_BACKOFF_MS, CAPACITY_RETRIES, ConfirmAnswer, endOf, endpointOf, ErrorAnswer, fromBase64, headerOf, isEmptyBody, isHttpUrl, MAX_PARTNER_RESPONSE_BYTES, originOf, PackAnswer, partiesOf, present, protocolHeaders, ReceiveAnswer, Settings, SettleAnswer, symbolicCause, toBase64, wireParties, } from './As2Wire.js';
|
|
7
|
+
import { isTransientStatus } from './EdiError.js';
|
|
8
|
+
import { Invocation } from './Invocation.js';
|
|
9
|
+
import { CurrentLogContext, TRACE_HEADER, withSpanLines } from './LogContext.js';
|
|
10
|
+
import { registerSecrets } from './Redaction.js';
|
|
11
|
+
export { As2Error } from './As2Error.js';
|
|
12
|
+
export { as2FailureResponse } from './As2Wire.js';
|
|
13
|
+
export { As2Route } from './As2Route.js';
|
|
14
|
+
export { As2IdentityResource, As2PartnerResource } from './As2Resource.js';
|
|
15
|
+
/** The route an async receipt is posted to, under the sending workflow's own URL. */
|
|
16
|
+
export const AS2_ASYNC_RECEIPT_PATH = '/as2/mdn';
|
|
17
|
+
/** RFC 2045 quoted-string unquote for AS2-From and AS2-To: a bare token passes through. */
|
|
18
|
+
export const unquoteAs2Id = (value) => {
|
|
19
|
+
const trimmed = (value ?? '').trim();
|
|
20
|
+
if (trimmed.length < 2 || !trimmed.startsWith('"') || !trimmed.endsWith('"'))
|
|
21
|
+
return trimmed;
|
|
22
|
+
return trimmed.slice(1, -1).replace(/\\(.)/g, '$1');
|
|
23
|
+
};
|
|
24
|
+
/** Runs `effect` on the exchange's verified trace; with none, on the current one. */
|
|
25
|
+
export const withExchangeTrace = (customerTraceId) => (effect) => customerTraceId === null
|
|
26
|
+
? effect
|
|
27
|
+
: Effect.withFiber((fiber) => Effect.provideService(effect, CurrentLogContext, {
|
|
28
|
+
...fiber.getRef(CurrentLogContext),
|
|
29
|
+
traceId: customerTraceId,
|
|
30
|
+
}));
|
|
31
|
+
const retryLater = () => HttpServerResponse.text('AS2 message is being processed; retry later', {
|
|
32
|
+
status: 503,
|
|
33
|
+
headers: { 'retry-after': '60' },
|
|
34
|
+
});
|
|
35
|
+
const receiptResponse = (mdnMode, mdn) => mdnMode === 'async' || mdn === null
|
|
36
|
+
? HttpServerResponse.empty({ status: 200 })
|
|
37
|
+
: HttpServerResponse.uint8Array(mdn.body, {
|
|
38
|
+
status: 200,
|
|
39
|
+
headers: mdn.headers,
|
|
40
|
+
contentType: headerOf(mdn.headers, 'content-type'),
|
|
41
|
+
});
|
|
42
|
+
const makeAs2 = (lookupAddresses, bun) => Effect.gen(function* () {
|
|
43
|
+
const client = yield* HttpClient.HttpClient;
|
|
44
|
+
const settings = (operation) => Settings.pipe(Effect.mapError((cause) => new As2Error({
|
|
45
|
+
operation,
|
|
46
|
+
code: 'NOT_CONFIGURED',
|
|
47
|
+
retryable: false,
|
|
48
|
+
message: `AS2 settings are unreadable: ${cause.message}`,
|
|
49
|
+
})));
|
|
50
|
+
/** One call to `/api/v2/internal/as2/<path>` with the Run token, retried while the engine answers 503. */
|
|
51
|
+
const platform = (operation, path, body, answer) => Effect.gen(function* () {
|
|
52
|
+
const config = yield* settings(operation);
|
|
53
|
+
const invocation = yield* Invocation;
|
|
54
|
+
const apiUrl = Option.filter(config.apiUrl, (url) => url.length > 0);
|
|
55
|
+
if (Option.isNone(apiUrl)) {
|
|
56
|
+
return yield* new As2Error({
|
|
57
|
+
operation,
|
|
58
|
+
code: 'NOT_CONFIGURED',
|
|
59
|
+
retryable: false,
|
|
60
|
+
message: 'UNNBOUND_API_URL is not set; the AS2 service is unreachable.',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const token = invocation.token.length > 0
|
|
64
|
+
? Option.some(invocation.token)
|
|
65
|
+
: Option.orElse(present(config.envToken), () => present(config.sandboxToken));
|
|
66
|
+
if (Option.isNone(token)) {
|
|
67
|
+
return yield* new As2Error({
|
|
68
|
+
operation,
|
|
69
|
+
code: 'NOT_CONFIGURED',
|
|
70
|
+
retryable: false,
|
|
71
|
+
message: 'AS2 requires a Run token or a workflow-scoped sandbox token.',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const url = `${apiUrl.value.replace(/\/+$/u, '')}/api/v2/internal/as2/${path}`;
|
|
75
|
+
const request = HttpClientRequest.post(url).pipe(HttpClientRequest.bearerToken(token.value), HttpClientRequest.bodyJsonUnsafe(body));
|
|
76
|
+
for (let attempt = 0;; attempt++) {
|
|
77
|
+
const response = yield* client.execute(request).pipe(
|
|
78
|
+
// Bodies carry decrypted documents, envelopes, receipts, and delivery tokens; the AS2 lines tell the story.
|
|
79
|
+
Effect.provideService(HttpClient.TracerDisabledWhen, () => true),
|
|
80
|
+
// A redirect must not carry the Run token or the body elsewhere.
|
|
81
|
+
Effect.provideService(FetchHttpClient.RequestInit, { redirect: 'error' }), Effect.mapError((cause) => new As2Error({
|
|
82
|
+
operation,
|
|
83
|
+
code: 'NETWORK_ERROR',
|
|
84
|
+
retryable: true,
|
|
85
|
+
message: `The AS2 service did not answer: ${symbolicCause(cause)}`,
|
|
86
|
+
})));
|
|
87
|
+
if (response.status === 503 && attempt < CAPACITY_RETRIES) {
|
|
88
|
+
const seconds = Number(response.headers['retry-after'] ?? Number.NaN);
|
|
89
|
+
const wait = Number.isFinite(seconds) && seconds >= 0
|
|
90
|
+
? Math.min(seconds, 30) * 1000
|
|
91
|
+
: CAPACITY_BACKOFF_MS * (attempt + 1);
|
|
92
|
+
yield* Effect.ignore(response.text);
|
|
93
|
+
yield* Effect.sleep(Duration.millis(wait));
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (response.status < 200 || response.status >= 300) {
|
|
97
|
+
const status = response.status;
|
|
98
|
+
const failure = yield* response.json.pipe(Effect.flatMap(Schema.decodeUnknownEffect(ErrorAnswer)), Effect.map((body) => body.error), Effect.orElseSucceed(() => undefined));
|
|
99
|
+
return yield* new As2Error({
|
|
100
|
+
operation,
|
|
101
|
+
code: failure?.code ?? (status === 401 || status === 403 ? 'UNAUTHORIZED' : 'API_ERROR'),
|
|
102
|
+
retryable: isTransientStatus(status),
|
|
103
|
+
status,
|
|
104
|
+
message: failure?.message ?? `The AS2 service answered HTTP ${status}.`,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return yield* response.json.pipe(Effect.flatMap(Schema.decodeUnknownEffect(answer)), Effect.mapError(() => new As2Error({
|
|
108
|
+
operation,
|
|
109
|
+
code: 'INVALID_API_RESPONSE',
|
|
110
|
+
retryable: false,
|
|
111
|
+
status: response.status,
|
|
112
|
+
message: 'The AS2 service answered an unexpected body.',
|
|
113
|
+
})));
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const mdnOf = (headers, bodyB64, operation) => {
|
|
117
|
+
if (headers === null && bodyB64 === null)
|
|
118
|
+
return Effect.succeed(null);
|
|
119
|
+
if (headers === null || bodyB64 === null) {
|
|
120
|
+
return Effect.fail(new As2Error({
|
|
121
|
+
operation,
|
|
122
|
+
code: 'INVALID_API_RESPONSE',
|
|
123
|
+
retryable: false,
|
|
124
|
+
message: 'The AS2 service answered an incomplete MDN.',
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
return Effect.succeed({ headers, body: fromBase64(bodyB64) });
|
|
128
|
+
};
|
|
129
|
+
/** One milestone line, on the exchange's trace when the ledger names one. */
|
|
130
|
+
const milestone = (message, fields, customerTraceId = null) => Effect.logInfo(message, as2Line(fields)).pipe(withExchangeTrace(customerTraceId));
|
|
131
|
+
const warn = (message, fields) => Effect.logWarning(message, as2Line({ ...fields, outcome: 'failed' }));
|
|
132
|
+
const acknowledge = (deliveryToken) => Effect.gen(function* () {
|
|
133
|
+
const answer = yield* platform('acknowledge', 'acknowledge', { deliveryToken }, AcknowledgeAnswer);
|
|
134
|
+
const mdn = yield* mdnOf(answer.mdnHeaders, answer.mdnBodyB64, 'acknowledge');
|
|
135
|
+
yield* milestone('AS2 MDN generated.', {
|
|
136
|
+
operation: 'mdn-generate',
|
|
137
|
+
messageId: answer.messageId,
|
|
138
|
+
mdnMode: answer.mdnMode,
|
|
139
|
+
outcome: 'generated',
|
|
140
|
+
replayed: answer.alreadyAcknowledged,
|
|
141
|
+
byteLength: mdn?.body.byteLength,
|
|
142
|
+
}, answer.customerTraceId);
|
|
143
|
+
return {
|
|
144
|
+
messageId: answer.messageId,
|
|
145
|
+
mic: answer.mic,
|
|
146
|
+
mdn,
|
|
147
|
+
mdnMode: answer.mdnMode,
|
|
148
|
+
mdnDeliveryUrl: answer.mdnDeliveryUrl,
|
|
149
|
+
alreadyAcknowledged: answer.alreadyAcknowledged,
|
|
150
|
+
customerTraceId: answer.customerTraceId,
|
|
151
|
+
response: receiptResponse(answer.mdnMode, mdn),
|
|
152
|
+
};
|
|
153
|
+
}).pipe(Effect.tapError((error) => warn('AS2 acknowledgement failed.', { operation: 'mdn-generate', errorCode: error.code })));
|
|
154
|
+
const readRequest = (operation, request) => request.arrayBuffer.pipe(Effect.map((buffer) => new Uint8Array(buffer)), Effect.mapError(() => new As2Error({
|
|
155
|
+
operation,
|
|
156
|
+
code: 'BAD_REQUEST',
|
|
157
|
+
retryable: false,
|
|
158
|
+
status: 400,
|
|
159
|
+
message: 'The request body could not be read.',
|
|
160
|
+
})));
|
|
161
|
+
const receive = (options) => Effect.gen(function* () {
|
|
162
|
+
const headers = options.request.headers;
|
|
163
|
+
const proto = headers['x-forwarded-proto']?.split(',')[0]?.trim().toLowerCase();
|
|
164
|
+
const transportScheme = proto === 'http' || proto === 'https' ? proto : undefined;
|
|
165
|
+
const body = yield* readRequest('receive', options.request);
|
|
166
|
+
const fields = {
|
|
167
|
+
operation: 'receive',
|
|
168
|
+
scheme: transportScheme,
|
|
169
|
+
port: transportScheme === undefined ? undefined : transportScheme === 'https' ? 443 : 80,
|
|
170
|
+
clientIp: headers['x-forwarded-for']?.split(',')[0]?.trim(),
|
|
171
|
+
as2From: headers['as2-from'],
|
|
172
|
+
as2To: headers['as2-to'],
|
|
173
|
+
partner: options.partner.as2Id,
|
|
174
|
+
byteLength: body.byteLength,
|
|
175
|
+
};
|
|
176
|
+
const answer = yield* Effect.gen(function* () {
|
|
177
|
+
const parties = yield* wireParties(yield* partiesOf('receive', options));
|
|
178
|
+
return yield* platform('receive', 'receive', { ...parties, headers: protocolHeaders(headers), transportScheme, bodyB64: toBase64(body) }, ReceiveAnswer);
|
|
179
|
+
}).pipe(Effect.tapError((error) => warn('AS2 receive failed.', { ...fields, errorCode: error.code })));
|
|
180
|
+
if (answer.kind === 'inFlight' || answer.kind === 'parked') {
|
|
181
|
+
yield* milestone(answer.kind === 'inFlight' ? 'AS2 message already processing.' : 'AS2 message parked.', {
|
|
182
|
+
...fields,
|
|
183
|
+
messageId: answer.messageId,
|
|
184
|
+
outcome: answer.kind,
|
|
185
|
+
});
|
|
186
|
+
return { kind: answer.kind, messageId: answer.messageId, response: retryLater() };
|
|
187
|
+
}
|
|
188
|
+
if (answer.kind === 'duplicate') {
|
|
189
|
+
const mdn = yield* mdnOf(answer.mdnHeaders, answer.mdnBodyB64, 'receive');
|
|
190
|
+
yield* milestone('AS2 duplicate message answered.', { ...fields, messageId: answer.messageId, mdnMode: answer.mdnMode, outcome: 'duplicate' }, answer.customerTraceId);
|
|
191
|
+
return {
|
|
192
|
+
kind: 'duplicate',
|
|
193
|
+
messageId: answer.messageId,
|
|
194
|
+
mic: answer.mic,
|
|
195
|
+
mdn,
|
|
196
|
+
mdnMode: answer.mdnMode,
|
|
197
|
+
mdnDeliveryUrl: answer.mdnDeliveryUrl,
|
|
198
|
+
alreadyAcknowledged: true,
|
|
199
|
+
customerTraceId: answer.customerTraceId,
|
|
200
|
+
response: receiptResponse(answer.mdnMode, mdn),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
yield* milestone('AS2 message received.', {
|
|
204
|
+
...fields,
|
|
205
|
+
messageId: answer.messageId,
|
|
206
|
+
contentType: answer.payloadContentType ?? undefined,
|
|
207
|
+
mdnMode: answer.mdnMode,
|
|
208
|
+
outcome: 'received',
|
|
209
|
+
}, answer.customerTraceId);
|
|
210
|
+
return {
|
|
211
|
+
kind: 'received',
|
|
212
|
+
messageId: answer.messageId,
|
|
213
|
+
payload: fromBase64(answer.payloadB64),
|
|
214
|
+
contentType: answer.payloadContentType,
|
|
215
|
+
mic: answer.mic,
|
|
216
|
+
mdnMode: answer.mdnMode,
|
|
217
|
+
customerTraceId: answer.customerTraceId,
|
|
218
|
+
acknowledge: acknowledge(answer.deliveryToken),
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
const confirm = (options) => Effect.gen(function* () {
|
|
222
|
+
const mdn = options.mdn ?? {
|
|
223
|
+
headers: { ...options.request.headers },
|
|
224
|
+
body: yield* readRequest('confirm', options.request),
|
|
225
|
+
};
|
|
226
|
+
const answer = yield* Effect.gen(function* () {
|
|
227
|
+
const parties = yield* wireParties(yield* partiesOf('confirm', options));
|
|
228
|
+
return yield* platform('confirm', 'confirm', {
|
|
229
|
+
...parties,
|
|
230
|
+
originalMessageId: options.originalMessageId ?? null,
|
|
231
|
+
mdnHeaders: protocolHeaders(mdn.headers),
|
|
232
|
+
mdnBodyB64: toBase64(mdn.body),
|
|
233
|
+
}, ConfirmAnswer);
|
|
234
|
+
}).pipe(Effect.tapError((error) => warn('AS2 MDN verification failed.', {
|
|
235
|
+
operation: 'mdn-verify',
|
|
236
|
+
originalMessageId: options.originalMessageId,
|
|
237
|
+
partner: options.partner.as2Id,
|
|
238
|
+
errorCode: error.code,
|
|
239
|
+
})));
|
|
240
|
+
// The current trace (an async callback's own) logs it, with a link to the sending trace; it never re-binds.
|
|
241
|
+
const line = as2Line({
|
|
242
|
+
operation: 'mdn-verify',
|
|
243
|
+
originalMessageId: answer.messageId,
|
|
244
|
+
partner: options.partner.as2Id,
|
|
245
|
+
outcome: answer.outcome,
|
|
246
|
+
disposition: answer.disposition ?? undefined,
|
|
247
|
+
micMatched: answer.micMatched,
|
|
248
|
+
originatingTraceId: answer.originatingTraceId ?? undefined,
|
|
249
|
+
byteLength: mdn.body.byteLength,
|
|
250
|
+
});
|
|
251
|
+
yield* answer.outcome === 'confirmed'
|
|
252
|
+
? Effect.logInfo('AS2 MDN verified.', line)
|
|
253
|
+
: Effect.logWarning('AS2 MDN verified.', line);
|
|
254
|
+
return answer;
|
|
255
|
+
});
|
|
256
|
+
const deliveryFailure = (code, operation, cause) => new As2Error({ operation, code, retryable: true, message: `request failed: ${symbolicCause(cause)}` });
|
|
257
|
+
/** The partner's answer, read up to the cap; a longer answer fails the delivery. */
|
|
258
|
+
const readCapped = (response, operation, code) => Effect.gen(function* () {
|
|
259
|
+
const declared = Number(response.headers['content-length'] ?? Number.NaN);
|
|
260
|
+
const tooLarge = new As2Error({
|
|
261
|
+
operation,
|
|
262
|
+
code,
|
|
263
|
+
retryable: false,
|
|
264
|
+
status: response.status,
|
|
265
|
+
message: 'The partner answered more than 8 MiB.',
|
|
266
|
+
});
|
|
267
|
+
if (Number.isFinite(declared) && declared > MAX_PARTNER_RESPONSE_BYTES)
|
|
268
|
+
return yield* tooLarge;
|
|
269
|
+
const chunks = [];
|
|
270
|
+
let size = 0;
|
|
271
|
+
yield* Stream.runForEach(response.stream, (chunk) => {
|
|
272
|
+
size += chunk.byteLength;
|
|
273
|
+
chunks.push(chunk);
|
|
274
|
+
return size > MAX_PARTNER_RESPONSE_BYTES ? Effect.fail(tooLarge) : Effect.void;
|
|
275
|
+
}).pipe(
|
|
276
|
+
// A response without a body is an empty answer, such as an async partner's bare 200.
|
|
277
|
+
Effect.catchIf(isEmptyBody, () => Effect.void), Effect.mapError((cause) => (cause instanceof As2Error ? cause : deliveryFailure(code, operation, cause))));
|
|
278
|
+
const bytes = new Uint8Array(size);
|
|
279
|
+
let offset = 0;
|
|
280
|
+
for (const chunk of chunks) {
|
|
281
|
+
bytes.set(chunk, offset);
|
|
282
|
+
offset += chunk.byteLength;
|
|
283
|
+
}
|
|
284
|
+
return bytes;
|
|
285
|
+
});
|
|
286
|
+
const deliverMdn = (mdn, url) => {
|
|
287
|
+
let status;
|
|
288
|
+
const refuseMdn = (code, message) => Effect.fail(new As2Error({ operation: 'deliverMdn', code, retryable: false, message }));
|
|
289
|
+
return Effect.gen(function* () {
|
|
290
|
+
if (!isHttpUrl(url))
|
|
291
|
+
return yield* refuseMdn('MDN_DELIVERY_FAILED', 'The MDN destination is not an http(s) URL.');
|
|
292
|
+
const parsed = new URL(url);
|
|
293
|
+
if (parsed.username !== '' || parsed.password !== '')
|
|
294
|
+
return yield* refuseMdn('MDN_DELIVERY_FAILED', 'The MDN destination carries credentials.');
|
|
295
|
+
const addresses = yield* Effect.tryPromise({
|
|
296
|
+
try: () => publicAddressesOf(parsed.hostname, lookupAddresses),
|
|
297
|
+
catch: (cause) => deliveryFailure('MDN_DELIVERY_FAILED', 'deliverMdn', cause instanceof Error ? cause : new Error('lookup failed')),
|
|
298
|
+
});
|
|
299
|
+
const checked = addresses?.[0];
|
|
300
|
+
if (checked === undefined) {
|
|
301
|
+
return yield* refuseMdn('MDN_DESTINATION_BLOCKED', 'The MDN destination resolves to a private or reserved address.');
|
|
302
|
+
}
|
|
303
|
+
// On Bun the POST goes to the checked address, as legacy dialed it, so a name that rebinds cannot redirect it.
|
|
304
|
+
const pinned = bun ? pinnedDestination(parsed, checked) : undefined;
|
|
305
|
+
const outbound = { redirect: 'manual', ...pinned?.transport };
|
|
306
|
+
const response = yield* client
|
|
307
|
+
.execute(HttpClientRequest.post(pinned?.url ?? url).pipe(HttpClientRequest.bodyUint8Array(mdn.body, headerOf(mdn.headers, 'content-type')), HttpClientRequest.setHeaders(mdn.headers), (request) => (pinned === undefined ? request : HttpClientRequest.setHeader(request, 'host', pinned.host))))
|
|
308
|
+
.pipe(Effect.provideService(HttpClient.TracerDisabledWhen, () => true),
|
|
309
|
+
// The partner controls the URL; a redirect would send the POST where the destination check never looked.
|
|
310
|
+
Effect.provideService(FetchHttpClient.RequestInit, outbound), Effect.mapError((cause) => deliveryFailure('MDN_DELIVERY_FAILED', 'deliverMdn', cause)));
|
|
311
|
+
status = response.status;
|
|
312
|
+
yield* readCapped(response, 'deliverMdn', 'MDN_DELIVERY_FAILED');
|
|
313
|
+
if (response.status < 200 || response.status >= 300) {
|
|
314
|
+
return yield* new As2Error({
|
|
315
|
+
operation: 'deliverMdn',
|
|
316
|
+
code: 'MDN_DELIVERY_FAILED',
|
|
317
|
+
retryable: isTransientStatus(response.status),
|
|
318
|
+
status: response.status,
|
|
319
|
+
message: `The partner answered HTTP ${response.status}.`,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}).pipe(withSpanLines('AS2 MDN delivery', (outcome) => as2Line({
|
|
323
|
+
operation: 'mdn-deliver',
|
|
324
|
+
...originOf(url),
|
|
325
|
+
as2From: headerOf(mdn.headers, 'as2-from'),
|
|
326
|
+
as2To: headerOf(mdn.headers, 'as2-to'),
|
|
327
|
+
byteLength: mdn.body.byteLength,
|
|
328
|
+
status,
|
|
329
|
+
...endOf(outcome, 'delivered'),
|
|
330
|
+
})), Effect.asVoid);
|
|
331
|
+
};
|
|
332
|
+
const refuse = (code, message) => Effect.fail(new As2Error({ operation: 'send', code, retryable: false, message }));
|
|
333
|
+
/** Checks that run before pack: pack records a pending message, so a refusal after it would strand that row. */
|
|
334
|
+
const checkDestination = (url, options) => Effect.gen(function* () {
|
|
335
|
+
const { partner } = options;
|
|
336
|
+
if (!isHttpUrl(url))
|
|
337
|
+
return yield* refuse('INVALID_PARTNER_URL', 'The partner URL must be an http(s) URL.');
|
|
338
|
+
const parsed = new URL(url);
|
|
339
|
+
if (parsed.username !== '' || parsed.password !== '')
|
|
340
|
+
return yield* refuse('INVALID_PARTNER_URL', 'The partner URL must not carry credentials.');
|
|
341
|
+
const basic = partner.httpAuth.type === 'basic';
|
|
342
|
+
const credentialed = basic || partner.tls?.clientCertificate !== undefined || partner.tls?.clientKey !== undefined;
|
|
343
|
+
const configured = partner.url;
|
|
344
|
+
if (options.url !== undefined &&
|
|
345
|
+
credentialed &&
|
|
346
|
+
(configured === undefined || parsed.origin !== new URL(configured).origin)) {
|
|
347
|
+
return yield* refuse('PARTNER_CREDENTIAL_ORIGIN_MISMATCH', 'Partner credentials go only to the origin of the partner URL.');
|
|
348
|
+
}
|
|
349
|
+
if (basic && parsed.protocol !== 'https:')
|
|
350
|
+
return yield* refuse('INSECURE_CREDENTIAL_TRANSPORT', 'HTTP Basic delivery auth requires an https:// partner URL.');
|
|
351
|
+
const transport = deliveryTransport(partner, parsed, bun);
|
|
352
|
+
if (transport.kind === 'refused')
|
|
353
|
+
return yield* refuse(transport.code, transport.message);
|
|
354
|
+
});
|
|
355
|
+
const receiptUrlFor = (partner, options) => Effect.gen(function* () {
|
|
356
|
+
if (partner.receipt !== 'async')
|
|
357
|
+
return null;
|
|
358
|
+
if (options.receiptUrl !== undefined) {
|
|
359
|
+
if (!isHttpUrl(options.receiptUrl))
|
|
360
|
+
return yield* refuse('NOT_CONFIGURED', 'receiptUrl must be an http(s) URL.');
|
|
361
|
+
return options.receiptUrl;
|
|
362
|
+
}
|
|
363
|
+
const workflowUrl = Option.getOrUndefined((yield* settings('send')).workflowUrl)?.trim() ?? '';
|
|
364
|
+
// Partners reach workflows over HTTPS only, so a scheme-less value gets https://.
|
|
365
|
+
const href = /^https?:\/\//iu.test(workflowUrl) ? workflowUrl : `https://${workflowUrl}`;
|
|
366
|
+
if (workflowUrl === '' || !isHttpUrl(href)) {
|
|
367
|
+
return yield* refuse('NOT_CONFIGURED', 'The partner asks for async receipts, but neither receiptUrl nor UNNBOUND_WORKFLOW_URL is set.');
|
|
368
|
+
}
|
|
369
|
+
return `${href.replace(/\/+$/u, '')}${AS2_ASYNC_RECEIPT_PATH}`;
|
|
370
|
+
});
|
|
371
|
+
const deliver = (url, envelope, as2Headers, parties, messageId) => {
|
|
372
|
+
let status;
|
|
373
|
+
const auth = parties.partner.httpAuth;
|
|
374
|
+
return Effect.gen(function* () {
|
|
375
|
+
if (auth.type === 'basic')
|
|
376
|
+
yield* registerSecrets([Redacted.value(auth.password)]);
|
|
377
|
+
const transport = deliveryTransport(parties.partner, new URL(url), bun);
|
|
378
|
+
if (transport.kind === 'refused') {
|
|
379
|
+
return yield* new As2Error({
|
|
380
|
+
operation: 'send',
|
|
381
|
+
code: transport.code,
|
|
382
|
+
retryable: false,
|
|
383
|
+
message: transport.message,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
// AS2 endpoints are fixed, agreed URLs; a redirect would send the envelope where the partner's gateway chose.
|
|
387
|
+
const outbound = { redirect: 'manual', ...transport.transport };
|
|
388
|
+
const response = yield* client
|
|
389
|
+
.execute(HttpClientRequest.post(url).pipe(HttpClientRequest.bodyUint8Array(envelope, headerOf(as2Headers, 'content-type')), HttpClientRequest.setHeaders(as2Headers), (request) => auth.type === 'basic'
|
|
390
|
+
? HttpClientRequest.basicAuth(request, auth.username, Redacted.value(auth.password))
|
|
391
|
+
: request))
|
|
392
|
+
.pipe(Effect.provideService(HttpClient.TracerDisabledWhen, () => true), Effect.provideService(FetchHttpClient.RequestInit, outbound), Effect.mapError((cause) => deliveryFailure('DELIVERY_FAILED', 'send', cause)));
|
|
393
|
+
status = response.status;
|
|
394
|
+
const body = yield* readCapped(response, 'send', 'DELIVERY_FAILED');
|
|
395
|
+
if (response.status < 200 || response.status >= 300) {
|
|
396
|
+
return yield* new As2Error({
|
|
397
|
+
operation: 'send',
|
|
398
|
+
code: 'DELIVERY_FAILED',
|
|
399
|
+
retryable: isTransientStatus(response.status),
|
|
400
|
+
status: response.status,
|
|
401
|
+
message: `The partner answered HTTP ${response.status}.`,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
return { headers: { ...response.headers }, body };
|
|
405
|
+
}).pipe(withSpanLines('AS2 delivery', (outcome) => as2Line({
|
|
406
|
+
operation: 'deliver',
|
|
407
|
+
messageId,
|
|
408
|
+
as2From: parties.identity.as2Id,
|
|
409
|
+
as2To: parties.partner.as2Id,
|
|
410
|
+
partner: parties.partner.as2Id,
|
|
411
|
+
...endpointOf(url),
|
|
412
|
+
byteLength: envelope.byteLength,
|
|
413
|
+
attempt: 1,
|
|
414
|
+
status,
|
|
415
|
+
...endOf(outcome, 'delivered'),
|
|
416
|
+
})));
|
|
417
|
+
};
|
|
418
|
+
const send = (payloadInput, options) => {
|
|
419
|
+
const payload = bytesOf(payloadInput);
|
|
420
|
+
const summary = {
|
|
421
|
+
operation: 'send',
|
|
422
|
+
partner: options.partner.as2Id,
|
|
423
|
+
as2To: options.partner.as2Id,
|
|
424
|
+
byteLength: payload.byteLength,
|
|
425
|
+
contentType: options.contentType,
|
|
426
|
+
};
|
|
427
|
+
return Effect.gen(function* () {
|
|
428
|
+
const intended = options.url ?? options.partner.url;
|
|
429
|
+
if (intended === undefined)
|
|
430
|
+
return yield* refuse('NO_PARTNER_URL', 'The partner record has no URL and the call passed none.');
|
|
431
|
+
Object.assign(summary, endpointOf(intended));
|
|
432
|
+
yield* checkDestination(intended, options);
|
|
433
|
+
const parties = yield* partiesOf('send', options);
|
|
434
|
+
summary.as2From = parties.identity.as2Id;
|
|
435
|
+
const receiptUrl = yield* receiptUrlFor(parties.partner, options);
|
|
436
|
+
const wire = yield* wireParties(parties);
|
|
437
|
+
const packed = yield* platform('send', 'pack', {
|
|
438
|
+
...wire,
|
|
439
|
+
payloadB64: toBase64(payload),
|
|
440
|
+
payloadContentType: options.contentType,
|
|
441
|
+
subject: options.subject ?? null,
|
|
442
|
+
idempotencyKey: options.idempotencyKey ?? null,
|
|
443
|
+
receiptUrl,
|
|
444
|
+
}, PackAnswer);
|
|
445
|
+
const url = options.url ?? packed.partnerUrl ?? intended;
|
|
446
|
+
summary.messageId = packed.messageId;
|
|
447
|
+
summary.replayed = packed.replayed;
|
|
448
|
+
if (packed.mdnMode !== 'none')
|
|
449
|
+
summary.mdnMode = packed.mdnMode;
|
|
450
|
+
// On a replay the ledger names the first send's trace: a link from this trace, never a re-bind.
|
|
451
|
+
if (packed.replayed && packed.customerTraceId !== null)
|
|
452
|
+
summary.originatingTraceId = packed.customerTraceId;
|
|
453
|
+
Object.assign(summary, endpointOf(url));
|
|
454
|
+
const delivered = yield* deliver(url, fromBase64(packed.envelopeBodyB64), packed.as2Headers, parties, packed.messageId);
|
|
455
|
+
const result = (outcome, disposition, customerTraceId) => {
|
|
456
|
+
summary.outcome = outcome;
|
|
457
|
+
return {
|
|
458
|
+
messageId: packed.messageId,
|
|
459
|
+
mic: packed.mic,
|
|
460
|
+
replayed: packed.replayed,
|
|
461
|
+
outcome,
|
|
462
|
+
disposition,
|
|
463
|
+
customerTraceId,
|
|
464
|
+
};
|
|
465
|
+
};
|
|
466
|
+
if (packed.mdnMode === 'none') {
|
|
467
|
+
const settled = yield* platform('send', 'settle-delivery', { ...wire, messageId: packed.messageId }, SettleAnswer);
|
|
468
|
+
return result('confirmed', null, settled.customerTraceId);
|
|
469
|
+
}
|
|
470
|
+
if (!/multipart\/(signed|report)|pkcs7/iu.test(headerOf(delivered.headers, 'content-type') ?? '')) {
|
|
471
|
+
if (packed.mdnMode === 'sync') {
|
|
472
|
+
return yield* new As2Error({
|
|
473
|
+
operation: 'send',
|
|
474
|
+
code: 'MDN_MISSING',
|
|
475
|
+
retryable: false,
|
|
476
|
+
message: 'The partner answered success without the synchronous MDN it owes.',
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return result('pending', null, packed.customerTraceId);
|
|
480
|
+
}
|
|
481
|
+
const confirmed = yield* confirm({
|
|
482
|
+
partner: options.partner,
|
|
483
|
+
identity: parties.identity,
|
|
484
|
+
originalMessageId: packed.messageId,
|
|
485
|
+
mdn: delivered,
|
|
486
|
+
}).pipe(Effect.mapError((error) => new As2Error({
|
|
487
|
+
operation: 'send',
|
|
488
|
+
code: error.code,
|
|
489
|
+
retryable: error.retryable,
|
|
490
|
+
status: error.status,
|
|
491
|
+
message: error.message,
|
|
492
|
+
})));
|
|
493
|
+
summary.disposition = confirmed.disposition ?? undefined;
|
|
494
|
+
summary.micMatched = confirmed.micMatched;
|
|
495
|
+
return result(confirmed.outcome, confirmed.disposition, packed.customerTraceId);
|
|
496
|
+
}).pipe(withSpanLines('AS2 send', (outcome) => as2Line(outcome?.error === undefined ? summary : { ...summary, ...endOf(outcome, undefined) })));
|
|
497
|
+
};
|
|
498
|
+
const inbound = (options, handle) => Effect.gen(function* () {
|
|
499
|
+
const partner = yield* options.partner(unquoteAs2Id(options.request.headers['as2-from']));
|
|
500
|
+
const received = yield* receive({ request: options.request, partner, identity: options.identity });
|
|
501
|
+
if (received.kind !== 'received' && received.kind !== 'duplicate')
|
|
502
|
+
return received.response;
|
|
503
|
+
const response = yield* Effect.gen(function* () {
|
|
504
|
+
const receipt = received.kind === 'received' ? yield* Effect.andThen(handle(received), received.acknowledge) : received;
|
|
505
|
+
if (receipt.mdnMode === 'async' && receipt.mdn !== null && receipt.mdnDeliveryUrl !== null)
|
|
506
|
+
yield* deliverMdn(receipt.mdn, receipt.mdnDeliveryUrl);
|
|
507
|
+
return receipt.response;
|
|
508
|
+
}).pipe(answerAs2Failures, withExchangeTrace(received.customerTraceId));
|
|
509
|
+
return received.customerTraceId === null
|
|
510
|
+
? response
|
|
511
|
+
: HttpServerResponse.setHeader(response, TRACE_HEADER, received.customerTraceId);
|
|
512
|
+
}).pipe(
|
|
513
|
+
// Partner selection and verification fail before any exchange trace: the partner still reads the status.
|
|
514
|
+
answerAs2Failures);
|
|
515
|
+
return { receive, inbound, send, confirm, deliverMdn };
|
|
516
|
+
});
|
|
517
|
+
/**
|
|
518
|
+
* First-party AS2 on the workflow's `HttpClient`, logger, and Run token: `yield* As2` in a handler layer and
|
|
519
|
+
* provide `As2.layer`. All S/MIME crypto runs on the platform; the SDK carries bytes and records.
|
|
520
|
+
*/
|
|
521
|
+
export class As2 extends Context.Service()('@temper/workflow/As2') {
|
|
522
|
+
static layer = Layer.effect(As2, makeAs2(lookupAllAddresses, bunFetch()));
|
|
523
|
+
/**
|
|
524
|
+
* `layer` with a replaced name lookup for the async-MDN destination check, and optionally the runtime: `bun`
|
|
525
|
+
* applies partner TLS, proxies, and address pinning through the `fetch` options Bun takes.
|
|
526
|
+
*/
|
|
527
|
+
static layerWith = (options) => Layer.effect(As2, makeAs2(options.lookupAddresses, (options.runtime ?? (bunFetch() ? 'bun' : 'fetch')) === 'bun'));
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=As2.js.map
|
package/dist/As2.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"As2.js","sourceRoot":"","sources":["../src/As2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Resolves a host name to every address it has now. */
|
|
2
|
+
export type LookupAddresses = (hostname: string) => Promise<ReadonlyArray<string>>;
|
|
3
|
+
export declare const lookupAllAddresses: LookupAddresses;
|
|
4
|
+
/** Only global unicast addresses pass: loopback, private, link-local, metadata, and mapped forms fail. */
|
|
5
|
+
export declare const isPublicAddress: (address: string) => boolean;
|
|
6
|
+
/** The addresses a host reaches when every one is public; `undefined` for a private, reserved, or unresolved host. */
|
|
7
|
+
export declare const publicAddressesOf: (host: string, lookupAddresses: LookupAddresses) => Promise<ReadonlyArray<string> | undefined>;
|
|
8
|
+
/** An IP literal must be public; a name passes only when every address it resolves to is public. */
|
|
9
|
+
export declare const isPublicDestination: (host: string, lookupAddresses: LookupAddresses) => Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=As2Destination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"As2Destination.d.ts","sourceRoot":"","sources":["../src/As2Destination.ts"],"names":[],"mappings":"AAGA,wDAAwD;AACxD,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnF,eAAO,MAAM,kBAAkB,EAAE,eACyD,CAAC;AAwC3F,0GAA0G;AAC1G,eAAO,MAAM,eAAe,YAAa,MAAM,KAAG,OAKjD,CAAC;AAEF,sHAAsH;AACtH,eAAO,MAAM,iBAAiB,SACtB,MAAM,mBACK,eAAe,KAC/B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAO3C,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,SAAgB,MAAM,mBAAmB,eAAe,KAAG,OAAO,CAAC,OAAO,CAC1C,CAAC"}
|