@end-close/relay 0.12.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/COMPATIBILITY.md +39 -0
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/config/schema.d.ts +993 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +156 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/crypto/at-rest.d.ts +6 -0
- package/dist/crypto/at-rest.d.ts.map +1 -0
- package/dist/crypto/at-rest.js +19 -0
- package/dist/crypto/at-rest.js.map +1 -0
- package/dist/crypto/keys.d.ts +2 -0
- package/dist/crypto/keys.d.ts.map +1 -0
- package/dist/crypto/keys.js +12 -0
- package/dist/crypto/keys.js.map +1 -0
- package/dist/engine/codec.d.ts +12 -0
- package/dist/engine/codec.d.ts.map +1 -0
- package/dist/engine/codec.js +21 -0
- package/dist/engine/codec.js.map +1 -0
- package/dist/engine/hooks.d.ts +84 -0
- package/dist/engine/hooks.d.ts.map +1 -0
- package/dist/engine/hooks.js +34 -0
- package/dist/engine/hooks.js.map +1 -0
- package/dist/engine/ingest.d.ts +39 -0
- package/dist/engine/ingest.d.ts.map +1 -0
- package/dist/engine/ingest.js +131 -0
- package/dist/engine/ingest.js.map +1 -0
- package/dist/engine/memory-store.d.ts +35 -0
- package/dist/engine/memory-store.d.ts.map +1 -0
- package/dist/engine/memory-store.js +205 -0
- package/dist/engine/memory-store.js.map +1 -0
- package/dist/engine/relay.d.ts +116 -0
- package/dist/engine/relay.d.ts.map +1 -0
- package/dist/engine/relay.js +180 -0
- package/dist/engine/relay.js.map +1 -0
- package/dist/engine/secrets.d.ts +18 -0
- package/dist/engine/secrets.d.ts.map +1 -0
- package/dist/engine/secrets.js +42 -0
- package/dist/engine/secrets.js.map +1 -0
- package/dist/engine/settings.d.ts +29 -0
- package/dist/engine/settings.d.ts.map +1 -0
- package/dist/engine/settings.js +13 -0
- package/dist/engine/settings.js.map +1 -0
- package/dist/engine/store.d.ts +141 -0
- package/dist/engine/store.d.ts.map +1 -0
- package/dist/engine/store.js +52 -0
- package/dist/engine/store.js.map +1 -0
- package/dist/forward/backoff.d.ts +3 -0
- package/dist/forward/backoff.d.ts.map +1 -0
- package/dist/forward/backoff.js +10 -0
- package/dist/forward/backoff.js.map +1 -0
- package/dist/forward/dispatcher.d.ts +98 -0
- package/dist/forward/dispatcher.d.ts.map +1 -0
- package/dist/forward/dispatcher.js +444 -0
- package/dist/forward/dispatcher.js.map +1 -0
- package/dist/forward/endclose-client.d.ts +42 -0
- package/dist/forward/endclose-client.d.ts.map +1 -0
- package/dist/forward/endclose-client.js +76 -0
- package/dist/forward/endclose-client.js.map +1 -0
- package/dist/forward/enrich.d.ts +39 -0
- package/dist/forward/enrich.d.ts.map +1 -0
- package/dist/forward/enrich.js +77 -0
- package/dist/forward/enrich.js.map +1 -0
- package/dist/forward/mapper.d.ts +50 -0
- package/dist/forward/mapper.d.ts.map +1 -0
- package/dist/forward/mapper.js +141 -0
- package/dist/forward/mapper.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/adapters/generic-hmac.d.ts +3 -0
- package/dist/ingest/adapters/generic-hmac.d.ts.map +1 -0
- package/dist/ingest/adapters/generic-hmac.js +60 -0
- package/dist/ingest/adapters/generic-hmac.js.map +1 -0
- package/dist/ingest/adapters/payabli.d.ts +3 -0
- package/dist/ingest/adapters/payabli.d.ts.map +1 -0
- package/dist/ingest/adapters/payabli.js +57 -0
- package/dist/ingest/adapters/payabli.js.map +1 -0
- package/dist/ingest/adapters/registry.d.ts +4 -0
- package/dist/ingest/adapters/registry.d.ts.map +1 -0
- package/dist/ingest/adapters/registry.js +16 -0
- package/dist/ingest/adapters/registry.js.map +1 -0
- package/dist/ingest/adapters/types.d.ts +28 -0
- package/dist/ingest/adapters/types.d.ts.map +1 -0
- package/dist/ingest/adapters/types.js +5 -0
- package/dist/ingest/adapters/types.js.map +1 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +14 -0
- package/dist/logger.js.map +1 -0
- package/dist/mask/defaults.d.ts +7 -0
- package/dist/mask/defaults.d.ts.map +1 -0
- package/dist/mask/defaults.js +51 -0
- package/dist/mask/defaults.js.map +1 -0
- package/dist/mask/paths.d.ts +7 -0
- package/dist/mask/paths.d.ts.map +1 -0
- package/dist/mask/paths.js +36 -0
- package/dist/mask/paths.js.map +1 -0
- package/dist/util/payload-shape.d.ts +6 -0
- package/dist/util/payload-shape.d.ts.map +1 -0
- package/dist/util/payload-shape.js +19 -0
- package/dist/util/payload-shape.js.map +1 -0
- package/dist/util/strings.d.ts +3 -0
- package/dist/util/strings.d.ts.map +1 -0
- package/dist/util/strings.js +7 -0
- package/dist/util/strings.js.map +1 -0
- package/package.json +57 -0
- package/src/config/schema.ts +177 -0
- package/src/crypto/at-rest.ts +21 -0
- package/src/crypto/keys.ts +13 -0
- package/src/engine/codec.ts +30 -0
- package/src/engine/hooks.ts +76 -0
- package/src/engine/ingest.ts +194 -0
- package/src/engine/memory-store.ts +232 -0
- package/src/engine/relay.ts +294 -0
- package/src/engine/secrets.ts +51 -0
- package/src/engine/settings.ts +42 -0
- package/src/engine/store.ts +188 -0
- package/src/forward/backoff.ts +10 -0
- package/src/forward/dispatcher.ts +504 -0
- package/src/forward/endclose-client.ts +102 -0
- package/src/forward/enrich.ts +106 -0
- package/src/forward/mapper.ts +191 -0
- package/src/index.ts +47 -0
- package/src/ingest/adapters/generic-hmac.ts +70 -0
- package/src/ingest/adapters/payabli.ts +67 -0
- package/src/ingest/adapters/registry.ts +21 -0
- package/src/ingest/adapters/types.ts +33 -0
- package/src/logger.ts +26 -0
- package/src/mask/defaults.ts +56 -0
- package/src/mask/paths.ts +36 -0
- package/src/util/payload-shape.ts +19 -0
- package/src/util/strings.ts +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/engine/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,UAAU,EACX,MAAM,YAAY,CAAA;AASnB,qBAAa,gBAAiB,YAAW,UAAU,EAAE,eAAe;IAClE,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAAI;IAEZ,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAkB1C,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMnD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAc3F,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9F,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9E,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvF,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe/D,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa3D,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;IAsBhF,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKrD,IAAI,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAQ/F,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAMhD,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAkBtC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAUxC,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,UAAU;CAInB;AAED,wBAAgB,WAAW,IAAI,gBAAgB,CAE9C"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// In-process EventStore for development, tests and single-process experiments. Not
|
|
2
|
+
// durable: everything is lost when the process exits. It is the reference semantics for
|
|
3
|
+
// the store contract (see the contract test suite).
|
|
4
|
+
const DUE = ['pending', 'retry'];
|
|
5
|
+
const TERMINAL = ['delivered', 'dropped_by_filter'];
|
|
6
|
+
export class MemoryEventStore {
|
|
7
|
+
rows = new Map();
|
|
8
|
+
byKey = new Map();
|
|
9
|
+
nextId = 1;
|
|
10
|
+
async insert(e) {
|
|
11
|
+
if (this.byKey.has(e.idempotency_key))
|
|
12
|
+
return { duplicate: true };
|
|
13
|
+
const id = String(this.nextId++);
|
|
14
|
+
this.rows.set(id, {
|
|
15
|
+
...e,
|
|
16
|
+
id,
|
|
17
|
+
attempts: 0,
|
|
18
|
+
next_attempt_at: e.received_at,
|
|
19
|
+
delivered_at: null,
|
|
20
|
+
bulk_request_id: null,
|
|
21
|
+
last_error: null,
|
|
22
|
+
claimed_by: null,
|
|
23
|
+
lease_until: null,
|
|
24
|
+
});
|
|
25
|
+
this.byKey.set(e.idempotency_key, id);
|
|
26
|
+
return { duplicate: false, id };
|
|
27
|
+
}
|
|
28
|
+
async routesWithDueEvents(now) {
|
|
29
|
+
const out = new Set();
|
|
30
|
+
for (const r of this.rows.values())
|
|
31
|
+
if (this.isDue(r, now))
|
|
32
|
+
out.add(r.route_id);
|
|
33
|
+
return [...out];
|
|
34
|
+
}
|
|
35
|
+
async claimDue(routeId, now, limit, lease) {
|
|
36
|
+
const due = [...this.rows.values()]
|
|
37
|
+
// Map iteration is insertion order, and ids are assigned in insertion order.
|
|
38
|
+
.filter((r) => r.route_id === routeId && this.isDue(r, now))
|
|
39
|
+
.slice(0, limit);
|
|
40
|
+
for (const r of due) {
|
|
41
|
+
r.status = 'delivering';
|
|
42
|
+
r.next_attempt_at = now;
|
|
43
|
+
r.claimed_by = lease.owner;
|
|
44
|
+
r.lease_until = lease.until;
|
|
45
|
+
}
|
|
46
|
+
return due.map((r) => ({ ...r }));
|
|
47
|
+
}
|
|
48
|
+
async markDelivered(ids, deliveredAt, bulkRequestId) {
|
|
49
|
+
for (const r of this.pick(ids)) {
|
|
50
|
+
r.status = 'delivered';
|
|
51
|
+
r.delivered_at = deliveredAt;
|
|
52
|
+
r.bulk_request_id = bulkRequestId;
|
|
53
|
+
r.last_error = null;
|
|
54
|
+
this.clearLease(r);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async markFailed(ids, nextAttemptAt, error) {
|
|
58
|
+
for (const r of this.pick(ids)) {
|
|
59
|
+
r.status = 'retry';
|
|
60
|
+
r.attempts += 1;
|
|
61
|
+
r.next_attempt_at = nextAttemptAt;
|
|
62
|
+
r.last_error = error.slice(0, 500);
|
|
63
|
+
this.clearLease(r);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async markParked(ids, error) {
|
|
67
|
+
for (const r of this.pick(ids)) {
|
|
68
|
+
r.status = 'parked';
|
|
69
|
+
r.last_error = error.slice(0, 500);
|
|
70
|
+
this.clearLease(r);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async releaseDelivering(ids, nextAttemptAt, error) {
|
|
74
|
+
let n = 0;
|
|
75
|
+
for (const r of this.pick(ids)) {
|
|
76
|
+
if (r.status !== 'delivering')
|
|
77
|
+
continue;
|
|
78
|
+
r.status = 'retry';
|
|
79
|
+
r.attempts += 1;
|
|
80
|
+
r.next_attempt_at = nextAttemptAt;
|
|
81
|
+
r.last_error = error.slice(0, 500);
|
|
82
|
+
this.clearLease(r);
|
|
83
|
+
n++;
|
|
84
|
+
}
|
|
85
|
+
return n;
|
|
86
|
+
}
|
|
87
|
+
async recoverDelivering(now, owner) {
|
|
88
|
+
let n = 0;
|
|
89
|
+
for (const r of this.rows.values()) {
|
|
90
|
+
if (r.status !== 'delivering')
|
|
91
|
+
continue;
|
|
92
|
+
const mine = owner !== undefined && r.claimed_by === owner;
|
|
93
|
+
if (r.lease_until === null || r.lease_until < now || mine) {
|
|
94
|
+
r.status = 'retry';
|
|
95
|
+
r.next_attempt_at = now;
|
|
96
|
+
this.clearLease(r);
|
|
97
|
+
n++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return n;
|
|
101
|
+
}
|
|
102
|
+
async parkExpired(now, maxAgeMs) {
|
|
103
|
+
const cutoff = new Date(Date.parse(now) - maxAgeMs).toISOString();
|
|
104
|
+
let n = 0;
|
|
105
|
+
for (const r of this.rows.values()) {
|
|
106
|
+
if (r.status === 'retry' && r.received_at < cutoff) {
|
|
107
|
+
r.status = 'parked';
|
|
108
|
+
r.last_error = 'retry window exhausted';
|
|
109
|
+
n++;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return n;
|
|
113
|
+
}
|
|
114
|
+
async pruneBatch(now, deliveredDays, ledgerDays, limit) {
|
|
115
|
+
const wipeCutoff = new Date(Date.parse(now) - deliveredDays * 86_400_000).toISOString();
|
|
116
|
+
const deleteCutoff = new Date(Date.parse(now) - ledgerDays * 86_400_000).toISOString();
|
|
117
|
+
const terminal = [...this.rows.values()].filter((r) => TERMINAL.includes(r.status));
|
|
118
|
+
const toWipe = terminal.filter((r) => r.received_at < wipeCutoff && r.payload.length > 0).slice(0, limit);
|
|
119
|
+
if (toWipe.length > 0) {
|
|
120
|
+
for (const r of toWipe) {
|
|
121
|
+
r.payload = Buffer.alloc(0);
|
|
122
|
+
r.payload_iv = null;
|
|
123
|
+
r.headers_json = '{}';
|
|
124
|
+
}
|
|
125
|
+
return { wiped: toWipe.length, deleted: 0 };
|
|
126
|
+
}
|
|
127
|
+
const toDelete = terminal.filter((r) => r.received_at < deleteCutoff).slice(0, limit);
|
|
128
|
+
for (const r of toDelete) {
|
|
129
|
+
this.rows.delete(r.id);
|
|
130
|
+
this.byKey.delete(r.idempotency_key);
|
|
131
|
+
}
|
|
132
|
+
return { wiped: 0, deleted: toDelete.length };
|
|
133
|
+
}
|
|
134
|
+
// ── admin ──
|
|
135
|
+
async getById(id) {
|
|
136
|
+
const r = this.rows.get(id);
|
|
137
|
+
return r ? { ...r } : undefined;
|
|
138
|
+
}
|
|
139
|
+
async list(filter) {
|
|
140
|
+
return [...this.rows.values()]
|
|
141
|
+
.filter((r) => (!filter.status || r.status === filter.status) && (!filter.route || r.route_id === filter.route))
|
|
142
|
+
.sort((a, b) => Number(b.id) - Number(a.id))
|
|
143
|
+
.slice(0, filter.limit ?? 50)
|
|
144
|
+
.map(({ payload: _p, payload_iv: _iv, headers_json: _h, idempotency_key: _k, claimed_by: _c, lease_until: _l, ...rest }) => rest);
|
|
145
|
+
}
|
|
146
|
+
async countByStatus() {
|
|
147
|
+
const out = {};
|
|
148
|
+
for (const r of this.rows.values())
|
|
149
|
+
out[r.status] = (out[r.status] ?? 0) + 1;
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
async perRouteStats() {
|
|
153
|
+
const byRoute = new Map();
|
|
154
|
+
for (const r of this.rows.values()) {
|
|
155
|
+
const s = byRoute.get(r.route_id) ??
|
|
156
|
+
{ route_id: r.route_id, counts: {}, last_delivered_at: null, oldest_pending_at: null };
|
|
157
|
+
s.counts[r.status] = (s.counts[r.status] ?? 0) + 1;
|
|
158
|
+
if (r.delivered_at && (!s.last_delivered_at || r.delivered_at > s.last_delivered_at)) {
|
|
159
|
+
s.last_delivered_at = r.delivered_at;
|
|
160
|
+
}
|
|
161
|
+
if (DUE.includes(r.status) && (!s.oldest_pending_at || r.received_at < s.oldest_pending_at)) {
|
|
162
|
+
s.oldest_pending_at = r.received_at;
|
|
163
|
+
}
|
|
164
|
+
byRoute.set(r.route_id, s);
|
|
165
|
+
}
|
|
166
|
+
return [...byRoute.values()];
|
|
167
|
+
}
|
|
168
|
+
async replay(id) {
|
|
169
|
+
const r = this.rows.get(id);
|
|
170
|
+
if (!r || r.status !== 'parked')
|
|
171
|
+
return false;
|
|
172
|
+
this.requeue(r);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
async replayAllParked() {
|
|
176
|
+
let n = 0;
|
|
177
|
+
for (const r of this.rows.values()) {
|
|
178
|
+
if (r.status !== 'parked')
|
|
179
|
+
continue;
|
|
180
|
+
this.requeue(r);
|
|
181
|
+
n++;
|
|
182
|
+
}
|
|
183
|
+
return n;
|
|
184
|
+
}
|
|
185
|
+
requeue(r) {
|
|
186
|
+
r.status = 'retry';
|
|
187
|
+
r.attempts = 0;
|
|
188
|
+
r.next_attempt_at = new Date().toISOString();
|
|
189
|
+
r.last_error = null;
|
|
190
|
+
}
|
|
191
|
+
isDue(r, now) {
|
|
192
|
+
return DUE.includes(r.status) && r.next_attempt_at !== null && r.next_attempt_at <= now;
|
|
193
|
+
}
|
|
194
|
+
pick(ids) {
|
|
195
|
+
return ids.map((id) => this.rows.get(id)).filter((r) => r !== undefined);
|
|
196
|
+
}
|
|
197
|
+
clearLease(r) {
|
|
198
|
+
r.claimed_by = null;
|
|
199
|
+
r.lease_until = null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export function memoryStore() {
|
|
203
|
+
return new MemoryEventStore();
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/engine/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { type RouteConfig } from '../config/schema.js';
|
|
2
|
+
import { EndCloseClient } from '../forward/endclose-client.js';
|
|
3
|
+
import { type DispatchCounts } from '../forward/dispatcher.js';
|
|
4
|
+
import type { Enrichment } from '../forward/enrich.js';
|
|
5
|
+
import { type MappedEvent } from '../forward/mapper.js';
|
|
6
|
+
import type { ProcessorAdapter, RawRequest } from '../ingest/adapters/types.js';
|
|
7
|
+
import type { Json } from '../mask/paths.js';
|
|
8
|
+
import { type Logger } from '../logger.js';
|
|
9
|
+
import { RelayHooks, type RelayEventName, type RelayHandler } from './hooks.js';
|
|
10
|
+
import { type IngestResult } from './ingest.js';
|
|
11
|
+
import { type SecretResolver } from './secrets.js';
|
|
12
|
+
import { type DispatchSettings, type RetentionSettings } from './settings.js';
|
|
13
|
+
import { type ControlStore, type EventStore, type RouteProvider } from './store.js';
|
|
14
|
+
export interface RelayOptions {
|
|
15
|
+
/** Route definitions: the same shape as the `routes` block of relay.yaml. */
|
|
16
|
+
routes: RouteConfig[] | RouteProvider;
|
|
17
|
+
store: EventStore;
|
|
18
|
+
/** Killswitch and per-route pause state. Default: in-memory, nothing paused. */
|
|
19
|
+
control?: ControlStore;
|
|
20
|
+
/** Where `auth.secret_env` references resolve. */
|
|
21
|
+
secrets: SecretResolver | Record<string, string>;
|
|
22
|
+
endclose: {
|
|
23
|
+
apiKey: string;
|
|
24
|
+
baseUrl?: string;
|
|
25
|
+
fetch?: typeof fetch;
|
|
26
|
+
};
|
|
27
|
+
/** Explicit: encrypt buffered payloads at rest under this key, or store them as-is. */
|
|
28
|
+
encryption: {
|
|
29
|
+
dataKey: string | Buffer;
|
|
30
|
+
} | 'none';
|
|
31
|
+
/** Keys the deterministic `hash` transform. Never leaves the host. */
|
|
32
|
+
maskingKey: string | Buffer;
|
|
33
|
+
dispatch?: Partial<DispatchSettings>;
|
|
34
|
+
/** `false` disables retention pruning entirely. */
|
|
35
|
+
retention?: Partial<RetentionSettings> | false;
|
|
36
|
+
/** Default: silent. */
|
|
37
|
+
logger?: Logger | null;
|
|
38
|
+
/** Additional processor adapters keyed by route `source`. */
|
|
39
|
+
adapters?: Record<string, ProcessorAdapter>;
|
|
40
|
+
/**
|
|
41
|
+
* Host functions a route's map may name with `enrich: <name>` on `description` or a
|
|
42
|
+
* `metadata` entry. Each runs in-process per event after mapping, receives the value at
|
|
43
|
+
* that field's `source`, and returns what is forwarded (validated like any mapped value).
|
|
44
|
+
* Throw to retry the event with backoff; throw `EnrichmentError` to park it; return
|
|
45
|
+
* `undefined` to omit the field. Bounded by `dispatch.enrichTimeoutMs` per call.
|
|
46
|
+
*/
|
|
47
|
+
enrichments?: Record<string, Enrichment>;
|
|
48
|
+
/** Lease owner for claimed batches. Give each long-lived replica a stable id. */
|
|
49
|
+
instanceId?: string;
|
|
50
|
+
hooks?: RelayHooks;
|
|
51
|
+
/** Supply a pre-built client (the application shares one with telemetry). */
|
|
52
|
+
client?: EndCloseClient;
|
|
53
|
+
}
|
|
54
|
+
export type DispatchOnceResult = DispatchCounts;
|
|
55
|
+
export interface FlushResult extends DispatchOnceResult {
|
|
56
|
+
/** True when nothing deliverable remained when flush returned. */
|
|
57
|
+
drained: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Why flush stopped early: the deadline passed, forwarding is paused (killswitch or
|
|
60
|
+
* every due route), or due events belong to routes the provider no longer knows.
|
|
61
|
+
*/
|
|
62
|
+
reason?: 'timeout' | 'paused' | 'unroutable';
|
|
63
|
+
}
|
|
64
|
+
export interface Relay {
|
|
65
|
+
/** Framework-agnostic webhook entrypoint. */
|
|
66
|
+
ingest(routeId: string, req: RawRequest): Promise<IngestResult>;
|
|
67
|
+
/** Start the background dispatch loop (long-lived processes). */
|
|
68
|
+
start(): void;
|
|
69
|
+
/** Stop the loop and drain in-flight work. */
|
|
70
|
+
stop(): Promise<void>;
|
|
71
|
+
/** Run one dispatch cycle (cron / serverless / tests). */
|
|
72
|
+
dispatchOnce(opts?: {
|
|
73
|
+
prune?: boolean;
|
|
74
|
+
}): Promise<DispatchOnceResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Run dispatch cycles until nothing deliverable remains or `timeoutMs` (default 30 s)
|
|
77
|
+
* passes, retrying as backoff timers expire. Returns immediately if forwarding is
|
|
78
|
+
* paused. Events still `retried` when it returns need a later cycle or a durable store.
|
|
79
|
+
*/
|
|
80
|
+
flush(opts?: {
|
|
81
|
+
timeoutMs?: number;
|
|
82
|
+
}): Promise<FlushResult>;
|
|
83
|
+
/** Run retention pruning to completion. */
|
|
84
|
+
prune(): Promise<{
|
|
85
|
+
wiped: number;
|
|
86
|
+
deleted: number;
|
|
87
|
+
}>;
|
|
88
|
+
/**
|
|
89
|
+
* Map a sample payload through a route without storing or sending anything. Enrichments
|
|
90
|
+
* are not run: their fields are listed in `report.enriched` and `pending`.
|
|
91
|
+
*/
|
|
92
|
+
preview(route: RouteConfig, sample: Json, receivedAt?: string): MappedEvent;
|
|
93
|
+
/** Decode a buffered payload. Sensitive: the caller is responsible for auditing. */
|
|
94
|
+
readPayload(id: string): Promise<Buffer | undefined>;
|
|
95
|
+
on<E extends RelayEventName>(name: E, handler: RelayHandler<E>): () => void;
|
|
96
|
+
readonly store: EventStore;
|
|
97
|
+
readonly control: ControlStore;
|
|
98
|
+
}
|
|
99
|
+
/** Reject routes whose `source` has no adapter (built-in or host-registered). */
|
|
100
|
+
export declare function assertKnownSources(routes: RouteConfig[], adapters?: Record<string, ProcessorAdapter>): void;
|
|
101
|
+
/** Every `enrich:` reference in a route's map, as [field, enrichment name]. */
|
|
102
|
+
export declare function routeEnrichments(route: RouteConfig): [field: string, enrichment: string][];
|
|
103
|
+
/** Reject routes whose map names an enrichment the host has not registered. */
|
|
104
|
+
export declare function assertKnownEnrichments(routes: RouteConfig[], enrichments?: Record<string, unknown>): void;
|
|
105
|
+
/**
|
|
106
|
+
* Validate a routes document (parsed YAML or a plain object) into RouteConfig[]. Applies
|
|
107
|
+
* defaults, the hard-denylist check on metadata names, duplicate-id, unknown-source and
|
|
108
|
+
* unknown-enrichment checks. Pass the host's extra adapters and enrichments so routes
|
|
109
|
+
* that use them validate too; with none registered, any `enrich:` reference is rejected.
|
|
110
|
+
*/
|
|
111
|
+
export declare function parseRoutes(doc: unknown, opts?: {
|
|
112
|
+
adapters?: Record<string, ProcessorAdapter>;
|
|
113
|
+
enrichments?: Record<string, unknown>;
|
|
114
|
+
}): RouteConfig[];
|
|
115
|
+
export declare function createRelay(opts: RelayOptions): Relay;
|
|
116
|
+
//# sourceMappingURL=relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/engine/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { refEnrichment, relayConfigSchema } from '../config/schema.js';
|
|
4
|
+
import { deriveKey } from '../crypto/keys.js';
|
|
5
|
+
import { EndCloseClient } from '../forward/endclose-client.js';
|
|
6
|
+
import { Dispatcher } from '../forward/dispatcher.js';
|
|
7
|
+
import { mapEvent } from '../forward/mapper.js';
|
|
8
|
+
import { hasAdapter } from '../ingest/adapters/registry.js';
|
|
9
|
+
import { noopLogger } from '../logger.js';
|
|
10
|
+
import { sleep } from '../util/strings.js';
|
|
11
|
+
import { aesGcmCodec, plainCodec } from './codec.js';
|
|
12
|
+
import { RelayHooks } from './hooks.js';
|
|
13
|
+
import { ingestWebhook } from './ingest.js';
|
|
14
|
+
import { toSecretResolver } from './secrets.js';
|
|
15
|
+
import { DEFAULT_DISPATCH, DEFAULT_RETENTION, } from './settings.js';
|
|
16
|
+
import { hasAdmin, MemoryControlStore, staticRoutes, } from './store.js';
|
|
17
|
+
function toKey(name, v) {
|
|
18
|
+
if (typeof v === 'string')
|
|
19
|
+
return deriveKey(name, v);
|
|
20
|
+
if (v.length !== 32)
|
|
21
|
+
throw new Error(`${name} must be a 32-byte Buffer or a string of 16+ chars`);
|
|
22
|
+
return v;
|
|
23
|
+
}
|
|
24
|
+
/** Reject routes whose `source` has no adapter (built-in or host-registered). */
|
|
25
|
+
export function assertKnownSources(routes, adapters) {
|
|
26
|
+
for (const r of routes) {
|
|
27
|
+
if (!hasAdapter(r.source, adapters)) {
|
|
28
|
+
throw new Error(`route ${r.id}: no adapter for source "${r.source}"`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Every `enrich:` reference in a route's map, as [field, enrichment name]. */
|
|
33
|
+
export function routeEnrichments(route) {
|
|
34
|
+
const out = [];
|
|
35
|
+
const desc = route.map.description === undefined ? undefined : refEnrichment(route.map.description);
|
|
36
|
+
if (desc !== undefined)
|
|
37
|
+
out.push(['description', desc]);
|
|
38
|
+
for (const [key, ref] of Object.entries(route.map.metadata)) {
|
|
39
|
+
const name = refEnrichment(ref);
|
|
40
|
+
if (name !== undefined)
|
|
41
|
+
out.push([`metadata.${key}`, name]);
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/** Reject routes whose map names an enrichment the host has not registered. */
|
|
46
|
+
export function assertKnownEnrichments(routes, enrichments) {
|
|
47
|
+
for (const r of routes) {
|
|
48
|
+
for (const [field, name] of routeEnrichments(r)) {
|
|
49
|
+
if (!enrichments || !Object.hasOwn(enrichments, name)) {
|
|
50
|
+
throw new Error(`route ${r.id}: ${field} references unknown enrichment "${name}"`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validate a routes document (parsed YAML or a plain object) into RouteConfig[]. Applies
|
|
57
|
+
* defaults, the hard-denylist check on metadata names, duplicate-id, unknown-source and
|
|
58
|
+
* unknown-enrichment checks. Pass the host's extra adapters and enrichments so routes
|
|
59
|
+
* that use them validate too; with none registered, any `enrich:` reference is rejected.
|
|
60
|
+
*/
|
|
61
|
+
export function parseRoutes(doc, opts = {}) {
|
|
62
|
+
const config = relayConfigSchema.parse(doc);
|
|
63
|
+
const seen = new Set();
|
|
64
|
+
for (const route of config.routes) {
|
|
65
|
+
if (seen.has(route.id))
|
|
66
|
+
throw new Error(`duplicate route id: ${route.id}`);
|
|
67
|
+
seen.add(route.id);
|
|
68
|
+
}
|
|
69
|
+
assertKnownSources(config.routes, opts.adapters);
|
|
70
|
+
assertKnownEnrichments(config.routes, opts.enrichments);
|
|
71
|
+
return config.routes;
|
|
72
|
+
}
|
|
73
|
+
const FLUSH_POLL_MIN_MS = 50;
|
|
74
|
+
const FLUSH_POLL_MAX_MS = 1000;
|
|
75
|
+
// Asking for "due" events at this time returns every route holding pending/retry rows.
|
|
76
|
+
const FAR_FUTURE = '9999-12-31T23:59:59.999Z';
|
|
77
|
+
export function createRelay(opts) {
|
|
78
|
+
if (Array.isArray(opts.routes)) {
|
|
79
|
+
assertKnownSources(opts.routes, opts.adapters);
|
|
80
|
+
assertKnownEnrichments(opts.routes, opts.enrichments);
|
|
81
|
+
}
|
|
82
|
+
const routes = Array.isArray(opts.routes) ? staticRoutes(opts.routes) : opts.routes;
|
|
83
|
+
const control = opts.control ?? new MemoryControlStore();
|
|
84
|
+
const secrets = toSecretResolver(opts.secrets);
|
|
85
|
+
const logger = opts.logger ?? noopLogger;
|
|
86
|
+
const hooks = opts.hooks ?? new RelayHooks();
|
|
87
|
+
const codec = opts.encryption === 'none' ? plainCodec : aesGcmCodec(toKey('dataKey', opts.encryption.dataKey));
|
|
88
|
+
const maskingKey = toKey('maskingKey', opts.maskingKey);
|
|
89
|
+
const client = opts.client ??
|
|
90
|
+
new EndCloseClient(opts.endclose.baseUrl ?? 'https://api.endclose.com/v1', opts.endclose.apiKey, opts.endclose.fetch ?? fetch);
|
|
91
|
+
const dispatch = { ...DEFAULT_DISPATCH, ...opts.dispatch };
|
|
92
|
+
const retention = opts.retention === false ? null : { ...DEFAULT_RETENTION, ...opts.retention };
|
|
93
|
+
const signal = new EventEmitter();
|
|
94
|
+
const { store } = opts;
|
|
95
|
+
const ingestDeps = {
|
|
96
|
+
store,
|
|
97
|
+
control,
|
|
98
|
+
routes,
|
|
99
|
+
secrets,
|
|
100
|
+
codec,
|
|
101
|
+
signal,
|
|
102
|
+
hooks,
|
|
103
|
+
logger,
|
|
104
|
+
...(opts.adapters ? { adapters: opts.adapters } : {}),
|
|
105
|
+
};
|
|
106
|
+
const dispatcher = new Dispatcher({
|
|
107
|
+
store,
|
|
108
|
+
control,
|
|
109
|
+
routes,
|
|
110
|
+
dispatch,
|
|
111
|
+
retention,
|
|
112
|
+
client,
|
|
113
|
+
codec,
|
|
114
|
+
maskingKey,
|
|
115
|
+
instanceId: opts.instanceId ?? randomUUID(),
|
|
116
|
+
signal,
|
|
117
|
+
hooks,
|
|
118
|
+
logger,
|
|
119
|
+
...(opts.enrichments ? { enrichments: opts.enrichments } : {}),
|
|
120
|
+
});
|
|
121
|
+
const dispatchOnce = async (o = {}) => {
|
|
122
|
+
const { delivered, retried, parked } = await dispatcher.runOnce();
|
|
123
|
+
if (o.prune)
|
|
124
|
+
await dispatcher.pruneNow();
|
|
125
|
+
return { delivered, retried, parked };
|
|
126
|
+
};
|
|
127
|
+
const flush = async ({ timeoutMs = 30_000 } = {}) => {
|
|
128
|
+
const deadline = Date.now() + timeoutMs;
|
|
129
|
+
const totals = { delivered: 0, retried: 0, parked: 0, drained: false };
|
|
130
|
+
let pollMs = FLUSH_POLL_MIN_MS;
|
|
131
|
+
for (;;) {
|
|
132
|
+
const c = await dispatcher.runOnce();
|
|
133
|
+
totals.delivered += c.delivered;
|
|
134
|
+
totals.retried += c.retried;
|
|
135
|
+
totals.parked += c.parked;
|
|
136
|
+
if (c.halted)
|
|
137
|
+
return { ...totals, reason: 'paused' };
|
|
138
|
+
const remaining = deadline - Date.now();
|
|
139
|
+
if (remaining <= 0)
|
|
140
|
+
return { ...totals, reason: 'timeout' };
|
|
141
|
+
const touched = c.delivered + c.retried + c.parked;
|
|
142
|
+
if (touched > 0)
|
|
143
|
+
continue; // there may be more than one batch's worth; go straight back
|
|
144
|
+
const backlog = await store.routesWithDueEvents(FAR_FUTURE);
|
|
145
|
+
if (backlog.length === 0)
|
|
146
|
+
return { ...totals, drained: true };
|
|
147
|
+
// Backlog confined to routes the cycle deliberately skipped will not clear on its
|
|
148
|
+
// own. Anything else is waiting on a backoff timer.
|
|
149
|
+
const skipped = new Map(c.skipped.map((s) => [s.routeId, s.reason]));
|
|
150
|
+
if (backlog.every((r) => skipped.has(r))) {
|
|
151
|
+
const allPaused = backlog.every((r) => skipped.get(r) === 'paused');
|
|
152
|
+
return { ...totals, reason: allPaused ? 'paused' : 'unroutable' };
|
|
153
|
+
}
|
|
154
|
+
await sleep(Math.min(pollMs, remaining));
|
|
155
|
+
pollMs = Math.min(pollMs * 2, FLUSH_POLL_MAX_MS);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const readPayload = async (id) => {
|
|
159
|
+
if (!hasAdmin(store))
|
|
160
|
+
throw new Error('store does not support inspection (EventStoreAdmin)');
|
|
161
|
+
const row = await store.getById(id);
|
|
162
|
+
if (!row || row.payload.length === 0)
|
|
163
|
+
return undefined;
|
|
164
|
+
return codec.decode(row.payload, row.payload_iv);
|
|
165
|
+
};
|
|
166
|
+
return {
|
|
167
|
+
ingest: (routeId, req) => ingestWebhook(ingestDeps, routeId, req),
|
|
168
|
+
start: () => dispatcher.start(),
|
|
169
|
+
stop: () => dispatcher.stop(),
|
|
170
|
+
dispatchOnce,
|
|
171
|
+
flush,
|
|
172
|
+
prune: () => dispatcher.pruneNow(),
|
|
173
|
+
preview: (route, sample, receivedAt = new Date().toISOString()) => mapEvent(route, sample, receivedAt, maskingKey),
|
|
174
|
+
readPayload,
|
|
175
|
+
on: (name, handler) => hooks.on(name, handler),
|
|
176
|
+
store,
|
|
177
|
+
control,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/engine/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SecretResolver {
|
|
2
|
+
/** The secret value for `ref`, or undefined when it is not available. */
|
|
3
|
+
resolve(ref: string): string | undefined;
|
|
4
|
+
/** Whether `ref` is currently available (defaults to `resolve(ref) !== undefined`). */
|
|
5
|
+
has?(ref: string): boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare class SecretUnavailableError extends Error {
|
|
8
|
+
readonly ref: string;
|
|
9
|
+
constructor(ref: string);
|
|
10
|
+
}
|
|
11
|
+
/** Resolve from an environment-shaped record; empty strings count as unset. */
|
|
12
|
+
export declare function envSecrets(env?: Record<string, string | undefined>): SecretResolver;
|
|
13
|
+
export declare function staticSecrets(map: Record<string, string>): SecretResolver;
|
|
14
|
+
export declare function toSecretResolver(s: SecretResolver | Record<string, string>): SecretResolver;
|
|
15
|
+
export declare function hasSecret(resolver: SecretResolver, ref: string): boolean;
|
|
16
|
+
/** Resolve or throw `SecretUnavailableError`. */
|
|
17
|
+
export declare function requireSecret(resolver: SecretResolver, ref: string): string;
|
|
18
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/engine/secrets.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACxC,uFAAuF;IACvF,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM;CAGjC;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,cAAc,CAOhG;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAEzE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAI3F;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAExE;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Secret resolution for the engine. Route configs reference secrets by NAME only (the
|
|
2
|
+
// `secret_env` field); the host decides where the value comes from. The application uses the
|
|
3
|
+
// process environment; an embedding application may use a static map loaded from its
|
|
4
|
+
// secret manager at startup.
|
|
5
|
+
//
|
|
6
|
+
// Resolution is synchronous by design: it sits on the webhook verification hot path, and
|
|
7
|
+
// secrets should be materialised once at boot rather than fetched per request.
|
|
8
|
+
export class SecretUnavailableError extends Error {
|
|
9
|
+
ref;
|
|
10
|
+
constructor(ref) {
|
|
11
|
+
super(`missing required secret env var: ${ref}`);
|
|
12
|
+
this.ref = ref;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Resolve from an environment-shaped record; empty strings count as unset. */
|
|
16
|
+
export function envSecrets(env = process.env) {
|
|
17
|
+
return {
|
|
18
|
+
resolve: (ref) => {
|
|
19
|
+
const v = env[ref];
|
|
20
|
+
return v ? v : undefined;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function staticSecrets(map) {
|
|
25
|
+
return { resolve: (ref) => map[ref] };
|
|
26
|
+
}
|
|
27
|
+
export function toSecretResolver(s) {
|
|
28
|
+
return typeof s.resolve === 'function'
|
|
29
|
+
? s
|
|
30
|
+
: staticSecrets(s);
|
|
31
|
+
}
|
|
32
|
+
export function hasSecret(resolver, ref) {
|
|
33
|
+
return resolver.has ? resolver.has(ref) : resolver.resolve(ref) !== undefined;
|
|
34
|
+
}
|
|
35
|
+
/** Resolve or throw `SecretUnavailableError`. */
|
|
36
|
+
export function requireSecret(resolver, ref) {
|
|
37
|
+
const v = resolver.resolve(ref);
|
|
38
|
+
if (v === undefined)
|
|
39
|
+
throw new SecretUnavailableError(ref);
|
|
40
|
+
return v;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/engine/secrets.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,6FAA6F;AAC7F,qFAAqF;AACrF,6BAA6B;AAC7B,EAAE;AACF,yFAAyF;AACzF,+EAA+E;AAS/E,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC1B;IAArB,YAAqB,GAAW;QAC9B,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAA;QAD7B,QAAG,GAAH,GAAG,CAAQ;IAEhC,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,MAA0C,OAAO,CAAC,GAAG;IAC9E,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YAClB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAA2B;IACvD,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAA0C;IACzE,OAAO,OAAQ,CAAoB,CAAC,OAAO,KAAK,UAAU;QACxD,CAAC,CAAE,CAAoB;QACvB,CAAC,CAAC,aAAa,CAAC,CAA2B,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAwB,EAAE,GAAW;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA;AAC/E,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,QAAwB,EAAE,GAAW;IACjE,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,CAAC,KAAK,SAAS;QAAE,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAC1D,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface DispatchSettings {
|
|
2
|
+
/** Records per bulk POST. */
|
|
3
|
+
batchMax: number;
|
|
4
|
+
/** How often the loop wakes when idle (it also wakes immediately on ingest). */
|
|
5
|
+
pollIntervalMs: number;
|
|
6
|
+
backoffBaseMs: number;
|
|
7
|
+
backoffCapMs: number;
|
|
8
|
+
/** Retrying events park (never dropped) after this long. */
|
|
9
|
+
parkAfterMs: number;
|
|
10
|
+
/** How long a claimed batch is protected from recovery by other instances. */
|
|
11
|
+
leaseMs: number;
|
|
12
|
+
/** How often a running instance sweeps for expired leases left by crashed peers. */
|
|
13
|
+
recoverIntervalMs: number;
|
|
14
|
+
/**
|
|
15
|
+
* Upper bound on one `enrich` call. A slower call counts as a transient failure and the
|
|
16
|
+
* event retries with backoff. Enrichments run one at a time per event, so keep
|
|
17
|
+
* batchMax × (enrichments per event) × enrichTimeoutMs well under leaseMs.
|
|
18
|
+
*/
|
|
19
|
+
enrichTimeoutMs: number;
|
|
20
|
+
}
|
|
21
|
+
export interface RetentionSettings {
|
|
22
|
+
/** Payloads of delivered/filtered events are wiped after this many days. */
|
|
23
|
+
deliveredDays: number;
|
|
24
|
+
/** Their rows (the idempotency ledger) are deleted after this many days. */
|
|
25
|
+
ledgerDays: number;
|
|
26
|
+
}
|
|
27
|
+
export declare const DEFAULT_DISPATCH: DispatchSettings;
|
|
28
|
+
export declare const DEFAULT_RETENTION: RetentionSettings;
|
|
29
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/engine/settings.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAA;IACf,oFAAoF;IACpF,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAS9B,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,iBAAwD,CAAA"}
|