lemon-core 5.0.4 → 5.0.6

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.
Files changed (60) hide show
  1. package/README.md +168 -136
  2. package/bin/lemon-fields-types.mjs +12 -0
  3. package/bin/lib/fields-types.mjs +629 -0
  4. package/dist/common/test-helper.js +6 -3
  5. package/dist/common/test-helper.js.map +1 -1
  6. package/dist/cores/aws/aws-sns-service.d.ts +6 -0
  7. package/dist/cores/aws/aws-sns-service.js +22 -3
  8. package/dist/cores/aws/aws-sns-service.js.map +1 -1
  9. package/dist/cores/aws/aws-sqs-service.js +5 -0
  10. package/dist/cores/aws/aws-sqs-service.js.map +1 -1
  11. package/dist/cores/config/config-service.js +3 -1
  12. package/dist/cores/config/config-service.js.map +1 -1
  13. package/dist/cores/lambda/lambda-alb-handler.js +5 -0
  14. package/dist/cores/lambda/lambda-alb-handler.js.map +1 -1
  15. package/dist/cores/lambda/lambda-handler.js +4 -1
  16. package/dist/cores/lambda/lambda-handler.js.map +1 -1
  17. package/dist/cores/lambda/lambda-notification-handler.js +4 -1
  18. package/dist/cores/lambda/lambda-notification-handler.js.map +1 -1
  19. package/dist/cores/lambda/lambda-sns-handler.d.ts +7 -1
  20. package/dist/cores/lambda/lambda-sns-handler.js +26 -3
  21. package/dist/cores/lambda/lambda-sns-handler.js.map +1 -1
  22. package/dist/cores/lambda/lambda-sqs-handler.d.ts +7 -1
  23. package/dist/cores/lambda/lambda-sqs-handler.js +26 -3
  24. package/dist/cores/lambda/lambda-sqs-handler.js.map +1 -1
  25. package/dist/cores/lambda/lambda-web-handler.js +63 -15
  26. package/dist/cores/lambda/lambda-web-handler.js.map +1 -1
  27. package/dist/cores/protocol/aws-lambda-helper.d.ts +13 -0
  28. package/dist/cores/protocol/aws-lambda-helper.js +64 -41
  29. package/dist/cores/protocol/aws-lambda-helper.js.map +1 -1
  30. package/dist/cores/protocol/local-transport.d.ts +135 -0
  31. package/dist/cores/protocol/local-transport.js +392 -0
  32. package/dist/cores/protocol/local-transport.js.map +1 -0
  33. package/dist/cores/protocol/protocol-relay.d.ts +123 -0
  34. package/dist/cores/protocol/protocol-relay.js +339 -0
  35. package/dist/cores/protocol/protocol-relay.js.map +1 -0
  36. package/dist/cores/protocol/protocol-service.d.ts +11 -4
  37. package/dist/cores/protocol/protocol-service.js +140 -36
  38. package/dist/cores/protocol/protocol-service.js.map +1 -1
  39. package/dist/cores/protocol/protocol-sign.d.ts +22 -0
  40. package/dist/cores/protocol/protocol-sign.js +30 -3
  41. package/dist/cores/protocol/protocol-sign.js.map +1 -1
  42. package/dist/engine/engine.js +35 -15
  43. package/dist/engine/engine.js.map +1 -1
  44. package/dist/esm/index.mjs +2 -0
  45. package/dist/extended/cores/abstract-controllers.d.ts +18 -4
  46. package/dist/extended/cores/abstract-controllers.js +59 -19
  47. package/dist/extended/cores/abstract-controllers.js.map +1 -1
  48. package/dist/extended/cores/abstract-services.d.ts +54 -4
  49. package/dist/extended/cores/abstract-services.js +159 -14
  50. package/dist/extended/cores/abstract-services.js.map +1 -1
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.js +4 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/log-mask.d.ts +19 -0
  55. package/dist/lib/log-mask.js +55 -0
  56. package/dist/lib/log-mask.js.map +1 -0
  57. package/dist/lib/safe-json.d.ts +23 -0
  58. package/dist/lib/safe-json.js +78 -0
  59. package/dist/lib/safe-json.js.map +1 -0
  60. package/package.json +14 -4
@@ -0,0 +1,123 @@
1
+ import { NextContext, NextIdentity, NextTrace } from 'lemon-model';
2
+ import { HEADER_LEMON_RELAY } from './protocol-sign';
3
+ /** header name of the web relay (defined in `protocol-sign.ts` for the log mask, re-exported here) */
4
+ export { HEADER_LEMON_RELAY };
5
+ /** field name of the relay in the SNS/SQS protocol param */
6
+ export declare const RELAY_PARAM = "relay";
7
+ /** prefix (format version) of the relay value */
8
+ export declare const RELAY_PREFIX = "r1.";
9
+ /** max bytes of a relay value (the receiver rejects a larger one) */
10
+ export declare const RELAY_MAX_BYTES = 4096;
11
+ /** identity fields that cross a hop (whitelist). nothing else of `NextIdentity` is relayed */
12
+ export declare const RELAY_IDENTITY_FIELDS: readonly ["sid", "uid", "gid", "roles", "identityId", "lang"];
13
+ /** env name of the send mode of the legacy context (`off` | `send`) */
14
+ export declare const PROTOCOL_LEGACY_CONTEXT = "PROTOCOL_LEGACY_CONTEXT";
15
+ /** env name of the receive mode of the legacy context (`accept` | `warn` | `reject`) */
16
+ export declare const PROTOCOL_LEGACY_ACCEPT = "PROTOCOL_LEGACY_ACCEPT";
17
+ /** env name of the hop cap */
18
+ export declare const PROTOCOL_MAX_HOP = "PROTOCOL_MAX_HOP";
19
+ /** default hop cap */
20
+ export declare const DEFAULT_MAX_HOP = 8;
21
+ /** a requestId used as a trace id as is (else a new uuid): the local express id `YYYY-MM-DD hh:mm:ss.SSS` is not */
22
+ export declare const SAFE_TRACE_ID: RegExp;
23
+ /** the requestId as a trace id if it is a safe token, else a new uuid (unique, no whitespace) */
24
+ export declare const traceIdOf: (requestId?: string) => string;
25
+ /** send mode of the legacy context: `off` = relay only, `send` = relay and legacy (for v4 receivers) */
26
+ export type LegacySendMode = 'off' | 'send';
27
+ /** receive mode of the legacy context */
28
+ export type LegacyAcceptMode = 'accept' | 'warn' | 'reject';
29
+ /** the relayed identity (whitelist of `NextIdentity`) */
30
+ export interface RelayIdentity {
31
+ sid?: string;
32
+ uid?: string;
33
+ gid?: string;
34
+ roles?: string[];
35
+ identityId?: string;
36
+ lang?: string;
37
+ }
38
+ /** the relay JSON (`r1.` payload) */
39
+ export interface ProtocolRelay {
40
+ /** identity summary (whitelist) */
41
+ idt?: RelayIdentity;
42
+ /** trace id: the requestId of the first entry */
43
+ tid: string;
44
+ /** hop of this call (caller hop + 1) */
45
+ hop: number;
46
+ /** the first request path uri */
47
+ src?: string;
48
+ /** service uri of the direct caller */
49
+ via?: string;
50
+ /** requestId of the direct caller */
51
+ pid?: string;
52
+ /** signing time (epoch seconds) */
53
+ iat?: number;
54
+ }
55
+ /** read the send mode of the legacy context (default `off`) */
56
+ export declare const readLegacySend: () => LegacySendMode;
57
+ /** read the receive mode of the legacy context (default `warn`) */
58
+ export declare const readLegacyAccept: () => LegacyAcceptMode;
59
+ /** read the hop cap (a positive integer, default 8) */
60
+ export declare const readMaxHop: () => number;
61
+ /** throw `508 LOOP DETECTED` if the hop is over the cap */
62
+ export declare const assertHop: (hop: number, max?: number) => void;
63
+ /** the whitelisted identity of a context (`undefined` if nothing to relay) */
64
+ export declare const relayIdentityOf: (identity?: NextIdentity) => RelayIdentity;
65
+ /**
66
+ * build the relay of the next hop from the caller context.
67
+ * - `tid` = caller `trace.tid`, else `requestId`, else a new id. `hop` = caller `trace.hop` + 1.
68
+ * - `src` = caller `trace.src`, else `source`. `pid` = caller `requestId`. `via` = the caller's service uri.
69
+ * - throws `508 LOOP DETECTED` if the next hop is over the cap (before any send).
70
+ *
71
+ * @param context the caller context
72
+ * @param options `via` (caller uri), `now` (ms, for tests), `max` (hop cap)
73
+ */
74
+ export declare const buildRelay: (context: NextContext, options?: {
75
+ via?: string;
76
+ now?: number;
77
+ max?: number;
78
+ }) => ProtocolRelay;
79
+ /** encode a relay as `r1.<base64url(JSON)>` */
80
+ export declare const encodeRelay: (relay: ProtocolRelay) => string;
81
+ /**
82
+ * decode and validate a relay value (shape, types, size). unknown keys and non-whitelisted identity keys are dropped.
83
+ * - throws `400 INVALID CONTEXT - relay <reason>` (`format`, `size`, `json`, `shape`, or the bad key).
84
+ */
85
+ export declare const decodeRelay: (text: string) => ProtocolRelay;
86
+ /**
87
+ * the receiver context of a relay (B14 D2 table).
88
+ * - `identity` = `idt`, `channel` = `internal`, `depth` = `hop`, `source` = `src`, `trace` = `{ tid, hop, via, pid, src }`.
89
+ * - `requestId`, `accountId` = the receiver's own values (`own`). nothing else of the caller crosses the hop.
90
+ */
91
+ export declare const asRelayContext: (relay: ProtocolRelay, own?: NextContext) => NextContext;
92
+ /** the channel of an entry without a protocol context: local mode wins, else `host` → `external`, else `internal` */
93
+ export declare const entryChannel: (hasHost: boolean) => NextContext["channel"];
94
+ /** the trace of an entry without a relay: `{ tid: requestId, hop: 0 }` (a new tid if the requestId is not a safe id) */
95
+ export declare const entryTrace: (context?: NextContext) => NextTrace;
96
+ /**
97
+ * the context of an in-process next hop (a same-service callback): the same rules as a relay hop.
98
+ * - `trace.hop` + 1 (cap → `508 LOOP DETECTED`), the same `tid`/`src`, `via` = this service, `pid` = this requestId.
99
+ * - `depth` = the new hop (kept in sync for v4-style code). the other fields of the context are kept.
100
+ *
101
+ * @param context the current receiver context (copied, not changed)
102
+ * @param via this service's uri
103
+ */
104
+ export declare const nextHopContext: (context: NextContext, via?: string) => NextContext;
105
+ /**
106
+ * apply `PROTOCOL_LEGACY_ACCEPT` to a legacy context (`x-protocol-context` or the SNS/SQS `context` field).
107
+ * - `reject`: throws `400 INVALID CONTEXT - legacy context rejected`. `warn`: one line. `accept`: nothing.
108
+ *
109
+ * @param transport `web` | `sns` | `sqs` (for the log line)
110
+ * @param legacy the legacy context (for the log line: the service of its `source`)
111
+ */
112
+ export declare const acceptLegacy: (transport: string, legacy?: NextContext) => void;
113
+ /** one `PROTOCOL deprecated json identity (<transport>)` line (not in `accept`). the behaviour is unchanged */
114
+ export declare const warnJsonIdentity: (transport: string) => void;
115
+ /**
116
+ * the `TRACE` line of an entry: `TRACE tid=<tid> hop=<hop> ch=<channel> via=<service|-> src=<path|->`.
117
+ * - no identity value, no account (the via host and the src path only).
118
+ */
119
+ export declare const traceLine: (context: NextContext) => string;
120
+ /** print the `TRACE` line of an entry (one per web entry and per protocol receive) */
121
+ export declare const logTrace: (context: NextContext) => void;
122
+ /** the account id (12 digits) of an ARN, or '' */
123
+ export declare const accountOfArn: (arn?: string) => string;
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.accountOfArn = exports.logTrace = exports.traceLine = exports.warnJsonIdentity = exports.acceptLegacy = exports.nextHopContext = exports.entryTrace = exports.entryChannel = exports.asRelayContext = exports.decodeRelay = exports.encodeRelay = exports.buildRelay = exports.relayIdentityOf = exports.assertHop = exports.readMaxHop = exports.readLegacyAccept = exports.readLegacySend = exports.traceIdOf = exports.SAFE_TRACE_ID = exports.DEFAULT_MAX_HOP = exports.PROTOCOL_MAX_HOP = exports.PROTOCOL_LEGACY_ACCEPT = exports.PROTOCOL_LEGACY_CONTEXT = exports.RELAY_IDENTITY_FIELDS = exports.RELAY_MAX_BYTES = exports.RELAY_PREFIX = exports.RELAY_PARAM = exports.HEADER_LEMON_RELAY = void 0;
7
+ /**
8
+ * `cores/protocol/protocol-relay.ts`
9
+ * - v5 B14: the relay envelope of an internal hop — a whitelisted identity and the trace, nothing else.
10
+ * - web: header `x-lemon-relay`. SNS/SQS: the `relay` field of the protocol param (no `context` field).
11
+ * - value `r1.<base64url(JSON)>`, JSON keys `idt tid hop src via pid iat`. signed by the existing signature
12
+ * (web: the relay string in the context slot of the canonical; SNS/SQS: the message signature).
13
+ * - the legacy `x-protocol-context` (full context) is deprecated: `PROTOCOL_LEGACY_CONTEXT` (send) and
14
+ * `PROTOCOL_LEGACY_ACCEPT` (receive) decide whether it is sent and accepted. removal in v6.
15
+ * - hop cap `PROTOCOL_MAX_HOP` (default 8): `508 LOOP DETECTED - protocol hop <n>` on send and on receive.
16
+ * - NOTE: deep module only (`./dist/cores/protocol/protocol-relay`). not re-exported by the root.
17
+ *
18
+ * @author Steve Jung <steve@lemoncloud.io>
19
+ * @date 2026-10-30 initial version (v5 B14)
20
+ * @date 2026-10-30 a safe trace id (`SAFE_TRACE_ID`), and `nextHopContext()` for an in-process (same-service) callback.
21
+ *
22
+ * @copyright (C) lemoncloud.io 2026 - All Rights Reserved.
23
+ */
24
+ const crypto_1 = require("crypto");
25
+ const url_1 = __importDefault(require("url"));
26
+ const engine_1 = require("../../engine/");
27
+ const protocol_sign_1 = require("./protocol-sign");
28
+ Object.defineProperty(exports, "HEADER_LEMON_RELAY", { enumerable: true, get: function () { return protocol_sign_1.HEADER_LEMON_RELAY; } });
29
+ const NS = engine_1.$U.NS('PRTS', 'yellow'); // NAMESPACE TO BE PRINTED.
30
+ /** field name of the relay in the SNS/SQS protocol param */
31
+ exports.RELAY_PARAM = 'relay';
32
+ /** prefix (format version) of the relay value */
33
+ exports.RELAY_PREFIX = 'r1.';
34
+ /** max bytes of a relay value (the receiver rejects a larger one) */
35
+ exports.RELAY_MAX_BYTES = 4096;
36
+ /** identity fields that cross a hop (whitelist). nothing else of `NextIdentity` is relayed */
37
+ exports.RELAY_IDENTITY_FIELDS = ['sid', 'uid', 'gid', 'roles', 'identityId', 'lang'];
38
+ /** env name of the send mode of the legacy context (`off` | `send`) */
39
+ exports.PROTOCOL_LEGACY_CONTEXT = 'PROTOCOL_LEGACY_CONTEXT';
40
+ /** env name of the receive mode of the legacy context (`accept` | `warn` | `reject`) */
41
+ exports.PROTOCOL_LEGACY_ACCEPT = 'PROTOCOL_LEGACY_ACCEPT';
42
+ /** env name of the hop cap */
43
+ exports.PROTOCOL_MAX_HOP = 'PROTOCOL_MAX_HOP';
44
+ /** default hop cap */
45
+ exports.DEFAULT_MAX_HOP = 8;
46
+ /** a requestId used as a trace id as is (else a new uuid): the local express id `YYYY-MM-DD hh:mm:ss.SSS` is not */
47
+ exports.SAFE_TRACE_ID = /^[\w.:-]{1,128}$/;
48
+ /** the requestId as a trace id if it is a safe token, else a new uuid (unique, no whitespace) */
49
+ const traceIdOf = (requestId) => typeof requestId === 'string' && exports.SAFE_TRACE_ID.test(requestId) ? requestId : (0, crypto_1.randomUUID)();
50
+ exports.traceIdOf = traceIdOf;
51
+ //* the relay keys in the order they are written.
52
+ const RELAY_KEYS = ['idt', 'tid', 'hop', 'src', 'via', 'pid', 'iat'];
53
+ //* max length of a string field of the relay.
54
+ const MAX_TEXT = 2048;
55
+ /** read the send mode of the legacy context (default `off`) */
56
+ const readLegacySend = () => `${(0, protocol_sign_1.readConfig)(exports.PROTOCOL_LEGACY_CONTEXT) ?? ''}`.trim().toLowerCase() === 'send' ? 'send' : 'off';
57
+ exports.readLegacySend = readLegacySend;
58
+ /** read the receive mode of the legacy context (default `warn`) */
59
+ const readLegacyAccept = () => {
60
+ const mode = `${(0, protocol_sign_1.readConfig)(exports.PROTOCOL_LEGACY_ACCEPT) ?? ''}`.trim().toLowerCase();
61
+ return mode === 'accept' || mode === 'reject' ? mode : 'warn';
62
+ };
63
+ exports.readLegacyAccept = readLegacyAccept;
64
+ /** read the hop cap (a positive integer, default 8) */
65
+ const readMaxHop = () => {
66
+ const n = Number(`${(0, protocol_sign_1.readConfig)(exports.PROTOCOL_MAX_HOP) ?? ''}`.trim() || NaN);
67
+ return Number.isInteger(n) && n > 0 ? n : exports.DEFAULT_MAX_HOP;
68
+ };
69
+ exports.readMaxHop = readMaxHop;
70
+ /** throw `508 LOOP DETECTED` if the hop is over the cap */
71
+ const assertHop = (hop, max = (0, exports.readMaxHop)()) => {
72
+ if (hop > max)
73
+ throw new Error(`508 LOOP DETECTED - protocol hop ${hop}`);
74
+ };
75
+ exports.assertHop = assertHop;
76
+ /** the whitelisted identity of a context (`undefined` if nothing to relay) */
77
+ const relayIdentityOf = (identity) => {
78
+ if (!identity || typeof identity !== 'object')
79
+ return undefined;
80
+ const idt = {};
81
+ const src = identity;
82
+ //* copy only the whitelisted fields of the right type.
83
+ exports.RELAY_IDENTITY_FIELDS.forEach(k => {
84
+ const v = src[k];
85
+ if (k === 'roles') {
86
+ if (Array.isArray(v))
87
+ idt.roles = v.filter(r => typeof r === 'string');
88
+ }
89
+ else if (typeof v === 'string')
90
+ idt[k] = v;
91
+ });
92
+ return Object.keys(idt).length ? idt : undefined;
93
+ };
94
+ exports.relayIdentityOf = relayIdentityOf;
95
+ /**
96
+ * build the relay of the next hop from the caller context.
97
+ * - `tid` = caller `trace.tid`, else `requestId`, else a new id. `hop` = caller `trace.hop` + 1.
98
+ * - `src` = caller `trace.src`, else `source`. `pid` = caller `requestId`. `via` = the caller's service uri.
99
+ * - throws `508 LOOP DETECTED` if the next hop is over the cap (before any send).
100
+ *
101
+ * @param context the caller context
102
+ * @param options `via` (caller uri), `now` (ms, for tests), `max` (hop cap)
103
+ */
104
+ const buildRelay = (context, options) => {
105
+ const trace = context?.trace;
106
+ const hop = (Number.isInteger(trace?.hop) && trace.hop >= 0 ? trace.hop : 0) + 1;
107
+ (0, exports.assertHop)(hop, options?.max);
108
+ const text = (v) => (typeof v === 'string' && v ? v : undefined);
109
+ const relay = {
110
+ idt: (0, exports.relayIdentityOf)(context?.identity),
111
+ tid: text(trace?.tid) ?? (0, exports.traceIdOf)(context?.requestId),
112
+ hop,
113
+ src: text(trace?.src) ?? text(context?.source),
114
+ via: text(options?.via),
115
+ pid: text(context?.requestId),
116
+ iat: Math.floor((options?.now ?? Date.now()) / 1000),
117
+ };
118
+ //* drop empty keys (smaller value, stable shape).
119
+ return RELAY_KEYS.reduce((R, k) => {
120
+ if (relay[k] !== undefined)
121
+ R[k] = relay[k];
122
+ return R;
123
+ }, {});
124
+ };
125
+ exports.buildRelay = buildRelay;
126
+ /** encode a relay as `r1.<base64url(JSON)>` */
127
+ const encodeRelay = (relay) => `${exports.RELAY_PREFIX}${Buffer.from(JSON.stringify(relay), 'utf8').toString('base64url')}`;
128
+ exports.encodeRelay = encodeRelay;
129
+ //* the error of a bad relay.
130
+ const invalid = (reason) => new Error(`400 INVALID CONTEXT - relay ${reason}`);
131
+ /**
132
+ * decode and validate a relay value (shape, types, size). unknown keys and non-whitelisted identity keys are dropped.
133
+ * - throws `400 INVALID CONTEXT - relay <reason>` (`format`, `size`, `json`, `shape`, or the bad key).
134
+ */
135
+ const decodeRelay = (text) => {
136
+ if (typeof text !== 'string' || !text.startsWith(exports.RELAY_PREFIX))
137
+ throw invalid('format');
138
+ if (Buffer.byteLength(text, 'utf8') > exports.RELAY_MAX_BYTES)
139
+ throw invalid('size');
140
+ //* base64url → JSON.
141
+ const data = (() => {
142
+ try {
143
+ return JSON.parse(Buffer.from(text.substring(exports.RELAY_PREFIX.length), 'base64url').toString('utf8'));
144
+ }
145
+ catch (e) {
146
+ throw invalid('json');
147
+ }
148
+ })();
149
+ if (!data || typeof data !== 'object' || Array.isArray(data))
150
+ throw invalid('shape');
151
+ //* string fields: optional, bounded.
152
+ const str = (k, required) => {
153
+ const v = data[k];
154
+ if (v === undefined && !required)
155
+ return undefined;
156
+ if (typeof v !== 'string' || (required && !v) || v.length > MAX_TEXT)
157
+ throw invalid(k);
158
+ return v;
159
+ };
160
+ const relay = { tid: str('tid', true), hop: data.hop };
161
+ if (!Number.isInteger(data.hop) || data.hop < 0)
162
+ throw invalid('hop');
163
+ if (data.idt !== undefined)
164
+ relay.idt = decodeIdentity(data.idt);
165
+ ['src', 'via', 'pid'].forEach(k => {
166
+ const v = str(k);
167
+ if (v !== undefined)
168
+ relay[k] = v;
169
+ });
170
+ if (data.iat !== undefined) {
171
+ if (typeof data.iat !== 'number' || !Number.isFinite(data.iat))
172
+ throw invalid('iat');
173
+ relay.iat = data.iat;
174
+ }
175
+ //* the key order of the encoder (so a decoded relay equals the built one).
176
+ return RELAY_KEYS.reduce((R, k) => {
177
+ if (relay[k] !== undefined)
178
+ R[k] = relay[k];
179
+ return R;
180
+ }, {});
181
+ };
182
+ exports.decodeRelay = decodeRelay;
183
+ //* validate the `idt` of a relay (whitelisted keys only, typed).
184
+ const decodeIdentity = (idt) => {
185
+ if (!idt || typeof idt !== 'object' || Array.isArray(idt))
186
+ throw invalid('idt');
187
+ const res = {};
188
+ exports.RELAY_IDENTITY_FIELDS.forEach(k => {
189
+ const v = idt[k];
190
+ if (v === undefined || v === null)
191
+ return;
192
+ if (k === 'roles') {
193
+ if (!Array.isArray(v) || v.some(r => typeof r !== 'string'))
194
+ throw invalid('idt.roles');
195
+ res.roles = [...v];
196
+ }
197
+ else {
198
+ if (typeof v !== 'string' || v.length > MAX_TEXT)
199
+ throw invalid(`idt.${k}`);
200
+ res[k] = v;
201
+ }
202
+ });
203
+ return res;
204
+ };
205
+ /**
206
+ * the receiver context of a relay (B14 D2 table).
207
+ * - `identity` = `idt`, `channel` = `internal`, `depth` = `hop`, `source` = `src`, `trace` = `{ tid, hop, via, pid, src }`.
208
+ * - `requestId`, `accountId` = the receiver's own values (`own`). nothing else of the caller crosses the hop.
209
+ */
210
+ const asRelayContext = (relay, own) => {
211
+ const trace = { tid: relay.tid, hop: relay.hop };
212
+ if (relay.via !== undefined)
213
+ trace.via = relay.via;
214
+ if (relay.pid !== undefined)
215
+ trace.pid = relay.pid;
216
+ if (relay.src !== undefined)
217
+ trace.src = relay.src;
218
+ const context = {
219
+ identity: { ...(relay.idt || {}) },
220
+ channel: 'internal',
221
+ depth: relay.hop,
222
+ source: relay.src,
223
+ trace,
224
+ requestId: own?.requestId,
225
+ accountId: own?.accountId,
226
+ };
227
+ //* drop the undefined keys.
228
+ return Object.entries(context).reduce((M, [k, v]) => {
229
+ if (v !== undefined)
230
+ M[k] = v;
231
+ return M;
232
+ }, {});
233
+ };
234
+ exports.asRelayContext = asRelayContext;
235
+ /** the channel of an entry without a protocol context: local mode wins, else `host` → `external`, else `internal` */
236
+ const entryChannel = (hasHost) => engine_1.$U.isLocalMode() ? 'local' : hasHost ? 'external' : 'internal';
237
+ exports.entryChannel = entryChannel;
238
+ /** the trace of an entry without a relay: `{ tid: requestId, hop: 0 }` (a new tid if the requestId is not a safe id) */
239
+ const entryTrace = (context) => ({
240
+ tid: (0, exports.traceIdOf)(context?.requestId),
241
+ hop: 0,
242
+ });
243
+ exports.entryTrace = entryTrace;
244
+ /**
245
+ * the context of an in-process next hop (a same-service callback): the same rules as a relay hop.
246
+ * - `trace.hop` + 1 (cap → `508 LOOP DETECTED`), the same `tid`/`src`, `via` = this service, `pid` = this requestId.
247
+ * - `depth` = the new hop (kept in sync for v4-style code). the other fields of the context are kept.
248
+ *
249
+ * @param context the current receiver context (copied, not changed)
250
+ * @param via this service's uri
251
+ */
252
+ const nextHopContext = (context, via) => {
253
+ const trace = context?.trace;
254
+ const hop = (Number.isInteger(trace?.hop) && trace.hop >= 0 ? trace.hop : 0) + 1;
255
+ (0, exports.assertHop)(hop);
256
+ const next = { tid: trace?.tid || (0, exports.traceIdOf)(context?.requestId), hop };
257
+ if (via)
258
+ next.via = via;
259
+ if (context?.requestId)
260
+ next.pid = context.requestId;
261
+ const src = trace?.src ?? context?.source;
262
+ if (src)
263
+ next.src = src;
264
+ return { ...context, depth: hop, trace: next };
265
+ };
266
+ exports.nextHopContext = nextHopContext;
267
+ /**
268
+ * apply `PROTOCOL_LEGACY_ACCEPT` to a legacy context (`x-protocol-context` or the SNS/SQS `context` field).
269
+ * - `reject`: throws `400 INVALID CONTEXT - legacy context rejected`. `warn`: one line. `accept`: nothing.
270
+ *
271
+ * @param transport `web` | `sns` | `sqs` (for the log line)
272
+ * @param legacy the legacy context (for the log line: the service of its `source`)
273
+ */
274
+ const acceptLegacy = (transport, legacy) => {
275
+ const mode = (0, exports.readLegacyAccept)();
276
+ if (mode === 'reject')
277
+ throw new Error(`400 INVALID CONTEXT - legacy context rejected`);
278
+ if (mode === 'warn')
279
+ (0, engine_1._inf)(NS, `PROTOCOL deprecated x-protocol-context ${hostOf(legacy?.source)} (${transport})`);
280
+ };
281
+ exports.acceptLegacy = acceptLegacy;
282
+ /** one `PROTOCOL deprecated json identity (<transport>)` line (not in `accept`). the behaviour is unchanged */
283
+ const warnJsonIdentity = (transport) => {
284
+ if ((0, exports.readLegacyAccept)() !== 'accept')
285
+ (0, engine_1._inf)(NS, `PROTOCOL deprecated json identity (${transport})`);
286
+ };
287
+ exports.warnJsonIdentity = warnJsonIdentity;
288
+ //* a log token: no whitespace, bounded (a relay value cannot break the line).
289
+ const token = (v) => {
290
+ const s = `${v ?? ''}`.replace(/\s/g, '_').substring(0, 128);
291
+ return s || '-';
292
+ };
293
+ //* the host (service) of a protocol uri, without the account and the version ('-' if none).
294
+ const hostOf = (uri) => {
295
+ try {
296
+ return token(uri ? url_1.default.parse(uri).hostname : '');
297
+ }
298
+ catch (e) {
299
+ return '-';
300
+ }
301
+ };
302
+ //* the path of a protocol uri ('-' if none).
303
+ const pathOf = (uri) => {
304
+ try {
305
+ const path = uri ? url_1.default.parse(uri).pathname : '';
306
+ return token(path && path !== '/' ? path : '');
307
+ }
308
+ catch (e) {
309
+ return '-';
310
+ }
311
+ };
312
+ /**
313
+ * the `TRACE` line of an entry: `TRACE tid=<tid> hop=<hop> ch=<channel> via=<service|-> src=<path|->`.
314
+ * - no identity value, no account (the via host and the src path only).
315
+ */
316
+ const traceLine = (context) => {
317
+ const trace = context?.trace;
318
+ const src = trace?.src ?? context?.source;
319
+ return [
320
+ `TRACE tid=${token(trace?.tid)}`,
321
+ `hop=${token(trace?.hop)}`,
322
+ `ch=${token(context?.channel)}`,
323
+ `via=${hostOf(trace?.via)}`,
324
+ `src=${pathOf(src)}`,
325
+ ].join(' ');
326
+ };
327
+ exports.traceLine = traceLine;
328
+ /** print the `TRACE` line of an entry (one per web entry and per protocol receive) */
329
+ const logTrace = (context) => {
330
+ (0, engine_1._inf)(NS, (0, exports.traceLine)(context));
331
+ };
332
+ exports.logTrace = logTrace;
333
+ /** the account id (12 digits) of an ARN, or '' */
334
+ const accountOfArn = (arn) => {
335
+ const id = `${arn || ''}`.split(':')[4] || '';
336
+ return /^\d{12}$/.test(id) ? id : '';
337
+ };
338
+ exports.accountOfArn = accountOfArn;
339
+ //# sourceMappingURL=protocol-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-relay.js","sourceRoot":"","sources":["../../../src/cores/protocol/protocol-relay.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { NextContext } from 'lemon-model';
2
2
  import { STAGE, ProtocolService, ProtocolParam, ProtocolTransformer, ProtocolBody, CallbackParam, ProtocolExecuteOptions } from './../core-services';
3
3
  import { APIGatewayProxyEvent, SNSMessage, SQSRecord } from 'aws-lambda';
4
4
  import { ConfigService } from './../config/config-service';
5
+ import { HEADER_PROTOCOL_CONTEXT } from './protocol-sign';
5
6
  /**
6
7
  * a message attribute of SNS/SQS (local structural type = the SDK `MessageAttributeValue`; v5 B2-c).
7
8
  */
@@ -13,8 +14,10 @@ interface MyMessageAttributeValue {
13
14
  /**
14
15
  * header name to exchange `next-context`
15
16
  * ONLY for internal communication.
17
+ * - v5 B10-3: defined in `protocol-sign.ts`, re-exported here (same name, same value).
18
+ * - v5 B14: deprecated (see the definition) — the relay `x-lemon-relay` replaces it; removal in v6.
16
19
  */
17
- export declare const HEADER_PROTOCOL_CONTEXT: any;
20
+ export { HEADER_PROTOCOL_CONTEXT };
18
21
  /**
19
22
  * type: MyProtocolType
20
23
  * - supportable type of protocol
@@ -163,6 +166,7 @@ export declare class MyProtocolService implements ProtocolService {
163
166
  * - transformer for `WEB` Handler
164
167
  */
165
168
  export declare class WEBProtocolTransformer implements ProtocolTransformer<APIGatewayProxyEvent, APIGatewayProxyEvent> {
169
+ private service;
166
170
  constructor(service?: MyProtocolService);
167
171
  /**
168
172
  * transform param to event
@@ -189,9 +193,11 @@ export declare class SNSProtocolTransformer implements ProtocolTransformer<MySNS
189
193
  transformToEvent(uri: string, param: ProtocolParam, callback?: string): MySNSEventParam;
190
194
  /**
191
195
  * transform event data to param
196
+ * - v5 B14: the context comes from the `relay` (wins) or the legacy `context` (see `receiveContext()`).
192
197
  * @param event the lambda compartible event data.
198
+ * @param own (optional) the receiver's own `requestId`/`accountId` (for a relay)
193
199
  */
194
- transformToParam(event: SNSMessage): MyProtocolParam;
200
+ transformToParam(event: SNSMessage, own?: NextContext): MyProtocolParam;
195
201
  }
196
202
  /**
197
203
  * the SQS send input this service builds (local structural type, the fields it uses; v5 B2-c).
@@ -216,8 +222,9 @@ export declare class SQSProtocolTransformer implements ProtocolTransformer<SQSEv
216
222
  transformToEvent(uri: string, param: ProtocolParam, callback?: string): SQSEventParam;
217
223
  /**
218
224
  * transform event data to param
225
+ * - v5 B14: the context comes from the `relay` (wins) or the legacy `context` (see `receiveContext()`).
219
226
  * @param event the lambda compartible event data.
227
+ * @param own (optional) the receiver's own `requestId`/`accountId` (for a relay)
220
228
  */
221
- transformToParam(event: SQSRecord): MyProtocolParam;
229
+ transformToParam(event: SQSRecord, own?: NextContext): MyProtocolParam;
222
230
  }
223
- export {};