optio-api 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -7
- package/dist/_generated/optio-engine.d.ts +8 -0
- package/dist/_generated/optio-engine.d.ts.map +1 -1
- package/dist/_generated/optio-engine.js +3 -0
- package/dist/_generated/optio-engine.js.map +1 -1
- package/dist/access-scope.d.ts +53 -0
- package/dist/access-scope.d.ts.map +1 -0
- package/dist/access-scope.js +110 -0
- package/dist/access-scope.js.map +1 -0
- package/dist/adapters/express.d.ts +5 -0
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +35 -23
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/fastify.d.ts +5 -1
- package/dist/adapters/fastify.d.ts.map +1 -1
- package/dist/adapters/fastify.js +74 -33
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/nextjs-app.d.ts +5 -0
- package/dist/adapters/nextjs-app.d.ts.map +1 -1
- package/dist/adapters/nextjs-app.js +44 -15
- package/dist/adapters/nextjs-app.js.map +1 -1
- package/dist/adapters/nextjs-pages.d.ts +5 -0
- package/dist/adapters/nextjs-pages.d.ts.map +1 -1
- package/dist/adapters/nextjs-pages.js +41 -15
- package/dist/adapters/nextjs-pages.js.map +1 -1
- package/dist/auth.d.ts +48 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +44 -0
- package/dist/auth.js.map +1 -1
- package/dist/discovery.d.ts +7 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +18 -11
- package/dist/discovery.js.map +1 -1
- package/dist/handlers.d.ts +44 -14
- package/dist/handlers.d.ts.map +1 -1
- package/dist/handlers.js +78 -20
- package/dist/handlers.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/process-change-hub.d.ts +87 -0
- package/dist/process-change-hub.d.ts.map +1 -0
- package/dist/process-change-hub.js +268 -0
- package/dist/process-change-hub.js.map +1 -0
- package/dist/process-change-relevance.d.ts +57 -0
- package/dist/process-change-relevance.d.ts.map +1 -0
- package/dist/process-change-relevance.js +101 -0
- package/dist/process-change-relevance.js.map +1 -0
- package/dist/stream-poller.d.ts +13 -1
- package/dist/stream-poller.d.ts.map +1 -1
- package/dist/stream-poller.js +290 -260
- package/dist/stream-poller.js.map +1 -1
- package/package.json +2 -2
package/dist/handlers.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ObjectId } from 'mongodb';
|
|
2
2
|
import { metadataFilterToMongo } from './metadata-filter-query.js';
|
|
3
|
-
import { findProcessByEitherId } from './process-id-resolver.js';
|
|
4
3
|
import { resolveDb, resolveOptioEngine } from './resolve.js';
|
|
4
|
+
import { UNRESTRICTED } from './auth.js';
|
|
5
|
+
import { andScope, findScopedProcess, gateProcess, scopedResyncFilter } from './access-scope.js';
|
|
5
6
|
function col(db, prefix) {
|
|
6
7
|
return db.collection(`${prefix}_processes`);
|
|
7
8
|
}
|
|
@@ -18,12 +19,10 @@ function toResponse(proc) {
|
|
|
18
19
|
rootId: proc.rootId.toString(),
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
|
-
export async function listProcesses(ctx, query) {
|
|
22
|
+
export async function listProcesses(ctx, query, access = UNRESTRICTED) {
|
|
22
23
|
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
23
24
|
const { cursor, limit, rootId, state, metadataFilter } = query;
|
|
24
|
-
const filter = {
|
|
25
|
-
...metadataFilterToMongo(metadataFilter),
|
|
26
|
-
};
|
|
25
|
+
const filter = andScope({ ...metadataFilterToMongo(metadataFilter) }, access.scope);
|
|
27
26
|
if (rootId)
|
|
28
27
|
filter.rootId = new ObjectId(rootId);
|
|
29
28
|
if (state)
|
|
@@ -43,9 +42,9 @@ export async function listProcesses(ctx, query) {
|
|
|
43
42
|
totalCount,
|
|
44
43
|
};
|
|
45
44
|
}
|
|
46
|
-
export async function getProcess(ctx, query, id) {
|
|
45
|
+
export async function getProcess(ctx, query, id, access = UNRESTRICTED) {
|
|
47
46
|
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
48
|
-
const proc = await
|
|
47
|
+
const proc = await findScopedProcess(col(db, prefix), id, access.scope);
|
|
49
48
|
if (!proc)
|
|
50
49
|
return null;
|
|
51
50
|
return toResponse(proc);
|
|
@@ -73,19 +72,20 @@ async function buildTree(db, prefix, processId, maxDepth, currentDepth = 0) {
|
|
|
73
72
|
children,
|
|
74
73
|
};
|
|
75
74
|
}
|
|
76
|
-
export async function getProcessTree(ctx, query, id) {
|
|
75
|
+
export async function getProcessTree(ctx, query, id, access = UNRESTRICTED) {
|
|
77
76
|
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
78
77
|
// Resolve the entry-point doc first so we can accept either id form.
|
|
79
78
|
// Internal recursion in `buildTree` walks via `parentId` ObjectId
|
|
80
|
-
// references and does not need the lookup helper
|
|
81
|
-
|
|
79
|
+
// references and does not need the lookup helper; the whole tree shares
|
|
80
|
+
// the entry point's tenant, so the scope is checked there only.
|
|
81
|
+
const entry = await findScopedProcess(col(db, prefix), id, access.scope);
|
|
82
82
|
if (!entry)
|
|
83
83
|
return null;
|
|
84
84
|
return buildTree(db, prefix, entry._id, query.maxDepth);
|
|
85
85
|
}
|
|
86
|
-
export async function getProcessLog(ctx, query, id) {
|
|
86
|
+
export async function getProcessLog(ctx, query, id, access = UNRESTRICTED) {
|
|
87
87
|
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
88
|
-
const proc = await
|
|
88
|
+
const proc = await findScopedProcess(col(db, prefix), id, access.scope);
|
|
89
89
|
if (!proc)
|
|
90
90
|
return null;
|
|
91
91
|
const { cursor, limit } = query;
|
|
@@ -100,9 +100,9 @@ export async function getProcessLog(ctx, query, id) {
|
|
|
100
100
|
totalCount: proc.log.length,
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
|
-
export async function getProcessTreeLog(ctx, query, id) {
|
|
103
|
+
export async function getProcessTreeLog(ctx, query, id, access = UNRESTRICTED) {
|
|
104
104
|
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
105
|
-
const proc = await
|
|
105
|
+
const proc = await findScopedProcess(col(db, prefix), id, access.scope);
|
|
106
106
|
if (!proc)
|
|
107
107
|
return null;
|
|
108
108
|
const { maxDepth, cursor, limit } = query;
|
|
@@ -128,6 +128,7 @@ export async function getProcessTreeLog(ctx, query, id) {
|
|
|
128
128
|
totalCount: allLogs.length,
|
|
129
129
|
};
|
|
130
130
|
}
|
|
131
|
+
const FORBIDDEN = { status: 403, body: { message: 'Forbidden' } };
|
|
131
132
|
const LAUNCH_STATUS = {
|
|
132
133
|
'not-found': 404,
|
|
133
134
|
'not-launchable': 409,
|
|
@@ -159,30 +160,87 @@ function cancelFail(reason) {
|
|
|
159
160
|
function dismissFail(reason) {
|
|
160
161
|
return { status: DISMISS_STATUS[reason], body: { reason, message: MESSAGES[reason] } };
|
|
161
162
|
}
|
|
162
|
-
export async function launchProcess(ctx, query, id, resume = false, sessionId = null) {
|
|
163
|
+
export async function launchProcess(ctx, query, id, resume = false, sessionId = null, access = UNRESTRICTED) {
|
|
164
|
+
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
165
|
+
const gate = await gateProcess(col(db, prefix), id, access, 'launch');
|
|
166
|
+
if (!gate.ok)
|
|
167
|
+
return gate.status === 404 ? launchFail('not-found') : FORBIDDEN;
|
|
163
168
|
const engine = resolveOptioEngine(ctx, query);
|
|
164
169
|
const result = await engine.launch({ processId: id, resume, sessionId });
|
|
165
170
|
if (result.ok)
|
|
166
171
|
return { status: 200, body: toResponse(result.process) };
|
|
167
172
|
return launchFail(result.reason);
|
|
168
173
|
}
|
|
169
|
-
export async function cancelProcess(ctx, query, id) {
|
|
174
|
+
export async function cancelProcess(ctx, query, id, access = UNRESTRICTED) {
|
|
175
|
+
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
176
|
+
const gate = await gateProcess(col(db, prefix), id, access, 'cancel');
|
|
177
|
+
if (!gate.ok)
|
|
178
|
+
return gate.status === 404 ? cancelFail('not-found') : FORBIDDEN;
|
|
170
179
|
const engine = resolveOptioEngine(ctx, query);
|
|
171
180
|
const result = await engine.cancel({ processId: id });
|
|
172
181
|
if (result.ok)
|
|
173
182
|
return { status: 200, body: toResponse(result.process) };
|
|
174
183
|
return cancelFail(result.reason);
|
|
175
184
|
}
|
|
176
|
-
export async function dismissProcess(ctx, query, id) {
|
|
185
|
+
export async function dismissProcess(ctx, query, id, access = UNRESTRICTED) {
|
|
186
|
+
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
187
|
+
const gate = await gateProcess(col(db, prefix), id, access, 'dismiss');
|
|
188
|
+
if (!gate.ok)
|
|
189
|
+
return gate.status === 404 ? dismissFail('not-found') : FORBIDDEN;
|
|
177
190
|
const engine = resolveOptioEngine(ctx, query);
|
|
178
191
|
const result = await engine.dismiss({ processId: id });
|
|
179
192
|
if (result.ok)
|
|
180
193
|
return { status: 200, body: toResponse(result.process) };
|
|
181
194
|
return dismissFail(result.reason);
|
|
182
195
|
}
|
|
183
|
-
|
|
196
|
+
const RESURRECT_STATUS = {
|
|
197
|
+
'not-found': 404,
|
|
198
|
+
'not-resurrectable': 409,
|
|
199
|
+
'no-resurrect-support': 409,
|
|
200
|
+
'resurrect-in-progress': 409,
|
|
201
|
+
'launch-blocked': 409,
|
|
202
|
+
'shutting-down': 409,
|
|
203
|
+
};
|
|
204
|
+
const RESURRECT_MESSAGES = {
|
|
205
|
+
'not-found': 'Process not found',
|
|
206
|
+
'not-resurrectable': 'Process has no unsaved work to resurrect, or is still active',
|
|
207
|
+
'no-resurrect-support': 'This task does not support resurrect',
|
|
208
|
+
'resurrect-in-progress': 'A resurrect of this process is already running',
|
|
209
|
+
'launch-blocked': 'Launches matching this filter are currently blocked',
|
|
210
|
+
'shutting-down': 'The engine is shutting down',
|
|
211
|
+
};
|
|
212
|
+
function resurrectFail(reason) {
|
|
213
|
+
return { status: RESURRECT_STATUS[reason], body: { reason, message: RESURRECT_MESSAGES[reason] } };
|
|
214
|
+
}
|
|
215
|
+
export async function resurrectProcess(ctx, query, id, sessionId = null, access = UNRESTRICTED) {
|
|
216
|
+
const { db, prefix } = resolveDb(ctx.dbOpts, query);
|
|
217
|
+
const gate = await gateProcess(col(db, prefix), id, access, 'resurrect');
|
|
218
|
+
if (!gate.ok)
|
|
219
|
+
return gate.status === 404 ? resurrectFail('not-found') : FORBIDDEN;
|
|
184
220
|
const engine = resolveOptioEngine(ctx, query);
|
|
185
|
-
await engine.
|
|
186
|
-
|
|
221
|
+
const result = await engine.resurrect({ processId: id, sessionId });
|
|
222
|
+
if (result.ok)
|
|
223
|
+
return { status: 200, body: toResponse(result.process) };
|
|
224
|
+
return resurrectFail(result.reason);
|
|
225
|
+
}
|
|
226
|
+
export async function resyncProcesses(ctx, query, clean = false, metadataFilter, access = UNRESTRICTED) {
|
|
227
|
+
// Under a scope the engine regenerates (and prunes) only the scope's tasks.
|
|
228
|
+
const scoped = scopedResyncFilter(metadataFilter, access.scope);
|
|
229
|
+
if (!scoped.ok)
|
|
230
|
+
return { status: scoped.status, body: { message: scoped.message } };
|
|
231
|
+
if (access.restricted
|
|
232
|
+
&& !(await access.authorize({
|
|
233
|
+
action: 'resync',
|
|
234
|
+
clean,
|
|
235
|
+
metadataFilter: scoped.filter,
|
|
236
|
+
}))) {
|
|
237
|
+
return FORBIDDEN;
|
|
238
|
+
}
|
|
239
|
+
const engine = resolveOptioEngine(ctx, query);
|
|
240
|
+
await engine.resync({ clean, metadataFilter: scoped.filter });
|
|
241
|
+
return {
|
|
242
|
+
status: 202,
|
|
243
|
+
body: { message: clean ? 'Nuke and resync requested' : 'Resync requested' },
|
|
244
|
+
};
|
|
187
245
|
}
|
|
188
246
|
//# sourceMappingURL=handlers.js.map
|
package/dist/handlers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export { listProcesses, getProcess, getProcessTree, getProcessLog, getProcessTreeLog, launchProcess, cancelProcess, dismissProcess, resyncProcesses, type ListQuery, type PaginationQuery, type TreeLogQuery, type LaunchCommandResult, type CancelCommandResult, type DismissCommandResult, } from './handlers.js';
|
|
1
|
+
export { listProcesses, getProcess, getProcessTree, getProcessLog, getProcessTreeLog, launchProcess, cancelProcess, dismissProcess, resurrectProcess, resyncProcesses, type ListQuery, type PaginationQuery, type TreeLogQuery, type LaunchCommandResult, type CancelCommandResult, type DismissCommandResult, type ResurrectCommandResult, type ResyncCommandResult, type ForbiddenResult, } from './handlers.js';
|
|
2
|
+
export { checkAuth, accessFor, resolveAccess, UNRESTRICTED, type OptioRole, type AuthCallback, type AuthResult, type Access, type AccessHooks, type ScopeCallback, type ScopeFilter, type AuthorizeCallback, type AuthorizeInput, type OptioAction, type ProcessRef, } from './auth.js';
|
|
3
|
+
export { andScope, scopeToMongo, inScope, findScopedProcess, gateProcess, gateInstances, scopedResyncFilter, toProcessRef, type GateResult, type ScopedFilterResult, } from './access-scope.js';
|
|
2
4
|
export type { ProcessMetadataFilter } from './types.js';
|
|
3
5
|
export { createListPoller, createTreePoller, type StreamPollerOptions, type TreePollerOptions, type ListPollerHandle } from './stream-poller.js';
|
|
4
6
|
export { discoverInstances } from './discovery.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,SAAS,EACT,aAAa,EACb,YAAY,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGjJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGxH,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,WAAW,GACjB,MAAM,4BAA4B,CAAC;AAWpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
// Handlers (framework-agnostic)
|
|
2
|
-
export { listProcesses, getProcess, getProcessTree, getProcessLog, getProcessTreeLog, launchProcess, cancelProcess, dismissProcess, resyncProcesses, } from './handlers.js';
|
|
2
|
+
export { listProcesses, getProcess, getProcessTree, getProcessLog, getProcessTreeLog, launchProcess, cancelProcess, dismissProcess, resurrectProcess, resyncProcesses, } from './handlers.js';
|
|
3
|
+
// Authentication + per-request access (scope / authorize hooks)
|
|
4
|
+
export { checkAuth, accessFor, resolveAccess, UNRESTRICTED, } from './auth.js';
|
|
5
|
+
// Scope helpers (for custom adapters)
|
|
6
|
+
export { andScope, scopeToMongo, inScope, findScopedProcess, gateProcess, gateInstances, scopedResyncFilter, toProcessRef, } from './access-scope.js';
|
|
3
7
|
// Stream poller (for custom adapters)
|
|
4
8
|
export { createListPoller, createTreePoller } from './stream-poller.js';
|
|
5
9
|
// Multi-db discovery
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,eAAe,GAUhB,MAAM,eAAe,CAAC;AAEvB,gEAAgE;AAChE,OAAO,EACL,SAAS,EACT,SAAS,EACT,aAAa,EACb,YAAY,GAYb,MAAM,WAAW,CAAC;AACnB,sCAAsC;AACtC,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,YAAY,GAGb,MAAM,mBAAmB,CAAC;AAI3B,sCAAsC;AACtC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAA2E,MAAM,oBAAoB,CAAC;AAEjJ,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAA6D,MAAM,cAAc,CAAC;AAExH,0BAA0B;AAC1B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,GAE5B,MAAM,4BAA4B,CAAC;AAEpC,uCAAuC;AACvC,EAAE;AACF,oCAAoC;AACpC,yEAAyE;AACzE,2EAA2E;AAC3E,2EAA2E;AAC3E,+CAA+C;AAC/C,wEAAwE;AACxE,wFAAwF;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAqB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One change stream per (database, prefix) per API process, shared by every
|
|
3
|
+
* live stream on it: each change goes to the subscribers it is relevant to,
|
|
4
|
+
* which re-read at most once a second. Where change streams are unavailable
|
|
5
|
+
* (a standalone mongod, no permission to watch) or while one is down, the hub
|
|
6
|
+
* asks every subscriber to re-read once a second instead -- the old polling.
|
|
7
|
+
*
|
|
8
|
+
* Spec: docs/2026-10-09-api-change-streams-design.md
|
|
9
|
+
*/
|
|
10
|
+
import type { Db } from 'mongodb';
|
|
11
|
+
import { type ProcessChange } from './process-change-relevance.js';
|
|
12
|
+
/** The server cannot provide change streams (standalone, or not allowed). */
|
|
13
|
+
export declare class ChangeStreamsUnavailable extends Error {
|
|
14
|
+
}
|
|
15
|
+
export interface ProcessChangeSource {
|
|
16
|
+
/** Start delivering changes. Rejects with ChangeStreamsUnavailable when the
|
|
17
|
+
* server cannot watch. After it resolves, `onError` is called once when
|
|
18
|
+
* the watch fails or ends. */
|
|
19
|
+
open(onChange: (c: ProcessChange) => void, onError: (err: unknown) => void): Promise<{
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export interface HubSubscriber {
|
|
24
|
+
isRelevant(c: ProcessChange): boolean;
|
|
25
|
+
refresh(): void;
|
|
26
|
+
}
|
|
27
|
+
export interface ProcessChangeHubOptions {
|
|
28
|
+
/** A subscriber re-reads at most once per this interval (leading edge). */
|
|
29
|
+
minIntervalMs?: number;
|
|
30
|
+
/** Polling mode: every subscriber re-reads at this interval. */
|
|
31
|
+
pollIntervalMs?: number;
|
|
32
|
+
/** After ChangeStreamsUnavailable, try the change stream again after this. */
|
|
33
|
+
retryUnavailableMs?: number;
|
|
34
|
+
/** Reopen backoff after any other error: from min, doubling, up to max. */
|
|
35
|
+
backoffMinMs?: number;
|
|
36
|
+
backoffMaxMs?: number;
|
|
37
|
+
}
|
|
38
|
+
export type HubMode = 'idle' | 'opening' | 'streaming' | 'polling';
|
|
39
|
+
export declare class ProcessChangeHub {
|
|
40
|
+
private readonly source;
|
|
41
|
+
private readonly entries;
|
|
42
|
+
private readonly minIntervalMs;
|
|
43
|
+
private readonly pollIntervalMs;
|
|
44
|
+
private readonly retryUnavailableMs;
|
|
45
|
+
private readonly backoffMinMs;
|
|
46
|
+
private readonly backoffMaxMs;
|
|
47
|
+
private _mode;
|
|
48
|
+
private opening;
|
|
49
|
+
private handle;
|
|
50
|
+
private pollTimer;
|
|
51
|
+
private retryTimer;
|
|
52
|
+
private backoffMs;
|
|
53
|
+
/** Bumped whenever the current stream (or open attempt) is abandoned, so
|
|
54
|
+
* its late callbacks are ignored. */
|
|
55
|
+
private generation;
|
|
56
|
+
constructor(source: ProcessChangeSource, opts?: ProcessChangeHubOptions);
|
|
57
|
+
get mode(): HubMode;
|
|
58
|
+
/** Number of subscribers. */
|
|
59
|
+
get size(): number;
|
|
60
|
+
/** Resolves once the change stream is open or the hub is polling; the
|
|
61
|
+
* subscriber makes its initial read after that, so no change is lost. */
|
|
62
|
+
subscribe(sub: HubSubscriber): Promise<void>;
|
|
63
|
+
unsubscribe(sub: HubSubscriber): void;
|
|
64
|
+
private shutdown;
|
|
65
|
+
/** `initial`: the first attempt from idle, whose subscribers make their
|
|
66
|
+
* initial reads themselves; every later (re)open re-reads everyone once. */
|
|
67
|
+
private tryOpen;
|
|
68
|
+
private onChange;
|
|
69
|
+
private onStreamError;
|
|
70
|
+
private nextBackoff;
|
|
71
|
+
private scheduleReopen;
|
|
72
|
+
private enterPolling;
|
|
73
|
+
private stopPolling;
|
|
74
|
+
private refreshAll;
|
|
75
|
+
/** At most one refresh per minIntervalMs: at once after a quiet interval,
|
|
76
|
+
* else once at its end however many requests arrive meanwhile. */
|
|
77
|
+
private requestRefresh;
|
|
78
|
+
}
|
|
79
|
+
/** A ProcessChangeSource over `{prefix}_processes` of `db`. Whether the
|
|
80
|
+
* server can watch is MongoDB's answer to the first read (a standalone
|
|
81
|
+
* mongod refuses with 40573; a replica set or a sharded cluster accepts). */
|
|
82
|
+
export declare function createMongoProcessChangeSource(db: Db, prefix: string): ProcessChangeSource;
|
|
83
|
+
/** The hub of `{prefix}_processes` in `db`, shared per client, database name
|
|
84
|
+
* and prefix (multi-database mode may create a new Db object per request).
|
|
85
|
+
* OPTIO_API_CHANGE_STREAMS=off makes new hubs poll. */
|
|
86
|
+
export declare function getProcessChangeHub(db: Db, prefix: string): ProcessChangeHub;
|
|
87
|
+
//# sourceMappingURL=process-change-hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-change-hub.d.ts","sourceRoot":"","sources":["../src/process-change-hub.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAsC,EAAE,EAAoC,MAAM,SAAS,CAAC;AACxG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEpF,6EAA6E;AAC7E,qBAAa,wBAAyB,SAAQ,KAAK;CAAG;AAMtD,MAAM,WAAW,mBAAmB;IAClC;;mCAE+B;IAC/B,IAAI,CACF,QAAQ,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,EACpC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC9B,OAAO,CAAC;QAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC;IACtC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAQD,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAEnE,qBAAa,gBAAgB;IAiBf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAhBnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,SAAS,CAAS;IAC1B;0CACsC;IACtC,OAAO,CAAC,UAAU,CAAK;gBAEM,MAAM,EAAE,mBAAmB,EAAE,IAAI,GAAE,uBAA4B;IAS5F,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,6BAA6B;IAC7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;8EAC0E;IACpE,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAQrC,OAAO,CAAC,QAAQ;IAahB;iFAC6E;YAC/D,OAAO;IAuBrB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;IAIlB;uEACmE;IACnE,OAAO,CAAC,cAAc;CAevB;AA+BD;;8EAE8E;AAC9E,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAsC1F;AAUD;;wDAEwD;AACxD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAgB5E"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { toProcessChange } from './process-change-relevance.js';
|
|
2
|
+
/** The server cannot provide change streams (standalone, or not allowed). */
|
|
3
|
+
export class ChangeStreamsUnavailable extends Error {
|
|
4
|
+
}
|
|
5
|
+
/** MongoDB error codes that mean "cannot watch here": change streams need a
|
|
6
|
+
* replica set (40573); the user may not watch (13, Unauthorized). */
|
|
7
|
+
const UNAVAILABLE_CODES = new Set([40573, 13]);
|
|
8
|
+
export class ProcessChangeHub {
|
|
9
|
+
source;
|
|
10
|
+
entries = new Map();
|
|
11
|
+
minIntervalMs;
|
|
12
|
+
pollIntervalMs;
|
|
13
|
+
retryUnavailableMs;
|
|
14
|
+
backoffMinMs;
|
|
15
|
+
backoffMaxMs;
|
|
16
|
+
_mode = 'idle';
|
|
17
|
+
opening = null;
|
|
18
|
+
handle = null;
|
|
19
|
+
pollTimer = null;
|
|
20
|
+
retryTimer = null;
|
|
21
|
+
backoffMs;
|
|
22
|
+
/** Bumped whenever the current stream (or open attempt) is abandoned, so
|
|
23
|
+
* its late callbacks are ignored. */
|
|
24
|
+
generation = 0;
|
|
25
|
+
constructor(source, opts = {}) {
|
|
26
|
+
this.source = source;
|
|
27
|
+
this.minIntervalMs = opts.minIntervalMs ?? 1000;
|
|
28
|
+
this.pollIntervalMs = opts.pollIntervalMs ?? 1000;
|
|
29
|
+
this.retryUnavailableMs = opts.retryUnavailableMs ?? 300_000;
|
|
30
|
+
this.backoffMinMs = opts.backoffMinMs ?? 1000;
|
|
31
|
+
this.backoffMaxMs = opts.backoffMaxMs ?? 30_000;
|
|
32
|
+
this.backoffMs = this.backoffMinMs;
|
|
33
|
+
}
|
|
34
|
+
get mode() {
|
|
35
|
+
return this._mode;
|
|
36
|
+
}
|
|
37
|
+
/** Number of subscribers. */
|
|
38
|
+
get size() {
|
|
39
|
+
return this.entries.size;
|
|
40
|
+
}
|
|
41
|
+
/** Resolves once the change stream is open or the hub is polling; the
|
|
42
|
+
* subscriber makes its initial read after that, so no change is lost. */
|
|
43
|
+
async subscribe(sub) {
|
|
44
|
+
if (!this.entries.has(sub))
|
|
45
|
+
this.entries.set(sub, { sub, last: -Infinity, timer: null });
|
|
46
|
+
if (this._mode === 'idle') {
|
|
47
|
+
this._mode = 'opening';
|
|
48
|
+
this.opening = this.tryOpen(true);
|
|
49
|
+
}
|
|
50
|
+
if (this._mode === 'opening' && this.opening)
|
|
51
|
+
await this.opening;
|
|
52
|
+
}
|
|
53
|
+
unsubscribe(sub) {
|
|
54
|
+
const entry = this.entries.get(sub);
|
|
55
|
+
if (!entry)
|
|
56
|
+
return;
|
|
57
|
+
if (entry.timer)
|
|
58
|
+
clearTimeout(entry.timer);
|
|
59
|
+
this.entries.delete(sub);
|
|
60
|
+
if (this.entries.size === 0)
|
|
61
|
+
this.shutdown();
|
|
62
|
+
}
|
|
63
|
+
shutdown() {
|
|
64
|
+
this.generation++;
|
|
65
|
+
this.stopPolling();
|
|
66
|
+
if (this.retryTimer)
|
|
67
|
+
clearTimeout(this.retryTimer);
|
|
68
|
+
this.retryTimer = null;
|
|
69
|
+
const handle = this.handle;
|
|
70
|
+
this.handle = null;
|
|
71
|
+
if (handle)
|
|
72
|
+
void handle.close().catch(() => { });
|
|
73
|
+
this.backoffMs = this.backoffMinMs;
|
|
74
|
+
this.opening = null;
|
|
75
|
+
this._mode = 'idle';
|
|
76
|
+
}
|
|
77
|
+
/** `initial`: the first attempt from idle, whose subscribers make their
|
|
78
|
+
* initial reads themselves; every later (re)open re-reads everyone once. */
|
|
79
|
+
async tryOpen(initial) {
|
|
80
|
+
const gen = ++this.generation;
|
|
81
|
+
try {
|
|
82
|
+
const handle = await this.source.open((c) => this.onChange(gen, c), (err) => this.onStreamError(gen, err));
|
|
83
|
+
if (gen !== this.generation) {
|
|
84
|
+
void handle.close().catch(() => { });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.handle = handle;
|
|
88
|
+
this._mode = 'streaming';
|
|
89
|
+
this.stopPolling();
|
|
90
|
+
this.backoffMs = this.backoffMinMs;
|
|
91
|
+
if (!initial)
|
|
92
|
+
this.refreshAll();
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
if (gen !== this.generation)
|
|
96
|
+
return;
|
|
97
|
+
this.enterPolling();
|
|
98
|
+
this.scheduleReopen(err instanceof ChangeStreamsUnavailable ? this.retryUnavailableMs : this.nextBackoff());
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
onChange(gen, c) {
|
|
102
|
+
if (gen !== this.generation)
|
|
103
|
+
return;
|
|
104
|
+
for (const entry of this.entries.values()) {
|
|
105
|
+
if (c.op === 'invalidate' || entry.sub.isRelevant(c))
|
|
106
|
+
this.requestRefresh(entry);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
onStreamError(gen, _err) {
|
|
110
|
+
if (gen !== this.generation)
|
|
111
|
+
return;
|
|
112
|
+
this.generation++;
|
|
113
|
+
const handle = this.handle;
|
|
114
|
+
this.handle = null;
|
|
115
|
+
if (handle)
|
|
116
|
+
void handle.close().catch(() => { });
|
|
117
|
+
this.enterPolling();
|
|
118
|
+
this.scheduleReopen(this.nextBackoff());
|
|
119
|
+
}
|
|
120
|
+
nextBackoff() {
|
|
121
|
+
const delay = this.backoffMs;
|
|
122
|
+
this.backoffMs = Math.min(this.backoffMs * 2, this.backoffMaxMs);
|
|
123
|
+
return delay;
|
|
124
|
+
}
|
|
125
|
+
scheduleReopen(delayMs) {
|
|
126
|
+
if (this.retryTimer)
|
|
127
|
+
clearTimeout(this.retryTimer);
|
|
128
|
+
this.retryTimer = setTimeout(() => {
|
|
129
|
+
this.retryTimer = null;
|
|
130
|
+
if (this.entries.size > 0)
|
|
131
|
+
void this.tryOpen(false);
|
|
132
|
+
}, delayMs);
|
|
133
|
+
}
|
|
134
|
+
enterPolling() {
|
|
135
|
+
this._mode = 'polling';
|
|
136
|
+
if (!this.pollTimer) {
|
|
137
|
+
this.pollTimer = setInterval(() => this.refreshAll(), this.pollIntervalMs);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
stopPolling() {
|
|
141
|
+
if (this.pollTimer)
|
|
142
|
+
clearInterval(this.pollTimer);
|
|
143
|
+
this.pollTimer = null;
|
|
144
|
+
}
|
|
145
|
+
refreshAll() {
|
|
146
|
+
for (const entry of this.entries.values())
|
|
147
|
+
this.requestRefresh(entry);
|
|
148
|
+
}
|
|
149
|
+
/** At most one refresh per minIntervalMs: at once after a quiet interval,
|
|
150
|
+
* else once at its end however many requests arrive meanwhile. */
|
|
151
|
+
requestRefresh(entry) {
|
|
152
|
+
if (entry.timer)
|
|
153
|
+
return;
|
|
154
|
+
const wait = entry.last + this.minIntervalMs - Date.now();
|
|
155
|
+
if (wait <= 0) {
|
|
156
|
+
entry.last = Date.now();
|
|
157
|
+
entry.sub.refresh();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
entry.timer = setTimeout(() => {
|
|
161
|
+
entry.timer = null;
|
|
162
|
+
if (!this.entries.has(entry.sub))
|
|
163
|
+
return;
|
|
164
|
+
entry.last = Date.now();
|
|
165
|
+
entry.sub.refresh();
|
|
166
|
+
}, wait);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function unavailable(err) {
|
|
170
|
+
const code = err?.code;
|
|
171
|
+
return typeof code === 'number' && UNAVAILABLE_CODES.has(code);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Runs inside MongoDB: each change is cut down to what the relevance rules
|
|
175
|
+
* use -- operation, id, the changed top-level field names, an insert's or
|
|
176
|
+
* replace's `rootId` and `originatingSessionId`, an update's new
|
|
177
|
+
* `originatingSessionId` -- so log lines, progress messages and whole new
|
|
178
|
+
* documents never reach the API. `_id` (the resume token) stays.
|
|
179
|
+
*/
|
|
180
|
+
const TRIM_CHANGES = [{
|
|
181
|
+
$project: {
|
|
182
|
+
operationType: 1,
|
|
183
|
+
documentKey: 1,
|
|
184
|
+
'fullDocument.rootId': 1,
|
|
185
|
+
'fullDocument.originatingSessionId': 1,
|
|
186
|
+
changedFields: {
|
|
187
|
+
$concatArrays: [
|
|
188
|
+
{ $map: { input: { $objectToArray: { $ifNull: ['$updateDescription.updatedFields', {}] } }, in: '$$this.k' } },
|
|
189
|
+
{ $ifNull: ['$updateDescription.removedFields', []] },
|
|
190
|
+
{ $map: { input: { $ifNull: ['$updateDescription.truncatedArrays', []] }, in: '$$this.field' } },
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
sessionValue: '$updateDescription.updatedFields.originatingSessionId',
|
|
194
|
+
},
|
|
195
|
+
}];
|
|
196
|
+
/** A ProcessChangeSource over `{prefix}_processes` of `db`. Whether the
|
|
197
|
+
* server can watch is MongoDB's answer to the first read (a standalone
|
|
198
|
+
* mongod refuses with 40573; a replica set or a sharded cluster accepts). */
|
|
199
|
+
export function createMongoProcessChangeSource(db, prefix) {
|
|
200
|
+
return {
|
|
201
|
+
async open(onChange, onError) {
|
|
202
|
+
const hello = await db.admin().command({ hello: 1 });
|
|
203
|
+
// From the cluster time of `hello`: nothing written after open()
|
|
204
|
+
// resolves is missed.
|
|
205
|
+
const startAtOperationTime = hello.operationTime;
|
|
206
|
+
const stream = db.collection(`${prefix}_processes`).watch(TRIM_CHANGES, startAtOperationTime ? { startAtOperationTime } : {});
|
|
207
|
+
let closed = false;
|
|
208
|
+
const deliver = (ev) => {
|
|
209
|
+
const change = ev ? toProcessChange(ev) : null;
|
|
210
|
+
if (change)
|
|
211
|
+
onChange(change);
|
|
212
|
+
};
|
|
213
|
+
try {
|
|
214
|
+
// Creates the cursor on the server now, so a refusal shows here.
|
|
215
|
+
deliver(await stream.tryNext());
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
await stream.close().catch(() => { });
|
|
219
|
+
if (unavailable(err))
|
|
220
|
+
throw new ChangeStreamsUnavailable(String(err));
|
|
221
|
+
throw err;
|
|
222
|
+
}
|
|
223
|
+
void (async () => {
|
|
224
|
+
try {
|
|
225
|
+
while (!closed)
|
|
226
|
+
deliver(await stream.next());
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
if (!closed)
|
|
230
|
+
onError(err);
|
|
231
|
+
}
|
|
232
|
+
})();
|
|
233
|
+
return {
|
|
234
|
+
async close() {
|
|
235
|
+
closed = true;
|
|
236
|
+
await stream.close();
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
const UNAVAILABLE_SOURCE = {
|
|
243
|
+
async open() {
|
|
244
|
+
throw new ChangeStreamsUnavailable('change streams switched off (OPTIO_API_CHANGE_STREAMS=off)');
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
const registry = new WeakMap();
|
|
248
|
+
/** The hub of `{prefix}_processes` in `db`, shared per client, database name
|
|
249
|
+
* and prefix (multi-database mode may create a new Db object per request).
|
|
250
|
+
* OPTIO_API_CHANGE_STREAMS=off makes new hubs poll. */
|
|
251
|
+
export function getProcessChangeHub(db, prefix) {
|
|
252
|
+
let hubs = registry.get(db.client);
|
|
253
|
+
if (!hubs) {
|
|
254
|
+
hubs = new Map();
|
|
255
|
+
registry.set(db.client, hubs);
|
|
256
|
+
}
|
|
257
|
+
const key = `${db.databaseName}\u0000${prefix}`;
|
|
258
|
+
let hub = hubs.get(key);
|
|
259
|
+
if (!hub) {
|
|
260
|
+
const source = process.env.OPTIO_API_CHANGE_STREAMS === 'off'
|
|
261
|
+
? UNAVAILABLE_SOURCE
|
|
262
|
+
: createMongoProcessChangeSource(db, prefix);
|
|
263
|
+
hub = new ProcessChangeHub(source);
|
|
264
|
+
hubs.set(key, hub);
|
|
265
|
+
}
|
|
266
|
+
return hub;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=process-change-hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-change-hub.js","sourceRoot":"","sources":["../src/process-change-hub.ts"],"names":[],"mappings":"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"}
|