@atlasauth/emulator-core 0.1.0 → 0.2.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/dist/adopt.d.ts +50 -0
- package/dist/adopt.js +57 -0
- package/dist/adopt.js.map +1 -0
- package/dist/coverage.d.ts +15 -0
- package/dist/coverage.js +31 -0
- package/dist/coverage.js.map +1 -0
- package/dist/crypto-util.d.ts +10 -0
- package/dist/crypto-util.js +76 -0
- package/dist/crypto-util.js.map +1 -0
- package/dist/engine.d.ts +33 -2
- package/dist/engine.js +53 -8
- package/dist/engine.js.map +1 -1
- package/dist/error-catalog.js +8 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/event-gate.d.ts +3 -0
- package/dist/event-gate.js +372 -0
- package/dist/event-gate.js.map +1 -0
- package/dist/generic.js +9 -1
- package/dist/generic.js.map +1 -1
- package/dist/handlers/approvals.d.ts +2 -0
- package/dist/handlers/approvals.js +365 -0
- package/dist/handlers/approvals.js.map +1 -0
- package/dist/handlers/authz.d.ts +2 -0
- package/dist/handlers/authz.js +347 -0
- package/dist/handlers/authz.js.map +1 -0
- package/dist/handlers/billing.d.ts +2 -0
- package/dist/handlers/billing.js +398 -0
- package/dist/handlers/billing.js.map +1 -0
- package/dist/handlers/connections.d.ts +2 -0
- package/dist/handlers/connections.js +332 -0
- package/dist/handlers/connections.js.map +1 -0
- package/dist/handlers/device.d.ts +47 -0
- package/dist/handlers/device.js +648 -0
- package/dist/handlers/device.js.map +1 -0
- package/dist/handlers/federation.d.ts +2 -0
- package/dist/handlers/federation.js +481 -0
- package/dist/handlers/federation.js.map +1 -0
- package/dist/handlers/governance.d.ts +2 -0
- package/dist/handlers/governance.js +460 -0
- package/dist/handlers/governance.js.map +1 -0
- package/dist/handlers/hooks.js +4 -1
- package/dist/handlers/hooks.js.map +1 -1
- package/dist/handlers/index.d.ts +5 -1
- package/dist/handlers/index.js +32 -3
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/keys.js +6 -1
- package/dist/handlers/keys.js.map +1 -1
- package/dist/handlers/machines.js +55 -8
- package/dist/handlers/machines.js.map +1 -1
- package/dist/handlers/messaging.d.ts +4 -0
- package/dist/handlers/messaging.js +486 -0
- package/dist/handlers/messaging.js.map +1 -0
- package/dist/handlers/oauth-flows.d.ts +28 -0
- package/dist/handlers/oauth-flows.js +419 -0
- package/dist/handlers/oauth-flows.js.map +1 -0
- package/dist/handlers/oauth.d.ts +75 -0
- package/dist/handlers/oauth.js +608 -0
- package/dist/handlers/oauth.js.map +1 -0
- package/dist/handlers/passkeys.d.ts +3 -0
- package/dist/handlers/passkeys.js +293 -0
- package/dist/handlers/passkeys.js.map +1 -0
- package/dist/handlers/platform.d.ts +15 -0
- package/dist/handlers/platform.js +454 -0
- package/dist/handlers/platform.js.map +1 -0
- package/dist/handlers/round2.d.ts +8 -0
- package/dist/handlers/round2.js +372 -0
- package/dist/handlers/round2.js.map +1 -0
- package/dist/handlers/scim.d.ts +2 -0
- package/dist/handlers/scim.js +408 -0
- package/dist/handlers/scim.js.map +1 -0
- package/dist/handlers/sessions.d.ts +7 -3
- package/dist/handlers/sessions.js +55 -25
- package/dist/handlers/sessions.js.map +1 -1
- package/dist/handlers/support.d.ts +20 -0
- package/dist/handlers/support.js +62 -0
- package/dist/handlers/support.js.map +1 -0
- package/dist/handlers/users.js +4 -0
- package/dist/handlers/users.js.map +1 -1
- package/dist/handlers/workflows.d.ts +2 -0
- package/dist/handlers/workflows.js +428 -0
- package/dist/handlers/workflows.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/jws.d.ts +41 -0
- package/dist/jws.js +133 -0
- package/dist/jws.js.map +1 -0
- package/dist/messages.d.ts +7 -0
- package/dist/messages.js +8 -4
- package/dist/messages.js.map +1 -1
- package/dist/parity-bin.js +3 -1
- package/dist/parity-bin.js.map +1 -1
- package/dist/parity-routes.d.ts +14 -0
- package/dist/parity-routes.js +421 -0
- package/dist/parity-routes.js.map +1 -0
- package/dist/parity.d.ts +10 -3
- package/dist/parity.js +14 -5
- package/dist/parity.js.map +1 -1
- package/dist/tokens.d.ts +17 -0
- package/dist/tokens.js +46 -0
- package/dist/tokens.js.map +1 -1
- package/dist/webauthn-virtual.d.ts +70 -0
- package/dist/webauthn-virtual.js +186 -0
- package/dist/webauthn-virtual.js.map +1 -0
- package/dist/webhook-ext.d.ts +16 -0
- package/dist/webhook-ext.js +218 -0
- package/dist/webhook-ext.js.map +1 -0
- package/dist/webhooks.d.ts +3 -0
- package/dist/webhooks.js +37 -3
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Engine } from './engine';
|
|
2
|
+
import type { Obj } from './openapi';
|
|
3
|
+
/** The endpoint fields a create or update body sets (only the ones sent; null clears). Throws a validation error. */
|
|
4
|
+
export declare function parseEndpointExtras(body: Obj, current?: Obj): Obj;
|
|
5
|
+
/** The read side: header names only, no secret of any kind. */
|
|
6
|
+
export declare function presentEndpointExtras(ep: Obj): Obj;
|
|
7
|
+
/** The organization an event belongs to: `data.organization_id`, or the id of an organization object. */
|
|
8
|
+
export declare const eventOrgId: (data: Obj) => string | null;
|
|
9
|
+
/** Does an event pass an endpoint's filters? No filters = yes. Fails closed on anything unreadable. */
|
|
10
|
+
export declare function filtersMatch(filters: Obj | null | undefined, data: Obj): boolean;
|
|
11
|
+
/** Extra request headers for one delivery: the static ones, plus a bearer token fetched with client credentials. */
|
|
12
|
+
export declare function deliveryHeaders(e: Engine, ep: Obj): Promise<Record<string, string>>;
|
|
13
|
+
/** A receiver that answered 401 gets a fresh token next time. */
|
|
14
|
+
export declare const evictToken: (e: Engine, endpointId: string) => void;
|
|
15
|
+
/** The `max_rps` budget: true when this delivery fits the current one-second window, false when it must wait for the next. */
|
|
16
|
+
export declare function takeRate(e: Engine, ep: Obj): boolean;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evictToken = exports.eventOrgId = void 0;
|
|
4
|
+
exports.parseEndpointExtras = parseEndpointExtras;
|
|
5
|
+
exports.presentEndpointExtras = presentEndpointExtras;
|
|
6
|
+
exports.filtersMatch = filtersMatch;
|
|
7
|
+
exports.deliveryHeaders = deliveryHeaders;
|
|
8
|
+
exports.takeRate = takeRate;
|
|
9
|
+
const errors_1 = require("./errors");
|
|
10
|
+
/**
|
|
11
|
+
* What a webhook endpoint can carry beyond its URL and event list: delivery `filters` (organization ids and metadata
|
|
12
|
+
* predicates over the event data), static `headers` (names only on reads), `oauth` client-credentials for a receiver that
|
|
13
|
+
* wants a bearer token, and a `max_rps` delivery cap. Validation follows the production rules; matching is the same pure
|
|
14
|
+
* function, so an event an endpoint filters out is never sent to it.
|
|
15
|
+
*/
|
|
16
|
+
const PATH_RE = /^[A-Za-z0-9_]+(\.[A-Za-z0-9_]+){0,5}$/;
|
|
17
|
+
const HEADER_NAME = /^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,64}$/;
|
|
18
|
+
const RESERVED = /^(content-type|content-length|host|user-agent|connection|transfer-encoding|atlas-|webhook-)/i;
|
|
19
|
+
const isScalar = (v) => v === null || ['string', 'number', 'boolean'].includes(typeof v);
|
|
20
|
+
const bad = (message, param) => new errors_1.EmulatorError('VALIDATION_FAILED', message, param);
|
|
21
|
+
function parseFilters(raw) {
|
|
22
|
+
if (raw === null)
|
|
23
|
+
return null;
|
|
24
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
25
|
+
throw bad('filters must be an object, or null to clear it.', 'filters');
|
|
26
|
+
const f = raw;
|
|
27
|
+
const extra = Object.keys(f).find((k) => k !== 'organization_ids' && k !== 'metadata');
|
|
28
|
+
if (extra)
|
|
29
|
+
throw bad(`Unsupported filter: ${extra}. Allowed: organization_ids, metadata.`, 'filters');
|
|
30
|
+
const out = {};
|
|
31
|
+
if (f.organization_ids !== undefined) {
|
|
32
|
+
const ids = f.organization_ids;
|
|
33
|
+
if (!Array.isArray(ids) || !ids.length || ids.length > 100 || ids.some((x) => typeof x !== 'string' || !x))
|
|
34
|
+
throw bad('organization_ids must list 1 to 100 organization ids.', 'filters.organization_ids');
|
|
35
|
+
out.organization_ids = [...new Set(ids)];
|
|
36
|
+
}
|
|
37
|
+
if (f.metadata !== undefined) {
|
|
38
|
+
const preds = f.metadata;
|
|
39
|
+
if (!Array.isArray(preds) || !preds.length || preds.length > 10)
|
|
40
|
+
throw bad('metadata must list 1 to 10 predicates.', 'filters.metadata');
|
|
41
|
+
out.metadata = preds.map((p, i) => {
|
|
42
|
+
const at = `filters.metadata[${i}]`;
|
|
43
|
+
const o = p && typeof p === 'object' && !Array.isArray(p) ? p : {};
|
|
44
|
+
if (typeof o.path !== 'string' || !PATH_RE.test(o.path))
|
|
45
|
+
throw bad('path must be a dot path of letters, digits and underscores, at most 6 segments deep.', `${at}.path`);
|
|
46
|
+
if (/private/i.test(o.path))
|
|
47
|
+
throw bad('Private metadata never leaves Atlas, so a filter cannot read it.', `${at}.path`);
|
|
48
|
+
const ops = ['equals', 'in', 'exists'].filter((k) => o[k] !== undefined);
|
|
49
|
+
if (ops.length !== 1)
|
|
50
|
+
throw bad('Set exactly one of equals, in or exists.', at);
|
|
51
|
+
if (o.equals !== undefined && !isScalar(o.equals))
|
|
52
|
+
throw bad('equals must be a string, number, boolean or null.', `${at}.equals`);
|
|
53
|
+
if (o.in !== undefined && (!Array.isArray(o.in) || !o.in.length || o.in.length > 50 || !o.in.every(isScalar)))
|
|
54
|
+
throw bad('in must list 1 to 50 strings, numbers, booleans or nulls.', `${at}.in`);
|
|
55
|
+
if (o.exists !== undefined && typeof o.exists !== 'boolean')
|
|
56
|
+
throw bad('exists must be a boolean.', `${at}.exists`);
|
|
57
|
+
return { path: o.path, [ops[0]]: o[ops[0]] };
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (!out.organization_ids && !out.metadata)
|
|
61
|
+
throw bad('A filter needs organization_ids or metadata (send null to clear it).', 'filters');
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
function parseHeaders(raw, oauthSet) {
|
|
65
|
+
if (raw === null)
|
|
66
|
+
return null;
|
|
67
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
68
|
+
throw bad('headers must be an object of header names to values, or null.', 'headers');
|
|
69
|
+
const entries = Object.entries(raw);
|
|
70
|
+
if (!entries.length || entries.length > 10)
|
|
71
|
+
throw bad('headers must hold 1 to 10 entries (send null to clear them).', 'headers');
|
|
72
|
+
const out = {};
|
|
73
|
+
for (const [name, value] of entries) {
|
|
74
|
+
if (!HEADER_NAME.test(name))
|
|
75
|
+
throw bad(`Header name "${name}" is not valid.`, 'headers');
|
|
76
|
+
if (RESERVED.test(name))
|
|
77
|
+
throw bad(`The ${name} header is set by Atlas and cannot be overridden.`, 'headers');
|
|
78
|
+
if (oauthSet && name.toLowerCase() === 'authorization')
|
|
79
|
+
throw bad('Authorization is set from oauth; remove one of them.', 'headers');
|
|
80
|
+
if (typeof value !== 'string' || value.length > 2000 || /[\r\n]/.test(value))
|
|
81
|
+
throw bad(`The value of header ${name} must be a single-line string of at most 2000 characters.`, 'headers');
|
|
82
|
+
if (out[name.toLowerCase()] !== undefined)
|
|
83
|
+
throw bad(`Header ${name} is listed twice.`, 'headers');
|
|
84
|
+
out[name.toLowerCase()] = value;
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
function parseOauth(raw) {
|
|
89
|
+
if (raw === null)
|
|
90
|
+
return null;
|
|
91
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
92
|
+
throw bad('oauth must be an object, or null to clear it.', 'oauth');
|
|
93
|
+
const o = raw;
|
|
94
|
+
const extra = Object.keys(o).find((k) => !['token_url', 'client_id', 'client_secret', 'scope', 'audience'].includes(k));
|
|
95
|
+
if (extra)
|
|
96
|
+
throw bad(`Unsupported oauth field: ${extra}.`, `oauth.${extra}`);
|
|
97
|
+
for (const k of ['token_url', 'client_id', 'client_secret'])
|
|
98
|
+
if (typeof o[k] !== 'string' || !o[k].trim() || o[k].length > 2048)
|
|
99
|
+
throw bad(`oauth.${k} must be a non-empty string.`, `oauth.${k}`);
|
|
100
|
+
let u;
|
|
101
|
+
try {
|
|
102
|
+
u = new URL(o.token_url);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
throw bad('oauth.token_url must be an https URL.', 'oauth.token_url');
|
|
106
|
+
}
|
|
107
|
+
if (u.protocol !== 'https:' || u.username || u.password)
|
|
108
|
+
throw bad('oauth.token_url must be an https URL without credentials.', 'oauth.token_url');
|
|
109
|
+
return { token_url: o.token_url, client_id: o.client_id, client_secret: o.client_secret, ...(o.scope ? { scope: String(o.scope) } : {}), ...(o.audience ? { audience: String(o.audience) } : {}) };
|
|
110
|
+
}
|
|
111
|
+
/** The endpoint fields a create or update body sets (only the ones sent; null clears). Throws a validation error. */
|
|
112
|
+
function parseEndpointExtras(body, current) {
|
|
113
|
+
const out = {};
|
|
114
|
+
if ('filters' in body)
|
|
115
|
+
out.filters = parseFilters(body.filters);
|
|
116
|
+
if ('oauth' in body)
|
|
117
|
+
out.oauth = parseOauth(body.oauth);
|
|
118
|
+
if ('headers' in body)
|
|
119
|
+
out.custom_headers = parseHeaders(body.headers, (('oauth' in body ? out.oauth : current?.oauth) ?? null) !== null);
|
|
120
|
+
if ('max_rps' in body) {
|
|
121
|
+
if (body.max_rps !== null && (!Number.isInteger(body.max_rps) || body.max_rps < 1 || body.max_rps > 1000))
|
|
122
|
+
throw bad('max_rps must be a whole number from 1 to 1000, or null to remove the cap.', 'max_rps');
|
|
123
|
+
out.max_rps = body.max_rps;
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
/** The read side: header names only, no secret of any kind. */
|
|
128
|
+
function presentEndpointExtras(ep) {
|
|
129
|
+
return {
|
|
130
|
+
filters: ep.filters ?? null,
|
|
131
|
+
header_names: ep.custom_headers ? Object.keys(ep.custom_headers) : [],
|
|
132
|
+
oauth: ep.oauth ? { token_url: ep.oauth.token_url, client_id: ep.oauth.client_id, scope: ep.oauth.scope ?? null, secret_set: true } : null,
|
|
133
|
+
max_rps: ep.max_rps ?? null,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const read = (data, path) => {
|
|
137
|
+
let cur = data;
|
|
138
|
+
for (const seg of path.split('.')) {
|
|
139
|
+
if (cur === null || typeof cur !== 'object')
|
|
140
|
+
return undefined;
|
|
141
|
+
cur = cur[seg];
|
|
142
|
+
}
|
|
143
|
+
return cur;
|
|
144
|
+
};
|
|
145
|
+
/** The organization an event belongs to: `data.organization_id`, or the id of an organization object. */
|
|
146
|
+
const eventOrgId = (data) => (typeof data?.organization_id === 'string' ? data.organization_id : data?.object === 'organization' && typeof data.id === 'string' ? data.id : typeof data?.organization?.id === 'string' ? data.organization.id : null);
|
|
147
|
+
exports.eventOrgId = eventOrgId;
|
|
148
|
+
/** Does an event pass an endpoint's filters? No filters = yes. Fails closed on anything unreadable. */
|
|
149
|
+
function filtersMatch(filters, data) {
|
|
150
|
+
if (!filters)
|
|
151
|
+
return true;
|
|
152
|
+
const org = (0, exports.eventOrgId)(data);
|
|
153
|
+
if (filters.organization_ids?.length && (!org || !filters.organization_ids.includes(org)))
|
|
154
|
+
return false;
|
|
155
|
+
for (const p of filters.metadata ?? []) {
|
|
156
|
+
const v = read(data, p.path);
|
|
157
|
+
if (p.exists !== undefined) {
|
|
158
|
+
if ((v !== undefined && v !== null) !== p.exists)
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
else if (p.in !== undefined) {
|
|
162
|
+
if (!p.in.some((x) => x === v))
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
else if (v !== p.equals)
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
const tokens = new WeakMap();
|
|
171
|
+
/** Extra request headers for one delivery: the static ones, plus a bearer token fetched with client credentials. */
|
|
172
|
+
async function deliveryHeaders(e, ep) {
|
|
173
|
+
const out = { ...(ep.custom_headers ?? {}) };
|
|
174
|
+
if (ep.oauth) {
|
|
175
|
+
let cache = tokens.get(e);
|
|
176
|
+
if (!cache)
|
|
177
|
+
tokens.set(e, (cache = new Map()));
|
|
178
|
+
const hit = cache.get(ep.id);
|
|
179
|
+
const now = e.clock.now();
|
|
180
|
+
if (hit && hit.until > now)
|
|
181
|
+
out.authorization = `Bearer ${hit.token}`;
|
|
182
|
+
else {
|
|
183
|
+
const body = new URLSearchParams({ grant_type: 'client_credentials', client_id: ep.oauth.client_id, client_secret: ep.oauth.client_secret, ...(ep.oauth.scope ? { scope: ep.oauth.scope } : {}), ...(ep.oauth.audience ? { audience: ep.oauth.audience } : {}) });
|
|
184
|
+
const res = await (e.options.fetch ?? fetch)(ep.oauth.token_url, { method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded' }, body });
|
|
185
|
+
if (res.status < 200 || res.status >= 300)
|
|
186
|
+
throw new Error(`oauth token endpoint answered ${res.status}`);
|
|
187
|
+
const json = await res.json();
|
|
188
|
+
if (typeof json?.access_token !== 'string')
|
|
189
|
+
throw new Error('oauth token endpoint returned no access_token');
|
|
190
|
+
cache.set(ep.id, { token: json.access_token, until: now + Math.max(1, (Number(json.expires_in) || 300) - 30) * 1000 });
|
|
191
|
+
out.authorization = `Bearer ${json.access_token}`;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
/** A receiver that answered 401 gets a fresh token next time. */
|
|
197
|
+
const evictToken = (e, endpointId) => void tokens.get(e)?.delete(endpointId);
|
|
198
|
+
exports.evictToken = evictToken;
|
|
199
|
+
const windows = new WeakMap();
|
|
200
|
+
/** The `max_rps` budget: true when this delivery fits the current one-second window, false when it must wait for the next. */
|
|
201
|
+
function takeRate(e, ep) {
|
|
202
|
+
if (!ep.max_rps)
|
|
203
|
+
return true;
|
|
204
|
+
let m = windows.get(e);
|
|
205
|
+
if (!m)
|
|
206
|
+
windows.set(e, (m = new Map()));
|
|
207
|
+
const now = e.clock.now();
|
|
208
|
+
const w = m.get(ep.id);
|
|
209
|
+
if (!w || now - w.start >= 1000) {
|
|
210
|
+
m.set(ep.id, { start: now, count: 1 });
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
if (w.count >= ep.max_rps)
|
|
214
|
+
return false;
|
|
215
|
+
w.count++;
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=webhook-ext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-ext.js","sourceRoot":"","sources":["../src/webhook-ext.ts"],"names":[],"mappings":"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"}
|
package/dist/webhooks.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { Engine } from './engine';
|
|
2
2
|
import type { Obj } from './openapi';
|
|
3
|
+
export declare const INCLUDE_NEW_EVENT_TYPES = "include_new_event_types";
|
|
4
|
+
/** Whether an endpoint subscribed to `type`: naming it always delivers; `*` skips events added after the endpoint (see `GATED_EVENTS`) unless it opted in. */
|
|
5
|
+
export declare function subscribed(enabled: string[], type: string, endpointCreatedAt: number): boolean;
|
|
3
6
|
export interface EmittedEvent {
|
|
4
7
|
id: string;
|
|
5
8
|
type: string;
|
package/dist/webhooks.js
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebhookService = void 0;
|
|
3
|
+
exports.WebhookService = exports.INCLUDE_NEW_EVENT_TYPES = void 0;
|
|
4
|
+
exports.subscribed = subscribed;
|
|
4
5
|
exports.signDelivery = signDelivery;
|
|
6
|
+
const event_gate_1 = require("./event-gate");
|
|
5
7
|
const store_1 = require("./store");
|
|
8
|
+
const platform_1 = require("./handlers/platform");
|
|
9
|
+
const webhook_ext_1 = require("./webhook-ext");
|
|
10
|
+
const gated = new Set(event_gate_1.GATED_EVENTS);
|
|
11
|
+
exports.INCLUDE_NEW_EVENT_TYPES = 'include_new_event_types';
|
|
12
|
+
/** Whether an endpoint subscribed to `type`: naming it always delivers; `*` skips events added after the endpoint (see `GATED_EVENTS`) unless it opted in. */
|
|
13
|
+
function subscribed(enabled, type, endpointCreatedAt) {
|
|
14
|
+
if (enabled.includes(type))
|
|
15
|
+
return true;
|
|
16
|
+
if (!enabled.includes('*'))
|
|
17
|
+
return false;
|
|
18
|
+
if (!gated.has(type) || enabled.includes(exports.INCLUDE_NEW_EVENT_TYPES))
|
|
19
|
+
return true;
|
|
20
|
+
return endpointCreatedAt >= Date.parse(`${event_gate_1.WILDCARD_GATE_DATE}T00:00:00.000Z`);
|
|
21
|
+
}
|
|
6
22
|
const enc = new TextEncoder();
|
|
7
23
|
const b64 = (bytes) => {
|
|
8
24
|
let s = '';
|
|
@@ -61,12 +77,18 @@ class WebhookService {
|
|
|
61
77
|
const payload = { id, type, timestamp: now, instance_id: this.engine.instanceId, actor, idempotency_key: id, data };
|
|
62
78
|
const event = { id, type, created_at: now, payload };
|
|
63
79
|
this.events.push(event);
|
|
80
|
+
// Events and fan-out are counted against the write budget and announced when over; never dropped.
|
|
81
|
+
if (type !== 'write_budget.exceeded')
|
|
82
|
+
(0, platform_1.chargeBudget)(this.engine, 'events');
|
|
64
83
|
for (const ep of this.engine.db.endpoints.all()) {
|
|
65
84
|
if (ep.active === false)
|
|
66
85
|
continue;
|
|
67
86
|
const wanted = ep.enabled_events ?? ['*'];
|
|
68
|
-
if (wanted.
|
|
87
|
+
if (subscribed(wanted, type, ep.created_at ?? 0) && (0, webhook_ext_1.filtersMatch)(ep.filters, data)) {
|
|
88
|
+
if (type !== 'write_budget.exceeded')
|
|
89
|
+
(0, platform_1.chargeBudget)(this.engine, 'webhook_fanout');
|
|
69
90
|
this.dispatch(ep.id, event, 1);
|
|
91
|
+
}
|
|
70
92
|
}
|
|
71
93
|
return event;
|
|
72
94
|
}
|
|
@@ -95,6 +117,16 @@ class WebhookService {
|
|
|
95
117
|
const ep = this.engine.db.endpoints.get(endpointId);
|
|
96
118
|
if (!ep || ep.active === false)
|
|
97
119
|
return;
|
|
120
|
+
// Over the endpoint's max_rps: wait for the next window; the attempt is not consumed.
|
|
121
|
+
if (!(0, webhook_ext_1.takeRate)(this.engine, ep)) {
|
|
122
|
+
const t = setTimeout(() => {
|
|
123
|
+
this.timers.delete(t);
|
|
124
|
+
this.dispatch(endpointId, event, attempt);
|
|
125
|
+
}, 1000);
|
|
126
|
+
t.unref?.();
|
|
127
|
+
this.timers.add(t);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
98
130
|
const body = JSON.stringify(event.payload);
|
|
99
131
|
const now = this.engine.clock.now();
|
|
100
132
|
const deliveryId = (0, store_1.newId)('whdl', now);
|
|
@@ -109,9 +141,11 @@ class WebhookService {
|
|
|
109
141
|
}
|
|
110
142
|
else {
|
|
111
143
|
try {
|
|
112
|
-
const headers = { 'content-type': 'application/json', 'user-agent': 'Atlas-Emulator/1', ...(await signDelivery({ secret: ep.secret, id: event.id, timestampMs: now, body })) };
|
|
144
|
+
const headers = { 'content-type': 'application/json', 'user-agent': 'Atlas-Emulator/1', ...(await (0, webhook_ext_1.deliveryHeaders)(this.engine, ep)), ...(await signDelivery({ secret: ep.secret, id: event.id, timestampMs: now, body })) };
|
|
113
145
|
const res = await (this.engine.options.fetch ?? fetch)(ep.url, { method: 'POST', headers, body });
|
|
114
146
|
status = res.status;
|
|
147
|
+
if (status === 401)
|
|
148
|
+
(0, webhook_ext_1.evictToken)(this.engine, endpointId);
|
|
115
149
|
}
|
|
116
150
|
catch (e) {
|
|
117
151
|
error = e.message;
|
package/dist/webhooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":";;;AAYA,gCAKC;AAgDD,oCAkBC;AAhFD,6CAAgE;AAChE,mCAAgC;AAChC,kDAAmD;AACnD,+CAAoF;AAEpF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,yBAAY,CAAC,CAAC;AACvB,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AAEjE,8JAA8J;AAC9J,SAAgB,UAAU,CAAC,OAAiB,EAAE,IAAY,EAAE,iBAAyB;IACnF,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,+BAAuB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,OAAO,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,+BAAkB,gBAAgB,CAAC,CAAC;AAChF,CAAC;AA8BD,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AAC9B,MAAM,GAAG,GAAG,CAAC,KAAiB,EAAU,EAAE;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAc,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1F,KAAK,UAAU,IAAI,CAAC,QAAoB,EAAE,QAAgB;IACxD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAwB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/H,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAiB,CAAC,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAAC,KAAwE;IACzG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACrG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACrF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,EAAE;QACpB,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAC5C,iBAAiB,EAAE,MAAM,KAAK,EAAE;QAChC,YAAY,EAAE,KAAK,CAAC,EAAE;QACtB,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC;QAChC,mBAAmB,EAAE,MAAM,GAAG,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,MAAa,cAAc;IAOI;IANpB,MAAM,GAAmB,EAAE,CAAC;IAC5B,UAAU,GAAsB,EAAE,CAAC;IACnC,MAAM,GAAY,EAAE,CAAC;IACtB,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IACpC,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;IAE1D,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C,iFAAiF;IACjF,SAAS;QACP,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,IAAS,EAAE,QAAoB,IAAI;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,IAAA,aAAK,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACzH,MAAM,KAAK,GAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,kGAAkG;QAClG,IAAI,IAAI,KAAK,uBAAuB;YAAE,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;YAChD,IAAI,EAAE,CAAC,MAAM,KAAK,KAAK;gBAAE,SAAS;YAClC,MAAM,MAAM,GAAa,EAAE,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,IAAA,0BAAY,EAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;gBACnF,IAAI,IAAI,KAAK,uBAAuB;oBAAE,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;gBAClF,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sHAAsH;IACtH,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,OAAe;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,QAAQ,CAAC,UAAkB,EAAE,KAAmB,EAAE,OAAe;QACvE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC;aAC/C,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAEO,SAAS,CAAC,UAAkB;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC;YAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,KAAmB,EAAE,OAAe;QAC5E,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO;QACvC,sFAAsF;QACtF,IAAI,CAAC,IAAA,sBAAQ,EAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC,EAAE,IAAI,CAAC,CAAC;YACR,CAA4B,CAAC,KAAK,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAA,aAAK,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,KAAK,GAAG,0BAA0B,CAAC;;gBAC9D,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,IAAA,6BAAe,EAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5N,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBACpB,IAAI,MAAM,KAAK,GAAG;oBAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,KAAK,GAAI,CAAW,CAAC,OAAO,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACzK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO;YACjD,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE;YACxE,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,oBAAoB,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE,CAAC,aAAa,IAAI,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACpJ,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;oBACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;gBAChD,CAAC,EAAE,KAAK,CAAC,CAAC;gBACT,CAA4B,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,mHAAmH;IACnH,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,KAAK;QACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AA7HD,wCA6HC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlasauth/emulator-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "An in-memory Atlas engine driven by the OpenAPI document: stateful users, organizations, roles, API keys, machines and grants, real signed tokens, signed webhooks, the change feed and a message sink. Used by the emulator, the msw handlers and in-process tests.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"./package.json": "./package.json"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@atlasauth/backend": "0.
|
|
30
|
+
"@atlasauth/backend": "0.52.0"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"msw": "^2"
|