@haverstack/server 0.10.3 → 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 (101) 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/json.d.ts +7 -1
  21. package/dist/lib/json.d.ts.map +1 -1
  22. package/dist/lib/json.js +18 -4
  23. package/dist/lib/json.js.map +1 -1
  24. package/dist/lib/queryWorker/pool.d.ts +2 -1
  25. package/dist/lib/queryWorker/pool.d.ts.map +1 -1
  26. package/dist/lib/queryWorker/pool.js.map +1 -1
  27. package/dist/lib/queryWorker/protocol.d.ts +3 -2
  28. package/dist/lib/queryWorker/protocol.d.ts.map +1 -1
  29. package/dist/lib/queryWorker/worker.js +3 -3
  30. package/dist/lib/queryWorker/worker.js.map +1 -1
  31. package/dist/lib/resumeBuffer.d.ts +4 -4
  32. package/dist/lib/resumeBuffer.d.ts.map +1 -1
  33. package/dist/lib/resumeBuffer.js +23 -9
  34. package/dist/lib/resumeBuffer.js.map +1 -1
  35. package/dist/lib/resumeCursor.d.ts +1 -1
  36. package/dist/lib/resumeCursor.d.ts.map +1 -1
  37. package/dist/lib/resumeCursor.js +3 -3
  38. package/dist/lib/resumeCursor.js.map +1 -1
  39. package/dist/lib/selfService.d.ts +2 -0
  40. package/dist/lib/selfService.d.ts.map +1 -0
  41. package/dist/lib/selfService.js +6 -0
  42. package/dist/lib/selfService.js.map +1 -0
  43. package/dist/middleware/auth.d.ts +10 -9
  44. package/dist/middleware/auth.d.ts.map +1 -1
  45. package/dist/middleware/auth.js +21 -10
  46. package/dist/middleware/auth.js.map +1 -1
  47. package/dist/middleware/errors.js +1 -1
  48. package/dist/middleware/errors.js.map +1 -1
  49. package/dist/middleware/params.d.ts +10 -0
  50. package/dist/middleware/params.d.ts.map +1 -0
  51. package/dist/middleware/params.js +18 -0
  52. package/dist/middleware/params.js.map +1 -0
  53. package/dist/routes/attachments.d.ts.map +1 -1
  54. package/dist/routes/attachments.js +24 -14
  55. package/dist/routes/attachments.js.map +1 -1
  56. package/dist/routes/auth.d.ts.map +1 -1
  57. package/dist/routes/auth.js +13 -23
  58. package/dist/routes/auth.js.map +1 -1
  59. package/dist/routes/changes.d.ts +1 -1
  60. package/dist/routes/changes.d.ts.map +1 -1
  61. package/dist/routes/changes.js +17 -18
  62. package/dist/routes/changes.js.map +1 -1
  63. package/dist/routes/entity.d.ts.map +1 -1
  64. package/dist/routes/entity.js +12 -8
  65. package/dist/routes/entity.js.map +1 -1
  66. package/dist/routes/health.d.ts.map +1 -1
  67. package/dist/routes/health.js +2 -1
  68. package/dist/routes/health.js.map +1 -1
  69. package/dist/routes/installs.d.ts +13 -0
  70. package/dist/routes/installs.d.ts.map +1 -0
  71. package/dist/routes/installs.js +101 -0
  72. package/dist/routes/installs.js.map +1 -0
  73. package/dist/routes/records.d.ts.map +1 -1
  74. package/dist/routes/records.js +114 -173
  75. package/dist/routes/records.js.map +1 -1
  76. package/dist/routes/tokens.d.ts.map +1 -1
  77. package/dist/routes/tokens.js +22 -18
  78. package/dist/routes/tokens.js.map +1 -1
  79. package/dist/routes/types.d.ts.map +1 -1
  80. package/dist/routes/types.js +11 -25
  81. package/dist/routes/types.js.map +1 -1
  82. package/dist/routes/wellknown.d.ts.map +1 -1
  83. package/dist/routes/wellknown.js +6 -3
  84. package/dist/routes/wellknown.js.map +1 -1
  85. package/dist/shutdown.d.ts.map +1 -1
  86. package/dist/shutdown.js +1 -0
  87. package/dist/shutdown.js.map +1 -1
  88. package/dist/stack.d.ts +2 -0
  89. package/dist/stack.d.ts.map +1 -1
  90. package/dist/stack.js +30 -8
  91. package/dist/stack.js.map +1 -1
  92. package/dist/testing.d.ts.map +1 -1
  93. package/dist/testing.js +15 -4
  94. package/dist/testing.js.map +1 -1
  95. package/dist/types.d.ts +1 -1
  96. package/dist/types.d.ts.map +1 -1
  97. package/package.json +6 -6
  98. package/dist/lib/queryLimit.d.ts +0 -6
  99. package/dist/lib/queryLimit.d.ts.map +0 -1
  100. package/dist/lib/queryLimit.js +0 -20
  101. package/dist/lib/queryLimit.js.map +0 -1
@@ -1,10 +1,12 @@
1
1
  import { Hono } from 'hono';
2
- import { requireAuth, requireOwner } from '../middleware/auth.js';
2
+ import { knownParams } from '../middleware/params.js';
3
+ import { requireAuth } from '../middleware/auth.js';
3
4
  import { readJson } from '../lib/json.js';
4
- import { parseQueryBody, parseQueryParams, parseJournalParams, parsePositiveInt, parseIfMatch, createOptionsFromWireRecord, changesFromWireBody, } from '@haverstack/core/wire';
5
- 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';
6
8
  import { serializeRecord, serializeVersion, serializeJournalEntry } from '@haverstack/wire-types';
7
- import { StackValidationError, StackQueryError, StackNotFoundError } from '@haverstack/core';
9
+ import { StackNotFoundError } from '@haverstack/core';
8
10
  // ---------------------------------------------------------------------------
9
11
  // Route factory
10
12
  // ---------------------------------------------------------------------------
@@ -20,16 +22,16 @@ export function recordRoutes(ctx, queryTimeoutMs) {
20
22
  const ownerEntityId = stack.ownerEntityId;
21
23
  /** Scope to a session if authenticated, else the anonymous view. */
22
24
  function scopeFor(auth) {
23
- return auth ? stack.forSession(auth) : stack.asEntity(null);
25
+ return auth ? stack.asActor(auth) : stack.asEntity(null);
24
26
  }
25
27
  // POST /records/query — full query with content-field filters. Optional
26
28
  // auth, like GET /records: a superset of the same query surface, so an
27
29
  // anonymous caller gets the same public-record subset either way.
28
30
  // Registered ahead of the /:id patterns, which would otherwise capture
29
31
  // the literal "query" segment.
30
- app.post('/query', async (c) => {
32
+ app.post('/query', knownParams(), async (c) => {
31
33
  const auth = c.get('auth');
32
- const query = clampLimit(parseQueryBody(await readJson(c)));
34
+ const query = parseQueryBody(await readJson(c));
33
35
  const result = await queryWorker.query(auth, query, queryTimeoutMs);
34
36
  const body = {
35
37
  records: result.records.map(serializeRecord),
@@ -40,7 +42,7 @@ export function recordRoutes(ctx, queryTimeoutMs) {
40
42
  // GET /records — query by native fields via URL params
41
43
  app.get('/', async (c) => {
42
44
  const auth = c.get('auth');
43
- const query = clampLimit(parseQueryParams(new URL(c.req.url)));
45
+ const query = parseQueryParams(new URL(c.req.url));
44
46
  const result = await queryWorker.query(auth, query, queryTimeoutMs);
45
47
  const body = {
46
48
  records: result.records.map(serializeRecord),
@@ -48,240 +50,179 @@ export function recordRoutes(ctx, queryTimeoutMs) {
48
50
  };
49
51
  return c.json(body);
50
52
  });
51
- // POST /records — a full record body, but version, entityId and
52
- // principalId are stamped here and never trusted from it. Everything else
53
+ // POST /records — a full record body, but version, createdBy and
54
+ // updatedBy are stamped here and never trusted from it. Everything else
53
55
  // a wire record body can carry — which fields are forwarded as-is, which
54
56
  // are owner-acting-alone-only, and which reduce to a boolean rather than
55
57
  // their literal value — is `createOptionsFromWireRecord()`'s disposition
56
58
  // to make, not this route's: see `@haverstack/core/wire` and
57
59
  // docs/spec/wire-format.md § Records.
58
- app.post('/', requireAuth(), async (c) => {
60
+ app.post('/', knownParams(), requireAuth(), async (c) => {
59
61
  const auth = c.get('auth');
60
62
  const body = await readJson(c);
61
63
  const { typeId, content, options } = createOptionsFromWireRecord(body, auth, ownerEntityId);
62
- const created = await stack.forSession(auth).create(typeId, content, options);
64
+ const created = await stack.asActor(auth).create(typeId, content, options);
63
65
  return c.json(serializeRecord(created), 200);
64
66
  });
65
- // GET /records/:id
67
+ // GET /records/:id — a tombstone answers 404 unless ?includeDeleted=true,
68
+ // as on GET /records. See docs/spec/wire-format.md § Records.
66
69
  app.get('/:id', async (c) => {
67
- const id = c.req.param('id');
68
- const auth = c.get('auth');
69
- const record = await scopeFor(auth).get(id);
70
+ const opts = parseGetRecordParams(new URL(c.req.url));
71
+ const record = await scopeFor(c.get('auth')).get(c.req.param('id'), opts);
70
72
  if (!record)
71
73
  throw new StackNotFoundError('Record not found');
72
74
  return c.json(serializeRecord(record));
73
75
  });
74
- // PATCH /records/:id — the body is a change set: an envelope naming any
75
- // combination of `contentPatch`, `parentId`, `permissions`, `associations`
76
- // and `unlisted`, applied as one atomic write that produces exactly one
77
- // version. A conforming client sends { "contentPatch": { "title": "New" } },
78
- // never the bare patch — content is one aspect among five here, so the
79
- // envelope is what tells a `parentId` naming a container from a content
80
- // field of that name. One If-Match fences the whole multi-aspect edit.
81
- //
82
- // `changesFromWireBody()` owns the entire read of that envelope: which
83
- // keys it may carry, the 400 an unrecognized or wholly absent key earns,
84
- // and the 422 a malformed value earns. Content keys stay Stack's to judge,
85
- // so nothing here inspects the patch. See docs/spec/wire-format.md § Records.
86
- //
87
- // No route-level guard belongs here: ScopedStack owns the _attachment@1
88
- // immutable-field and _grant@1 owner-only rules (docs/spec/attachments.md,
89
- // docs/spec/access-control.md) and resolves each change-set key against its
90
- // own gate, so a denial round-trips as the core error it is rather than a
91
- // guess made before the permission check ran.
92
- app.patch('/:id', requireAuth(), async (c) => {
93
- const id = c.req.param('id');
94
- const auth = c.get('auth');
95
- 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));
96
98
  const updated = await stack
97
- .forSession(auth)
98
- .mutate(id, changes, { ifVersion: parseIfMatch(c.req.header('If-Match')) });
99
+ .asActor(c.get('auth'))
100
+ .setUnlisted(c.req.param('id'), unlisted, ifMatchVersion(c));
99
101
  return c.json(serializeRecord(updated));
100
102
  });
101
- // DELETE /records/:id (?hard=true for permanent). Both answer 200 with
102
- // a record: a soft delete with the tombstone it produced, a hard delete
103
- // with the record as it stood immediately before destruction. That body
104
- // is the requester's only report of the files the purge stranded; every
105
- // other row naming them is gone by the time it lands. deleteAndReturn()
106
- // captures it inside the same write that destroys or tombstones the
107
- // record, so there is no read-then-delete window for a concurrent write
108
- // to fall into. See docs/spec/wire-format.md § Records and
109
- // docs/spec/attachments.md § A purge strands the bytes it referenced.
103
+ // DELETE /records/:id (?purge=true for permanent). Both answer 200 with
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.
110
109
  app.delete('/:id', requireAuth(), async (c) => {
111
- const id = c.req.param('id');
112
- const auth = c.get('auth');
113
- const hard = new URL(c.req.url).searchParams.get('hard') === 'true';
114
- const session = stack.forSession(auth);
115
- const { record } = await session.deleteAndReturn(id, {
116
- hard,
117
- ifVersion: parseIfMatch(c.req.header('If-Match')),
118
- });
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) });
119
114
  if (!record)
120
115
  throw new StackNotFoundError('Record not found');
121
116
  return c.json(serializeRecord(record));
122
117
  });
123
118
  // POST /records/:id/undelete — reverses a soft delete; idempotent
124
- app.post('/:id/undelete', requireAuth(), async (c) => {
125
- const id = c.req.param('id');
126
- const auth = c.get('auth');
119
+ app.post('/:id/undelete', knownParams(), requireAuth(), async (c) => {
127
120
  const restored = await stack
128
- .forSession(auth)
129
- .undelete(id, { ifVersion: parseIfMatch(c.req.header('If-Match')) });
121
+ .asActor(c.get('auth'))
122
+ .undelete(c.req.param('id'), ifMatchVersion(c));
130
123
  return c.json(serializeRecord(restored));
131
124
  });
132
125
  // ------------------------------------------------------------------
133
- // Permissions
126
+ // Permissions and associations
134
127
  // ------------------------------------------------------------------
135
- app.get('/:id/permissions', async (c) => {
136
- const id = c.req.param('id');
137
- const auth = c.get('auth');
138
- const record = await scopeFor(auth).get(id);
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.
132
+ app.get('/:id/permissions', knownParams(), async (c) => {
133
+ const record = await scopeFor(c.get('auth')).get(c.req.param('id'));
139
134
  if (!record)
140
135
  throw new StackNotFoundError('Record not found');
141
136
  return c.json({ permissions: record.permissions ?? [] });
142
137
  });
143
- // The amending spelling, where the change set's `permissions` key
144
- // replaces the whole set — which is what survives two admins sharing one
145
- // record at once. Both carry the reshare gate rather than the write bit,
146
- // and both are ScopedStack's to apply: it refuses a data kind sent to
147
- // this surface and holds the set to `write` implying `read`, so nothing
148
- // here inspects the body. See docs/spec/access-control.md
149
- // § Record-level permissions.
150
- app.post('/:id/permissions', requireAuth(), async (c) => {
151
- const id = c.req.param('id');
152
- const auth = c.get('auth');
153
- const body = await readJson(c);
154
- const updated = await stack.forSession(auth).grantAccess(id, body);
138
+ app.post('/:id/permissions', knownParams(), requireAuth(), async (c) => {
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));
155
143
  return c.json(serializeRecord(updated));
156
144
  });
157
- // POST to a /delete sub-path for the reason the association endpoints
158
- // use one, below.
159
- app.post('/:id/permissions/delete', requireAuth(), async (c) => {
160
- const id = c.req.param('id');
161
- const auth = c.get('auth');
162
- const body = await readJson(c);
163
- const updated = await stack.forSession(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));
164
150
  return c.json(serializeRecord(updated));
165
151
  });
166
- // ------------------------------------------------------------------
167
- // Associations
168
- // ------------------------------------------------------------------
169
152
  app.get('/:id/associations', async (c) => {
170
- const id = c.req.param('id');
171
- const auth = c.get('auth');
172
- const record = await scopeFor(auth).get(id);
153
+ const { kind, label } = parseAssociationParams(new URL(c.req.url));
154
+ const record = await scopeFor(c.get('auth')).get(c.req.param('id'));
173
155
  if (!record)
174
156
  throw new StackNotFoundError('Record not found');
175
- let assocs = record.associations ?? [];
176
- const kind = c.req.query('kind');
177
- if (kind)
178
- assocs = assocs.filter((a) => a.kind === kind);
179
- const label = c.req.query('label');
180
- if (label)
181
- assocs = assocs.filter((a) => a.label === label);
182
- 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 });
183
159
  });
184
- // Neither mutating endpoint reads If-Match, and one sent to either is
185
- // ignored rather than refused: a set add/remove composes whatever the
186
- // write order, so there is no race for a precondition to fence. Both
187
- // answer with a record carrying whatever version it already had. See
188
- // docs/spec/wire-format.md § Associations.
189
- app.post('/:id/associations', requireAuth(), async (c) => {
190
- const id = c.req.param('id');
191
- const auth = c.get('auth');
192
- const body = await readJson(c);
193
- if (!body.kind || !body.label)
194
- throw new StackQueryError('kind and label are required');
195
- const updated = await stack.forSession(auth).associate(id, body);
160
+ app.post('/:id/associations', knownParams(), requireAuth(), async (c) => {
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));
196
165
  return c.json(serializeRecord(updated));
197
166
  });
198
- // POST, not DELETE — a DELETE request body has no defined semantics
199
- // (RFC 9110 §9.3.5) and is a portability landmine for proxies/gateways
200
- // that drop or reject it.
201
- app.post('/:id/associations/delete', requireAuth(), async (c) => {
202
- const id = c.req.param('id');
203
- const auth = c.get('auth');
204
- const body = await readJson(c);
205
- const updated = await stack.forSession(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));
206
172
  return c.json(serializeRecord(updated));
207
173
  });
208
174
  // ------------------------------------------------------------------
209
175
  // Journal
210
176
  // ------------------------------------------------------------------
211
- // GET /records/:id/journal — the change journal, oldest first. Not
212
- // optional and never answered empty for a record this server doesn't
213
- // hold: an empty log means "nothing changed" unconditionally, so a
214
- // missing or purged record is the 404 ScopedStack raises.
215
- //
216
- // The mutate-surface gate and the authority-element projection a
217
- // non-resharer gets are both ScopedStack.getJournal()'s, so this route
218
- // decodes the window, bounds the page and serializes. `cursor` is the
219
- // only end-of-log signal — a page filled to the ceiling carries the seq
220
- // to resume from, whether or not the log ends there. See
221
- // 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.
222
183
  app.get('/:id/journal', async (c) => {
223
184
  const id = c.req.param('id');
224
- const auth = c.get('auth');
225
185
  const query = parseJournalParams(new URL(c.req.url));
226
- const limit = clampJournalLimit(query.limit);
227
- const entries = await scopeFor(auth).getJournal(id, { ...query, limit });
228
- const body = {
229
- entries: entries.map(serializeJournalEntry),
230
- cursor: entries.length > 0 && entries.length === limit ? entries[entries.length - 1].seq : null,
231
- };
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 };
232
189
  return c.json(body);
233
190
  });
234
191
  // ------------------------------------------------------------------
235
192
  // Versions
236
193
  // ------------------------------------------------------------------
194
+ // Newest first, paged like the journal. See docs/spec/wire-format.md § Versions.
237
195
  app.get('/:id/versions', async (c) => {
238
196
  const id = c.req.param('id');
239
- const auth = c.get('auth');
240
- const versions = await scopeFor(auth).getVersions(id);
241
- 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);
242
202
  });
243
- app.get('/:id/versions/:version', async (c) => {
244
- const id = c.req.param('id');
245
- const vNum = parsePositiveInt(c.req.param('version'), 'version number');
246
- const auth = c.get('auth');
247
- const version = await scopeFor(auth).getVersion(id, vNum);
203
+ app.get('/:id/versions/:version', knownParams(), async (c) => {
204
+ const version = await scopeFor(c.get('auth')).getVersion(c.req.param('id'), parseUnsignedInt(c.req.param('version'), 'version number'));
248
205
  if (!version)
249
206
  throw new StackNotFoundError('Version not found');
250
207
  return c.json(serializeVersion(version));
251
208
  });
252
209
  // POST /records/:id/restore/:version — creates new version, does not rewrite history
253
- app.post('/:id/restore/:version', requireAuth(), async (c) => {
254
- const id = c.req.param('id');
255
- const vNum = parsePositiveInt(c.req.param('version'), 'version number');
256
- const auth = c.get('auth');
210
+ app.post('/:id/restore/:version', knownParams(), requireAuth(), async (c) => {
257
211
  const restored = await stack
258
- .forSession(auth)
259
- .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));
260
214
  return c.json(serializeRecord(restored));
261
215
  });
262
216
  // POST /records/:id/migrate — the only way typeId changes after creation.
263
- // The body carries the full post-migration content, computed client-side
264
- // by the type's owning app and validated against toTypeId's schema by
265
- // ScopedStack.commitMigration(). Owner acting alone only: replacing
266
- // content and typeId wholesale would have to re-derive every gate
267
- // create() and update() apply at both ends.
268
- app.post('/:id/migrate', requireOwner(ownerEntityId), async (c) => {
269
- const id = c.req.param('id');
270
- const auth = c.get('auth');
271
- const body = await readJson(c);
272
- if (!body.toTypeId || typeof body.toTypeId !== 'string')
273
- throw new StackQueryError('toTypeId is required');
274
- if (!body.content || typeof body.content !== 'object')
275
- throw new StackQueryError('content is required');
276
- if (!(await stack.getType(body.toTypeId)))
277
- throw new StackValidationError([
278
- { path: 'toTypeId', message: `Unknown type: "${body.toTypeId}"` },
279
- ]);
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));
280
223
  const migrated = await stack
281
- .forSession(auth)
282
- .commitMigration(id, body.toTypeId, body.content, {
283
- ifVersion: parseIfMatch(c.req.header('If-Match')),
284
- });
224
+ .asActor(c.get('auth'))
225
+ .commitMigration(c.req.param('id'), toTypeId, content, ifMatchVersion(c));
285
226
  return c.json(serializeRecord(migrated));
286
227
  });
287
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":"tokens.d.ts","sourceRoot":"","sources":["../../src/routes/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CA+D3D"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/routes/tokens.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;AAQhD,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAqE3D"}
@@ -1,4 +1,5 @@
1
1
  import { Hono } from 'hono';
2
+ import { knownParams } from '../middleware/params.js';
2
3
  import { requireOwner } from '../middleware/auth.js';
3
4
  import { readJson } from '../lib/json.js';
4
5
  import { parseDate } from '@haverstack/wire-types';
@@ -8,22 +9,25 @@ export function tokenRoutes(ctx) {
8
9
  const app = new Hono();
9
10
  const { tokens, stack } = ctx;
10
11
  const ownerEntityId = stack.ownerEntityId;
11
- // POST /tokens — issue a new token (owner only). `onBehalfOf` asserts a
12
- // delegation out of band: the owner names the subject the issued
13
- // principal acts for, per docs/spec/wire-format.md § The session a
14
- // token names.
15
- app.post('/', requireOwner(ownerEntityId), async (c) => {
16
- const body = await readJson(c);
17
- if (body.entityId !== undefined && !isValidDid(body.entityId))
18
- throw new StackValidationError([{ path: 'entityId', message: 'Must be a DID' }]);
19
- if (body.onBehalfOf !== undefined && !isValidDid(body.onBehalfOf))
20
- throw new StackValidationError([{ path: 'onBehalfOf', message: 'Must be a DID' }]);
21
- const principalId = body.entityId ?? ownerEntityId;
22
- const expiresAt = body.expiresAt ? parseDate(body.expiresAt) : undefined;
23
- if (body.expiresAt && !expiresAt)
12
+ // POST /tokens — issue a new token (owner only). The body names an Actor:
13
+ // `principalId` is the identity the token authenticates as (default: the
14
+ // owner), and `subjectId` asserts a delegation out of band — the subject
15
+ // that principal acts for (default: the principal itself), per
16
+ // docs/spec/wire-format.md § The session a token names.
17
+ app.post('/', knownParams(), requireOwner(ownerEntityId), async (c) => {
18
+ const body = await readJson(c, ['principalId', 'subjectId', 'label', 'expiresAt']);
19
+ if (body.principalId !== undefined && !isValidDid(body.principalId))
20
+ throw new StackValidationError([{ path: 'principalId', message: 'Must be a DID' }]);
21
+ if (body.subjectId !== undefined && !isValidDid(body.subjectId))
22
+ throw new StackValidationError([{ path: 'subjectId', message: 'Must be a DID' }]);
23
+ const principalId = body.principalId ?? ownerEntityId;
24
+ const subjectId = body.subjectId ?? principalId;
25
+ if (body.label !== undefined && typeof body.label !== 'string')
26
+ throw new StackValidationError([{ path: 'label', message: 'Must be a string' }]);
27
+ const expiresAt = typeof body.expiresAt === 'string' ? parseDate(body.expiresAt) : undefined;
28
+ if (body.expiresAt !== undefined && !expiresAt)
24
29
  throw new StackValidationError([{ path: 'expiresAt', message: 'Invalid date' }]);
25
- const { id, token } = await tokens.createToken(principalId, {
26
- onBehalfOf: body.onBehalfOf,
30
+ const { id, token } = await tokens.createToken({ subjectId, principalId }, {
27
31
  label: body.label,
28
32
  expiresAt,
29
33
  });
@@ -34,19 +38,19 @@ export function tokenRoutes(ctx) {
34
38
  id,
35
39
  token,
36
40
  principalId,
37
- subjectId: body.onBehalfOf ?? principalId,
41
+ subjectId,
38
42
  label: stored.label ?? null,
39
43
  createdAt: stored.createdAt.toISOString(),
40
44
  expiresAt: stored.expiresAt?.toISOString() ?? null,
41
45
  }, 201);
42
46
  });
43
47
  // GET /tokens — list all DB-managed tokens; never returns token values
44
- app.get('/', requireOwner(ownerEntityId), async (c) => {
48
+ app.get('/', knownParams(), requireOwner(ownerEntityId), async (c) => {
45
49
  const list = await tokens.listTokens();
46
50
  return c.json({ tokens: list.map(serializeToken) });
47
51
  });
48
52
  // DELETE /tokens/:id — revoke a token by its ID
49
- app.delete('/:id', requireOwner(ownerEntityId), async (c) => {
53
+ app.delete('/:id', knownParams(), requireOwner(ownerEntityId), async (c) => {
50
54
  await tokens.revokeToken(c.req.param('id'));
51
55
  return c.body(null, 204);
52
56
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/routes/tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/routes/tokens.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;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAYhD,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CA0C1D"}
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"}