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.
Files changed (54) hide show
  1. package/README.md +39 -7
  2. package/dist/_generated/optio-engine.d.ts +8 -0
  3. package/dist/_generated/optio-engine.d.ts.map +1 -1
  4. package/dist/_generated/optio-engine.js +3 -0
  5. package/dist/_generated/optio-engine.js.map +1 -1
  6. package/dist/access-scope.d.ts +53 -0
  7. package/dist/access-scope.d.ts.map +1 -0
  8. package/dist/access-scope.js +110 -0
  9. package/dist/access-scope.js.map +1 -0
  10. package/dist/adapters/express.d.ts +5 -0
  11. package/dist/adapters/express.d.ts.map +1 -1
  12. package/dist/adapters/express.js +35 -23
  13. package/dist/adapters/express.js.map +1 -1
  14. package/dist/adapters/fastify.d.ts +5 -1
  15. package/dist/adapters/fastify.d.ts.map +1 -1
  16. package/dist/adapters/fastify.js +74 -33
  17. package/dist/adapters/fastify.js.map +1 -1
  18. package/dist/adapters/nextjs-app.d.ts +5 -0
  19. package/dist/adapters/nextjs-app.d.ts.map +1 -1
  20. package/dist/adapters/nextjs-app.js +44 -15
  21. package/dist/adapters/nextjs-app.js.map +1 -1
  22. package/dist/adapters/nextjs-pages.d.ts +5 -0
  23. package/dist/adapters/nextjs-pages.d.ts.map +1 -1
  24. package/dist/adapters/nextjs-pages.js +41 -15
  25. package/dist/adapters/nextjs-pages.js.map +1 -1
  26. package/dist/auth.d.ts +48 -0
  27. package/dist/auth.d.ts.map +1 -1
  28. package/dist/auth.js +44 -0
  29. package/dist/auth.js.map +1 -1
  30. package/dist/discovery.d.ts +7 -1
  31. package/dist/discovery.d.ts.map +1 -1
  32. package/dist/discovery.js +18 -11
  33. package/dist/discovery.js.map +1 -1
  34. package/dist/handlers.d.ts +44 -14
  35. package/dist/handlers.d.ts.map +1 -1
  36. package/dist/handlers.js +78 -20
  37. package/dist/handlers.js.map +1 -1
  38. package/dist/index.d.ts +3 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +5 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/process-change-hub.d.ts +87 -0
  43. package/dist/process-change-hub.d.ts.map +1 -0
  44. package/dist/process-change-hub.js +268 -0
  45. package/dist/process-change-hub.js.map +1 -0
  46. package/dist/process-change-relevance.d.ts +57 -0
  47. package/dist/process-change-relevance.d.ts.map +1 -0
  48. package/dist/process-change-relevance.js +101 -0
  49. package/dist/process-change-relevance.js.map +1 -0
  50. package/dist/stream-poller.d.ts +13 -1
  51. package/dist/stream-poller.d.ts.map +1 -1
  52. package/dist/stream-poller.js +290 -260
  53. package/dist/stream-poller.js.map +1 -1
  54. 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 findProcessByEitherId(col(db, prefix), id);
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
- const entry = await findProcessByEitherId(col(db, prefix), id);
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 findProcessByEitherId(col(db, prefix), id);
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 findProcessByEitherId(col(db, prefix), id);
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
- export async function resyncProcesses(ctx, query, clean = false, metadataFilter) {
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.resync({ clean, metadataFilter });
186
- return { message: clean ? 'Nuke and resync requested' : 'Resync requested' };
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
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAW,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAO7D,SAAS,GAAG,CAAC,EAAM,EAAE,MAAc;IACjC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,qBAAqB,CAAgC,IAAO;IACnE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAS;IAC3B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;KAC/B,CAAC;AACJ,CAAC;AAiBD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAiB,EAAE,KAAyB;IAC9E,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAE/D,MAAM,MAAM,GAA4B;QACtC,GAAG,qBAAqB,CAAC,cAAc,CAAC;KACzC,CAAC;IACF,IAAI,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,KAAK;QAAE,MAAM,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;IAC1C,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IAEvD,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE;QACxE,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;KACvC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACrC,IAAI,OAAO;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;QAC5B,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QACnE,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAiB,EACjB,KAA6C,EAC7C,EAAU;IAEV,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,EAAM,EAAE,MAAc,EAAE,SAAmB,EAAE,QAAiB,EAAE,YAAY,GAAG,CAAC;IACvG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,QAAQ,GAAU,EAAE,CAAC;IACzB,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,GAAG,QAAQ,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;aACpC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;aAC7B,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAClB,OAAO,EAAE,CAAC;QAEb,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAC1B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAC/E,CAAC;QACF,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAiB,EACjB,KAAgE,EAChE,EAAU;IAEV,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,qEAAqE;IACrE,kEAAkE;IAClE,kDAAkD;IAClD,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AACtE,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAiB,EACjB,KAAyB,EACzB,EAAU;IAEV,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;IACxC,IAAI,OAAO;QAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;IAE5B,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;QACrD,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAiB,EACjB,KAA6B,EAC7B,EAAU;IAEV,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAC1C,MAAM,MAAM,GAA4B,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAChE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAE9D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE,CAC1C,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;QACzB,GAAG,KAAK;QACR,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;QAC3B,YAAY,EAAE,CAAC,CAAC,IAAI;KACrB,CAAC,CAAC,CACJ,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpG,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;IACxC,IAAI,OAAO;QAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC5B,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;QACrD,UAAU,EAAE,OAAO,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC;AAgBD,MAAM,aAAa,GAA+C;IAChE,WAAW,EAAE,GAAG;IAChB,gBAAgB,EAAE,GAAG;IACrB,mBAAmB,EAAE,GAAG;IACxB,gBAAgB,EAAE,GAAG;CACtB,CAAC;AAEF,MAAM,aAAa,GAA+C;IAChE,WAAW,EAAE,GAAG;IAChB,iBAAiB,EAAE,GAAG;CACvB,CAAC;AAEF,MAAM,cAAc,GAAgD;IAClE,WAAW,EAAE,GAAG;IAChB,iBAAiB,EAAE,GAAG;CACvB,CAAC;AAEF,MAAM,QAAQ,GAGV;IACF,WAAW,EAAE,mBAAmB;IAChC,gBAAgB,EAAE,sCAAsC;IACxD,mBAAmB,EAAE,mCAAmC;IACxD,gBAAgB,EAAE,qDAAqD;IACvE,iBAAiB,EAAE,iDAAiD;IACpE,iBAAiB,EAAE,uCAAuC;CAC3D,CAAC;AAEF,SAAS,UAAU,CAAC,MAA+B;IACjD,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,UAAU,CAAC,MAA+B;IACjD,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,WAAW,CAAC,MAAgC;IACnD,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAiB,EACjB,KAA6C,EAC7C,EAAU,EACV,SAAkB,KAAK,EACvB,YAA2B,IAAI;IAE/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACzE,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACxE,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAiB,EACjB,KAA6C,EAC7C,EAAU;IAEV,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACxE,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAiB,EACjB,KAA6C,EAC7C,EAAU;IAEV,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACxE,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAiB,EACjB,KAA6C,EAC7C,QAAiB,KAAK,EACtB,cAAsC;IAEtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;AAC/E,CAAC"}
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';
@@ -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,GAC1B,MAAM,eAAe,CAAC;AAEvB,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"}
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,GAOhB,MAAM,eAAe,CAAC;AAIvB,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"}
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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"}