@haverstack/server 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +2 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/lib/canonicalJson.d.ts +7 -0
  5. package/dist/lib/canonicalJson.d.ts.map +1 -0
  6. package/dist/lib/canonicalJson.js +18 -0
  7. package/dist/lib/canonicalJson.js.map +1 -0
  8. package/dist/lib/historyPage.d.ts +12 -0
  9. package/dist/lib/historyPage.d.ts.map +1 -0
  10. package/dist/lib/historyPage.js +24 -0
  11. package/dist/lib/historyPage.js.map +1 -0
  12. package/dist/lib/ifMatch.d.ts +11 -0
  13. package/dist/lib/ifMatch.d.ts.map +1 -0
  14. package/dist/lib/ifMatch.js +11 -0
  15. package/dist/lib/ifMatch.js.map +1 -0
  16. package/dist/lib/installRequestStore.d.ts +46 -0
  17. package/dist/lib/installRequestStore.d.ts.map +1 -0
  18. package/dist/lib/installRequestStore.js +102 -0
  19. package/dist/lib/installRequestStore.js.map +1 -0
  20. package/dist/lib/queryWorker/protocol.d.ts +1 -1
  21. package/dist/lib/queryWorker/worker.js +1 -1
  22. package/dist/lib/queryWorker/worker.js.map +1 -1
  23. package/dist/lib/resumeBuffer.d.ts +0 -1
  24. package/dist/lib/resumeBuffer.d.ts.map +1 -1
  25. package/dist/lib/resumeBuffer.js +2 -1
  26. package/dist/lib/resumeBuffer.js.map +1 -1
  27. package/dist/lib/selfService.d.ts +2 -0
  28. package/dist/lib/selfService.d.ts.map +1 -0
  29. package/dist/lib/selfService.js +6 -0
  30. package/dist/lib/selfService.js.map +1 -0
  31. package/dist/middleware/auth.d.ts +10 -9
  32. package/dist/middleware/auth.d.ts.map +1 -1
  33. package/dist/middleware/auth.js +21 -10
  34. package/dist/middleware/auth.js.map +1 -1
  35. package/dist/middleware/errors.js +1 -1
  36. package/dist/middleware/errors.js.map +1 -1
  37. package/dist/middleware/params.d.ts +3 -5
  38. package/dist/middleware/params.d.ts.map +1 -1
  39. package/dist/middleware/params.js +3 -12
  40. package/dist/middleware/params.js.map +1 -1
  41. package/dist/routes/attachments.d.ts.map +1 -1
  42. package/dist/routes/attachments.js +5 -5
  43. package/dist/routes/attachments.js.map +1 -1
  44. package/dist/routes/auth.d.ts.map +1 -1
  45. package/dist/routes/auth.js +9 -20
  46. package/dist/routes/auth.js.map +1 -1
  47. package/dist/routes/changes.d.ts.map +1 -1
  48. package/dist/routes/changes.js +6 -7
  49. package/dist/routes/changes.js.map +1 -1
  50. package/dist/routes/entity.d.ts.map +1 -1
  51. package/dist/routes/entity.js +9 -11
  52. package/dist/routes/entity.js.map +1 -1
  53. package/dist/routes/installs.d.ts +13 -0
  54. package/dist/routes/installs.d.ts.map +1 -0
  55. package/dist/routes/installs.js +101 -0
  56. package/dist/routes/installs.js.map +1 -0
  57. package/dist/routes/records.d.ts.map +1 -1
  58. package/dist/routes/records.js +105 -165
  59. package/dist/routes/records.js.map +1 -1
  60. package/dist/routes/types.d.ts.map +1 -1
  61. package/dist/routes/types.js +7 -39
  62. package/dist/routes/types.js.map +1 -1
  63. package/dist/routes/wellknown.d.ts.map +1 -1
  64. package/dist/routes/wellknown.js +2 -0
  65. package/dist/routes/wellknown.js.map +1 -1
  66. package/dist/shutdown.d.ts.map +1 -1
  67. package/dist/shutdown.js +1 -0
  68. package/dist/shutdown.js.map +1 -1
  69. package/dist/stack.d.ts +2 -0
  70. package/dist/stack.d.ts.map +1 -1
  71. package/dist/stack.js +28 -6
  72. package/dist/stack.js.map +1 -1
  73. package/dist/testing.d.ts.map +1 -1
  74. package/dist/testing.js +13 -2
  75. package/dist/testing.js.map +1 -1
  76. package/package.json +6 -6
  77. package/dist/lib/queryLimit.d.ts +0 -6
  78. package/dist/lib/queryLimit.d.ts.map +0 -1
  79. package/dist/lib/queryLimit.js +0 -20
  80. package/dist/lib/queryLimit.js.map +0 -1
@@ -1,11 +1,12 @@
1
1
  import { Hono } from 'hono';
2
- import { knownParams, booleanParam } from '../middleware/params.js';
3
- import { requireAuth, requireOwner } from '../middleware/auth.js';
2
+ import { knownParams } from '../middleware/params.js';
3
+ import { requireAuth } from '../middleware/auth.js';
4
4
  import { readJson } from '../lib/json.js';
5
- import { parseQueryBody, parseQueryParams, parseJournalParams, parsePositiveInt, parseIfMatch, createOptionsFromWireRecord, changesFromWireBody, } from '@haverstack/core/wire';
6
- import { clampLimit, clampJournalLimit } from '../lib/queryLimit.js';
5
+ import { parseQueryBody, parseQueryParams, parseGetRecordParams, parseDeleteParams, parseJournalParams, parseVersionsParams, parseAssociationParams, parseUnsignedInt, createOptionsFromWireRecord, parseContentPatchBody, parseParentBody, parseUnlistedBody, parseAssociationEditsBody, parseAssociationsBody, parsePermissionsBody, parseMigrationBody, } from '@haverstack/core/wire';
6
+ import { readHistoryPage } from '../lib/historyPage.js';
7
+ import { ifMatchVersion } from '../lib/ifMatch.js';
7
8
  import { serializeRecord, serializeVersion, serializeJournalEntry } from '@haverstack/wire-types';
8
- import { StackValidationError, StackBadRequestError, StackNotFoundError } from '@haverstack/core';
9
+ import { StackNotFoundError } from '@haverstack/core';
9
10
  // ---------------------------------------------------------------------------
10
11
  // Route factory
11
12
  // ---------------------------------------------------------------------------
@@ -30,7 +31,7 @@ export function recordRoutes(ctx, queryTimeoutMs) {
30
31
  // the literal "query" segment.
31
32
  app.post('/query', knownParams(), async (c) => {
32
33
  const auth = c.get('auth');
33
- const query = clampLimit(parseQueryBody(await readJson(c)));
34
+ const query = parseQueryBody(await readJson(c));
34
35
  const result = await queryWorker.query(auth, query, queryTimeoutMs);
35
36
  const body = {
36
37
  records: result.records.map(serializeRecord),
@@ -41,7 +42,7 @@ export function recordRoutes(ctx, queryTimeoutMs) {
41
42
  // GET /records — query by native fields via URL params
42
43
  app.get('/', async (c) => {
43
44
  const auth = c.get('auth');
44
- const query = clampLimit(parseQueryParams(new URL(c.req.url)));
45
+ const query = parseQueryParams(new URL(c.req.url));
45
46
  const result = await queryWorker.query(auth, query, queryTimeoutMs);
46
47
  const body = {
47
48
  records: result.records.map(serializeRecord),
@@ -63,226 +64,165 @@ export function recordRoutes(ctx, queryTimeoutMs) {
63
64
  const created = await stack.asActor(auth).create(typeId, content, options);
64
65
  return c.json(serializeRecord(created), 200);
65
66
  });
66
- // GET /records/:id
67
- app.get('/:id', knownParams(), async (c) => {
68
- const id = c.req.param('id');
69
- const auth = c.get('auth');
70
- const record = await scopeFor(auth).get(id);
67
+ // GET /records/:id — a tombstone answers 404 unless ?includeDeleted=true,
68
+ // as on GET /records. See docs/spec/wire-format.md § Records.
69
+ app.get('/:id', async (c) => {
70
+ const opts = parseGetRecordParams(new URL(c.req.url));
71
+ const record = await scopeFor(c.get('auth')).get(c.req.param('id'), opts);
71
72
  if (!record)
72
73
  throw new StackNotFoundError('Record not found');
73
74
  return c.json(serializeRecord(record));
74
75
  });
75
- // PATCH /records/:id — the body is a change set: an envelope naming any
76
- // combination of `contentPatch`, `parentId`, `permissions`, `associations`
77
- // and `unlisted`, applied as one atomic write that produces exactly one
78
- // version. A conforming client sends { "contentPatch": { "title": "New" } },
79
- // never the bare patch — content is one aspect among five here, so the
80
- // envelope is what tells a `parentId` naming a container from a content
81
- // field of that name. One If-Match fences the whole multi-aspect edit.
82
- //
83
- // `changesFromWireBody()` owns the entire read of that envelope: which
84
- // keys it may carry, the 400 an unrecognized or wholly absent key earns,
85
- // and the 422 a malformed value earns. Content keys stay Stack's to judge,
86
- // so nothing here inspects the patch. See docs/spec/wire-format.md § Records.
87
- //
88
- // No route-level guard belongs here: ScopedStack owns the _attachment@1
89
- // immutable-field and _grant@1 owner-only rules (docs/spec/attachments.md,
90
- // docs/spec/access-control.md) and resolves each change-set key against its
91
- // own gate, so a denial round-trips as the core error it is rather than a
92
- // guess made before the permission check ran.
93
- app.patch('/:id', knownParams(), requireAuth(), async (c) => {
94
- const id = c.req.param('id');
95
- const auth = c.get('auth');
96
- const changes = changesFromWireBody(await readJson(c));
76
+ // Every aspect of a record has one write endpoint, and each endpoint
77
+ // reads If-Match and answers with the record it produced. Which gate a
78
+ // write passes — write, reshare, the _attachment@1 immutable fields, the
79
+ // _grant@1 owner-only rule — is ScopedStack's to resolve, so a denial
80
+ // round-trips as the core error it is rather than a guess made here.
81
+ // See docs/spec/wire-format.md § Records and § Optimistic concurrency.
82
+ app.patch('/:id/content', knownParams(), requireAuth(), async (c) => {
83
+ const patch = parseContentPatchBody(await readJson(c));
84
+ const updated = await stack
85
+ .asActor(c.get('auth'))
86
+ .patchContent(c.req.param('id'), patch, ifMatchVersion(c));
87
+ return c.json(serializeRecord(updated));
88
+ });
89
+ app.put('/:id/parent', knownParams(), requireAuth(), async (c) => {
90
+ const { parentId } = parseParentBody(await readJson(c));
91
+ const updated = await stack
92
+ .asActor(c.get('auth'))
93
+ .setParent(c.req.param('id'), parentId, ifMatchVersion(c));
94
+ return c.json(serializeRecord(updated));
95
+ });
96
+ app.put('/:id/unlisted', knownParams(), requireAuth(), async (c) => {
97
+ const { unlisted } = parseUnlistedBody(await readJson(c));
97
98
  const updated = await stack
98
- .asActor(auth)
99
- .mutate(id, changes, { ifVersion: parseIfMatch(c.req.header('If-Match')) });
99
+ .asActor(c.get('auth'))
100
+ .setUnlisted(c.req.param('id'), unlisted, ifMatchVersion(c));
100
101
  return c.json(serializeRecord(updated));
101
102
  });
102
103
  // DELETE /records/:id (?purge=true for permanent). Both answer 200 with
103
- // a record: a soft delete with the tombstone it produced, a purge
104
- // with the record as it stood immediately before destruction. That body
105
- // is the requester's only report of the files the purge stranded; every
106
- // other row naming them is gone by the time it lands. deleteAndReturn()
107
- // captures it inside the same write that destroys or tombstones the
108
- // record, so there is no read-then-delete window for a concurrent write
109
- // to fall into. See docs/spec/wire-format.md § Records and
110
- // docs/spec/attachments.md § A purge strands the bytes it referenced.
111
- app.delete('/:id', knownParams('purge'), requireAuth(), async (c) => {
112
- const id = c.req.param('id');
113
- const auth = c.get('auth');
114
- const purge = booleanParam(new URL(c.req.url), 'purge');
115
- const session = stack.asActor(auth);
116
- const { record } = await session.deleteAndReturn(id, {
117
- purge,
118
- ifVersion: parseIfMatch(c.req.header('If-Match')),
119
- });
104
+ // a record: a soft delete with the tombstone it produced, a purge with
105
+ // the record as it stood immediately before destruction. That body is
106
+ // the requester's only report of the files the purge stranded, and
107
+ // delete() captures it inside the same write that destroys the record.
108
+ // See docs/spec/attachments.md § A purge strands the bytes it referenced.
109
+ app.delete('/:id', requireAuth(), async (c) => {
110
+ const { purge } = parseDeleteParams(new URL(c.req.url));
111
+ const { record } = await stack
112
+ .asActor(c.get('auth'))
113
+ .delete(c.req.param('id'), { purge, ...ifMatchVersion(c) });
120
114
  if (!record)
121
115
  throw new StackNotFoundError('Record not found');
122
116
  return c.json(serializeRecord(record));
123
117
  });
124
118
  // POST /records/:id/undelete — reverses a soft delete; idempotent
125
119
  app.post('/:id/undelete', knownParams(), requireAuth(), async (c) => {
126
- const id = c.req.param('id');
127
- const auth = c.get('auth');
128
120
  const restored = await stack
129
- .asActor(auth)
130
- .undelete(id, { ifVersion: parseIfMatch(c.req.header('If-Match')) });
121
+ .asActor(c.get('auth'))
122
+ .undelete(c.req.param('id'), ifMatchVersion(c));
131
123
  return c.json(serializeRecord(restored));
132
124
  });
133
125
  // ------------------------------------------------------------------
134
- // Permissions
126
+ // Permissions and associations
135
127
  // ------------------------------------------------------------------
128
+ // Two surfaces, one shape: a POST edits the set with a list of adds and
129
+ // removes applied as one write, and a PUT replaces it. An element sent to
130
+ // the wrong surface is ScopedStack's 400, so nothing here inspects one.
131
+ // See docs/spec/wire-format.md § Permissions and § Associations.
136
132
  app.get('/:id/permissions', knownParams(), async (c) => {
137
- const id = c.req.param('id');
138
- const auth = c.get('auth');
139
- const record = await scopeFor(auth).get(id);
133
+ const record = await scopeFor(c.get('auth')).get(c.req.param('id'));
140
134
  if (!record)
141
135
  throw new StackNotFoundError('Record not found');
142
136
  return c.json({ permissions: record.permissions ?? [] });
143
137
  });
144
- // The amending spelling, where the change set's `permissions` key
145
- // replaces the whole set — which is what survives two admins sharing one
146
- // record at once. Both carry the reshare gate rather than the write bit,
147
- // and both are ScopedStack's to apply: it refuses a data kind sent to
148
- // this surface and holds the set to `write` implying `read`, so nothing
149
- // here inspects the body. See docs/spec/access-control.md
150
- // § Record-level permissions.
151
138
  app.post('/:id/permissions', knownParams(), requireAuth(), async (c) => {
152
- const id = c.req.param('id');
153
- const auth = c.get('auth');
154
- const body = await readJson(c);
155
- const updated = await stack.asActor(auth).grantAccess(id, body);
139
+ const edits = parseAssociationEditsBody(await readJson(c));
140
+ const updated = await stack
141
+ .asActor(c.get('auth'))
142
+ .editAccess(c.req.param('id'), edits, ifMatchVersion(c));
156
143
  return c.json(serializeRecord(updated));
157
144
  });
158
- // POST to a /delete sub-path for the reason the association endpoints
159
- // use one, below.
160
- app.post('/:id/permissions/delete', knownParams(), requireAuth(), async (c) => {
161
- const id = c.req.param('id');
162
- const auth = c.get('auth');
163
- const body = await readJson(c);
164
- const updated = await stack.asActor(auth).revokeAccess(id, body);
145
+ app.put('/:id/permissions', knownParams(), requireAuth(), async (c) => {
146
+ const permissions = parsePermissionsBody(await readJson(c));
147
+ const updated = await stack
148
+ .asActor(c.get('auth'))
149
+ .setAccess(c.req.param('id'), permissions, ifMatchVersion(c));
165
150
  return c.json(serializeRecord(updated));
166
151
  });
167
- // ------------------------------------------------------------------
168
- // Associations
169
- // ------------------------------------------------------------------
170
- app.get('/:id/associations', knownParams('kind', 'label'), async (c) => {
171
- const id = c.req.param('id');
172
- const auth = c.get('auth');
173
- const record = await scopeFor(auth).get(id);
152
+ app.get('/:id/associations', async (c) => {
153
+ const { kind, label } = parseAssociationParams(new URL(c.req.url));
154
+ const record = await scopeFor(c.get('auth')).get(c.req.param('id'));
174
155
  if (!record)
175
156
  throw new StackNotFoundError('Record not found');
176
- let assocs = record.associations ?? [];
177
- const kind = c.req.query('kind');
178
- if (kind)
179
- assocs = assocs.filter((a) => a.kind === kind);
180
- const label = c.req.query('label');
181
- if (label)
182
- assocs = assocs.filter((a) => a.label === label);
183
- return c.json({ associations: assocs });
157
+ const associations = (record.associations ?? []).filter((a) => (kind === undefined || a.kind === kind) && (label === undefined || a.label === label));
158
+ return c.json({ associations });
184
159
  });
185
- // Neither mutating endpoint reads If-Match, and one sent to either is
186
- // ignored rather than refused: a set add/remove composes whatever the
187
- // write order, so there is no race for a precondition to fence. Both
188
- // answer with a record carrying whatever version it already had. See
189
- // docs/spec/wire-format.md § Associations.
190
160
  app.post('/:id/associations', knownParams(), requireAuth(), async (c) => {
191
- const id = c.req.param('id');
192
- const auth = c.get('auth');
193
- const body = await readJson(c);
194
- if (!body.kind || !body.label)
195
- throw new StackBadRequestError('kind and label are required');
196
- const updated = await stack.asActor(auth).associate(id, body);
161
+ const edits = parseAssociationEditsBody(await readJson(c));
162
+ const updated = await stack
163
+ .asActor(c.get('auth'))
164
+ .editAssociations(c.req.param('id'), edits, ifMatchVersion(c));
197
165
  return c.json(serializeRecord(updated));
198
166
  });
199
- // POST, not DELETE — a DELETE request body has no defined semantics
200
- // (RFC 9110 §9.3.5) and is a portability landmine for proxies/gateways
201
- // that drop or reject it.
202
- app.post('/:id/associations/delete', knownParams(), requireAuth(), async (c) => {
203
- const id = c.req.param('id');
204
- const auth = c.get('auth');
205
- const body = await readJson(c);
206
- const updated = await stack.asActor(auth).dissociate(id, body);
167
+ app.put('/:id/associations', knownParams(), requireAuth(), async (c) => {
168
+ const associations = parseAssociationsBody(await readJson(c));
169
+ const updated = await stack
170
+ .asActor(c.get('auth'))
171
+ .setAssociations(c.req.param('id'), associations, ifMatchVersion(c));
207
172
  return c.json(serializeRecord(updated));
208
173
  });
209
174
  // ------------------------------------------------------------------
210
175
  // Journal
211
176
  // ------------------------------------------------------------------
212
- // GET /records/:id/journal — the change journal, oldest first. Not
213
- // optional and never answered empty for a record this server doesn't
214
- // hold: an empty log means "nothing changed" unconditionally, so a
215
- // missing or purged record is the 404 ScopedStack raises.
216
- //
217
- // The mutate-surface gate and the authority-element projection a
218
- // non-resharer gets are both ScopedStack.getJournal()'s, so this route
219
- // decodes the window, bounds the page and serializes. `cursor` is the
220
- // only end-of-log signal — a page filled to the ceiling carries the seq
221
- // to resume from, whether or not the log ends there. See
222
- // docs/spec/journal.md and docs/spec/wire-format.md § Journal.
177
+ // GET /records/:id/journal — the change journal, oldest first. Never
178
+ // answered empty for a record this server doesn't hold: an empty log
179
+ // means "nothing changed" unconditionally, so a missing or purged record
180
+ // is the 404 ScopedStack raises. The mutate-surface gate and the
181
+ // authority-element projection are both ScopedStack.getJournal()'s.
182
+ // See docs/spec/journal.md and docs/spec/wire-format.md § Journal.
223
183
  app.get('/:id/journal', async (c) => {
224
184
  const id = c.req.param('id');
225
- const auth = c.get('auth');
226
185
  const query = parseJournalParams(new URL(c.req.url));
227
- const limit = clampJournalLimit(query.limit);
228
- const entries = await scopeFor(auth).getJournal(id, { ...query, limit });
229
- const body = {
230
- entries: entries.map(serializeJournalEntry),
231
- cursor: entries.length > 0 && entries.length === limit ? entries[entries.length - 1].seq : null,
232
- };
186
+ const scoped = scopeFor(c.get('auth'));
187
+ const { rows, cursor } = await readHistoryPage(query.limit, (limit) => scoped.getJournal(id, { ...query, limit }), (entry) => entry.seq);
188
+ const body = { entries: rows.map(serializeJournalEntry), cursor };
233
189
  return c.json(body);
234
190
  });
235
191
  // ------------------------------------------------------------------
236
192
  // Versions
237
193
  // ------------------------------------------------------------------
238
- app.get('/:id/versions', knownParams(), async (c) => {
194
+ // Newest first, paged like the journal. See docs/spec/wire-format.md § Versions.
195
+ app.get('/:id/versions', async (c) => {
239
196
  const id = c.req.param('id');
240
- const auth = c.get('auth');
241
- const versions = await scopeFor(auth).getVersions(id);
242
- return c.json(versions.map(serializeVersion));
197
+ const query = parseVersionsParams(new URL(c.req.url));
198
+ const scoped = scopeFor(c.get('auth'));
199
+ const { rows, cursor } = await readHistoryPage(query.limit, (limit) => scoped.getVersions(id, { ...query, limit }), (version) => version.version);
200
+ const body = { versions: rows.map(serializeVersion), cursor };
201
+ return c.json(body);
243
202
  });
244
203
  app.get('/:id/versions/:version', knownParams(), async (c) => {
245
- const id = c.req.param('id');
246
- const vNum = parsePositiveInt(c.req.param('version'), 'version number');
247
- const auth = c.get('auth');
248
- const version = await scopeFor(auth).getVersion(id, vNum);
204
+ const version = await scopeFor(c.get('auth')).getVersion(c.req.param('id'), parseUnsignedInt(c.req.param('version'), 'version number'));
249
205
  if (!version)
250
206
  throw new StackNotFoundError('Version not found');
251
207
  return c.json(serializeVersion(version));
252
208
  });
253
209
  // POST /records/:id/restore/:version — creates new version, does not rewrite history
254
210
  app.post('/:id/restore/:version', knownParams(), requireAuth(), async (c) => {
255
- const id = c.req.param('id');
256
- const vNum = parsePositiveInt(c.req.param('version'), 'version number');
257
- const auth = c.get('auth');
258
211
  const restored = await stack
259
- .asActor(auth)
260
- .restoreVersion(id, vNum, { ifVersion: parseIfMatch(c.req.header('If-Match')) });
212
+ .asActor(c.get('auth'))
213
+ .restoreVersion(c.req.param('id'), parseUnsignedInt(c.req.param('version'), 'version number'), ifMatchVersion(c));
261
214
  return c.json(serializeRecord(restored));
262
215
  });
263
216
  // POST /records/:id/migrate — the only way typeId changes after creation.
264
- // The body carries the full post-migration content, computed client-side
265
- // by the type's owning app and validated against toTypeId's schema by
266
- // ScopedStack.commitMigration(). Owner acting alone only: replacing
267
- // content and typeId wholesale would have to re-derive every gate
268
- // create() and update() apply at both ends.
269
- app.post('/:id/migrate', knownParams(), requireOwner(ownerEntityId), async (c) => {
270
- const id = c.req.param('id');
271
- const auth = c.get('auth');
272
- const body = await readJson(c, ['toTypeId', 'content']);
273
- if (!body.toTypeId || typeof body.toTypeId !== 'string')
274
- throw new StackBadRequestError('toTypeId is required');
275
- if (!body.content || typeof body.content !== 'object')
276
- throw new StackBadRequestError('content is required');
277
- if (!(await stack.getType(body.toTypeId)))
278
- throw new StackValidationError([
279
- { path: 'toTypeId', message: `Unknown type: "${body.toTypeId}"` },
280
- ]);
217
+ // The body carries the full post-migration content, computed by the
218
+ // type's owning app. Who may commit one — the owner, or an installed app
219
+ // within the families its install claims — is ScopedStack's to decide.
220
+ // See docs/spec/wire-format.md § Migration commit.
221
+ app.post('/:id/migrate', knownParams(), requireAuth(), async (c) => {
222
+ const { toTypeId, content } = parseMigrationBody(await readJson(c));
281
223
  const migrated = await stack
282
- .asActor(auth)
283
- .commitMigration(id, body.toTypeId, body.content, {
284
- ifVersion: parseIfMatch(c.req.header('If-Match')),
285
- });
224
+ .asActor(c.get('auth'))
225
+ .commitMigration(c.req.param('id'), toTypeId, content, ifMatchVersion(c));
286
226
  return c.json(serializeRecord(migrated));
287
227
  });
288
228
  return app;
@@ -1 +1 @@
1
- {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/routes/records.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/routes/records.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routes/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAYhD,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CA4D1D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routes/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CA0B1D"}
@@ -3,7 +3,8 @@ import { knownParams } from '../middleware/params.js';
3
3
  import { requireOwner } from '../middleware/auth.js';
4
4
  import { readJson } from '../lib/json.js';
5
5
  import { serializeType } from '@haverstack/wire-types';
6
- import { hashSchema, StackBadRequestError, StackNotFoundError, StackValidationError, } from '@haverstack/core';
6
+ import { parseTypeBody } from '@haverstack/core/wire';
7
+ import { StackNotFoundError } from '@haverstack/core';
7
8
  export function typeRoutes(ctx) {
8
9
  const app = new Hono();
9
10
  const { adapter, stack } = ctx;
@@ -18,45 +19,12 @@ export function typeRoutes(ctx) {
18
19
  throw new StackNotFoundError('Type not found');
19
20
  return c.json(serializeType(type));
20
21
  });
22
+ // Served through the unscoped Stack: ScopedStack has no defineType(), and
23
+ // no grant confers defining a stack-wide Type. stack.defineType() rather
24
+ // than adapter.saveType() is what runs the schema-drift check.
25
+ // See docs/spec/wire-format.md § Types.
21
26
  app.post('/', knownParams(), requireOwner(stack.ownerEntityId), async (c) => {
22
- // The full StackType a client holds is accepted as-is: baseId, version
23
- // and createdAt are derived or stamped here, like a record's stamped
24
- // fields, so sending them back is not a mistake.
25
- const body = await readJson(c, [
26
- 'id',
27
- 'baseId',
28
- 'version',
29
- 'name',
30
- 'schema',
31
- 'schemaHash',
32
- 'migratesFrom',
33
- 'createdAt',
34
- ]);
35
- if (!body.id || typeof body.id !== 'string')
36
- throw new StackBadRequestError('id is required');
37
- if (!body.name || typeof body.name !== 'string')
38
- throw new StackBadRequestError('name is required');
39
- if (!body.schema || typeof body.schema !== 'object')
40
- throw new StackBadRequestError('schema is required');
41
- if (!body.schemaHash || typeof body.schemaHash !== 'string')
42
- throw new StackBadRequestError('schemaHash is required');
43
- if (body.migratesFrom !== undefined && typeof body.migratesFrom !== 'string')
44
- throw new StackValidationError([{ path: 'migratesFrom', message: 'Must be a string' }]);
45
- const computedHash = await hashSchema(body.schema);
46
- if (body.schemaHash !== computedHash)
47
- throw new StackValidationError([
48
- { path: 'schemaHash', message: 'schemaHash does not match schema' },
49
- ]);
50
- // stack.defineType() (not adapter.saveType() directly) is what runs the
51
- // schema-drift check: redefining an existing typeId with anything
52
- // beyond additive evolution throws StackSchemaDriftError, which
53
- // adapter.saveType() alone has no way to enforce — it's a raw write.
54
- const type = await stack.defineType({
55
- id: body.id,
56
- name: body.name,
57
- schema: body.schema,
58
- ...(body.migratesFrom !== undefined && { migratesFrom: body.migratesFrom }),
59
- });
27
+ const type = await stack.defineType(parseTypeBody(await readJson(c)));
60
28
  return c.json(serializeType(type), 201);
61
29
  });
62
30
  return app;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/routes/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/routes/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,UAAU,CAAC,GAAiB;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAC;IAC/B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAE/B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QAC1D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,yEAAyE;IACzE,+DAA+D;IAC/D,wCAAwC;IACxC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wellknown.d.ts","sourceRoot":"","sources":["../../src/routes/wellknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CA2C/E"}
1
+ {"version":3,"file":"wellknown.d.ts","sourceRoot":"","sources":["../../src/routes/wellknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CA6C/E"}
@@ -38,6 +38,8 @@ export function wellknownRoutes(ctx, config) {
38
38
  resume: true,
39
39
  records: true,
40
40
  },
41
+ // POST /installs is always served, so, like `changes`, always advertised.
42
+ installs: { requests: true },
41
43
  };
42
44
  return c.json(body);
43
45
  });
@@ -1 +1 @@
1
- {"version":3,"file":"wellknown.js","sourceRoot":"","sources":["../../src/routes/wellknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,MAAM,UAAU,eAAe,CAAC,GAAiB,EAAE,MAAc;IAC/D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAC;IAE/B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,IAAI,GAAsB;YAC9B,OAAO,EAAE,qBAAqB;YAC9B,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa;YACjC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;YAC5B,iEAAiE;YACjE,iEAAiE;YACjE,sDAAsD;YACtD,wCAAwC;YACxC,YAAY,EAAE;gBACZ,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY;gBACzB,MAAM,EAAE;oBACN,eAAe,EAAE,MAAM,CAAC,kBAAkB;oBAC1C,YAAY,EAAE,MAAM,CAAC,eAAe;iBACrC;aACF;YACD,qEAAqE;YACrE,6DAA6D;YAC7D,mEAAmE;YACnE,2DAA2D;YAC3D,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,yBAAyB,CAAC,EAAE;YAC9C,kEAAkE;YAClE,uEAAuE;YACvE,kEAAkE;YAClE,mEAAmE;YACnE,EAAE;YACF,qEAAqE;YACrE,qEAAqE;YACrE,mEAAmE;YACnE,iCAAiC;YACjC,OAAO,EAAE;gBACP,UAAU,EAAE,CAAC,oBAAoB,CAAC;gBAClC,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,IAAI;aACd;SACF,CAAC;QACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"wellknown.js","sourceRoot":"","sources":["../../src/routes/wellknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,MAAM,UAAU,eAAe,CAAC,GAAiB,EAAE,MAAc;IAC/D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAC;IAE/B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,IAAI,GAAsB;YAC9B,OAAO,EAAE,qBAAqB;YAC9B,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa;YACjC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;YAC5B,iEAAiE;YACjE,iEAAiE;YACjE,sDAAsD;YACtD,wCAAwC;YACxC,YAAY,EAAE;gBACZ,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY;gBACzB,MAAM,EAAE;oBACN,eAAe,EAAE,MAAM,CAAC,kBAAkB;oBAC1C,YAAY,EAAE,MAAM,CAAC,eAAe;iBACrC;aACF;YACD,qEAAqE;YACrE,6DAA6D;YAC7D,mEAAmE;YACnE,2DAA2D;YAC3D,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,yBAAyB,CAAC,EAAE;YAC9C,kEAAkE;YAClE,uEAAuE;YACvE,kEAAkE;YAClE,mEAAmE;YACnE,EAAE;YACF,qEAAqE;YACrE,qEAAqE;YACrE,mEAAmE;YACnE,iCAAiC;YACjC,OAAO,EAAE;gBACP,UAAU,EAAE,CAAC,oBAAoB,CAAC;gBAClC,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,IAAI;aACd;YACD,0EAA0E;YAC1E,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC7B,CAAC;QACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAClC,mBAAmB,CAAC,IAAI,IAAI,CAAC;CAC9B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CA2BnC"}
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAClC,mBAAmB,CAAC,IAAI,IAAI,CAAC;CAC9B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CA4BnC"}
package/dist/shutdown.js CHANGED
@@ -26,6 +26,7 @@ export function createShutdownHandler(server, ctx, logger, timeoutMs) {
26
26
  await ctx.stack.close();
27
27
  await ctx.tokens.close();
28
28
  ctx.nonces.close();
29
+ ctx.installRequests.close();
29
30
  logger.info('Clean shutdown complete');
30
31
  };
31
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAsB,EACtB,GAAiB,EACjB,MAAc,EACd,SAAiB;IAEjB,OAAO,KAAK,EAAE,MAAc,EAAE,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;QAEzC,wEAAwE;QACxE,uDAAuD;QACvD,4BAA4B;QAC5B,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAE7B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,4DAA4D,CAAC,CAAC;gBACzF,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACjC,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAsB,EACtB,GAAiB,EACjB,MAAc,EACd,SAAiB;IAEjB,OAAO,KAAK,EAAE,MAAc,EAAE,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;QAEzC,wEAAwE;QACxE,uDAAuD;QACvD,4BAA4B;QAC5B,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAE7B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,4DAA4D,CAAC,CAAC;gBACzF,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACjC,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC"}
package/dist/stack.d.ts CHANGED
@@ -4,6 +4,7 @@ import type { StackTokenStore } from '@haverstack/core/wire';
4
4
  import type { Logger } from 'pino';
5
5
  import type { Config } from './config.js';
6
6
  import { AuthNonceStore } from './lib/nonceStore.js';
7
+ import { InstallRequestStore } from './lib/installRequestStore.js';
7
8
  import { QueryWorkerPool } from './lib/queryWorker/pool.js';
8
9
  import { ChangeStreamRegistry } from './lib/changeStreams.js';
9
10
  export type StackContext = {
@@ -13,6 +14,7 @@ export type StackContext = {
13
14
  close(): Promise<void>;
14
15
  };
15
16
  nonces: AuthNonceStore;
17
+ installRequests: InstallRequestStore;
16
18
  queryWorker: QueryWorkerPool;
17
19
  changeStreams: ChangeStreamRegistry;
18
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA2C,MAAM,2BAA2B,CAAC;AAYlG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;IAIb,MAAM,EAAE,eAAe,GAAG;QAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAGrD,MAAM,EAAE,cAAc,CAAC;IAIvB,WAAW,EAAE,eAAe,CAAC;IAG7B,aAAa,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAEF,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAwDrF"}
1
+ {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA2C,MAAM,2BAA2B,CAAC;AAclG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAkC,MAAM,8BAA8B,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;IAIb,MAAM,EAAE,eAAe,GAAG;QAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAGrD,MAAM,EAAE,cAAc,CAAC;IAGvB,eAAe,EAAE,mBAAmB,CAAC;IAIrC,WAAW,EAAE,eAAe,CAAC;IAG7B,aAAa,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAEF,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA6ErF"}