@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.
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +2 -0
- package/dist/app.js.map +1 -1
- package/dist/lib/canonicalJson.d.ts +7 -0
- package/dist/lib/canonicalJson.d.ts.map +1 -0
- package/dist/lib/canonicalJson.js +18 -0
- package/dist/lib/canonicalJson.js.map +1 -0
- package/dist/lib/historyPage.d.ts +12 -0
- package/dist/lib/historyPage.d.ts.map +1 -0
- package/dist/lib/historyPage.js +24 -0
- package/dist/lib/historyPage.js.map +1 -0
- package/dist/lib/ifMatch.d.ts +11 -0
- package/dist/lib/ifMatch.d.ts.map +1 -0
- package/dist/lib/ifMatch.js +11 -0
- package/dist/lib/ifMatch.js.map +1 -0
- package/dist/lib/installRequestStore.d.ts +46 -0
- package/dist/lib/installRequestStore.d.ts.map +1 -0
- package/dist/lib/installRequestStore.js +102 -0
- package/dist/lib/installRequestStore.js.map +1 -0
- package/dist/lib/json.d.ts +7 -1
- package/dist/lib/json.d.ts.map +1 -1
- package/dist/lib/json.js +18 -4
- package/dist/lib/json.js.map +1 -1
- package/dist/lib/queryWorker/pool.d.ts +2 -1
- package/dist/lib/queryWorker/pool.d.ts.map +1 -1
- package/dist/lib/queryWorker/pool.js.map +1 -1
- package/dist/lib/queryWorker/protocol.d.ts +3 -2
- package/dist/lib/queryWorker/protocol.d.ts.map +1 -1
- package/dist/lib/queryWorker/worker.js +3 -3
- package/dist/lib/queryWorker/worker.js.map +1 -1
- package/dist/lib/resumeBuffer.d.ts +4 -4
- package/dist/lib/resumeBuffer.d.ts.map +1 -1
- package/dist/lib/resumeBuffer.js +23 -9
- package/dist/lib/resumeBuffer.js.map +1 -1
- package/dist/lib/resumeCursor.d.ts +1 -1
- package/dist/lib/resumeCursor.d.ts.map +1 -1
- package/dist/lib/resumeCursor.js +3 -3
- package/dist/lib/resumeCursor.js.map +1 -1
- package/dist/lib/selfService.d.ts +2 -0
- package/dist/lib/selfService.d.ts.map +1 -0
- package/dist/lib/selfService.js +6 -0
- package/dist/lib/selfService.js.map +1 -0
- package/dist/middleware/auth.d.ts +10 -9
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +21 -10
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/errors.js +1 -1
- package/dist/middleware/errors.js.map +1 -1
- package/dist/middleware/params.d.ts +10 -0
- package/dist/middleware/params.d.ts.map +1 -0
- package/dist/middleware/params.js +18 -0
- package/dist/middleware/params.js.map +1 -0
- package/dist/routes/attachments.d.ts.map +1 -1
- package/dist/routes/attachments.js +24 -14
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +13 -23
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/changes.d.ts +1 -1
- package/dist/routes/changes.d.ts.map +1 -1
- package/dist/routes/changes.js +17 -18
- package/dist/routes/changes.js.map +1 -1
- package/dist/routes/entity.d.ts.map +1 -1
- package/dist/routes/entity.js +12 -8
- package/dist/routes/entity.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +2 -1
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/installs.d.ts +13 -0
- package/dist/routes/installs.d.ts.map +1 -0
- package/dist/routes/installs.js +101 -0
- package/dist/routes/installs.js.map +1 -0
- package/dist/routes/records.d.ts.map +1 -1
- package/dist/routes/records.js +114 -173
- package/dist/routes/records.js.map +1 -1
- package/dist/routes/tokens.d.ts.map +1 -1
- package/dist/routes/tokens.js +22 -18
- package/dist/routes/tokens.js.map +1 -1
- package/dist/routes/types.d.ts.map +1 -1
- package/dist/routes/types.js +11 -25
- package/dist/routes/types.js.map +1 -1
- package/dist/routes/wellknown.d.ts.map +1 -1
- package/dist/routes/wellknown.js +6 -3
- package/dist/routes/wellknown.js.map +1 -1
- package/dist/shutdown.d.ts.map +1 -1
- package/dist/shutdown.js +1 -0
- package/dist/shutdown.js.map +1 -1
- package/dist/stack.d.ts +2 -0
- package/dist/stack.d.ts.map +1 -1
- package/dist/stack.js +30 -8
- package/dist/stack.js.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +15 -4
- package/dist/testing.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/lib/queryLimit.d.ts +0 -6
- package/dist/lib/queryLimit.d.ts.map +0 -1
- package/dist/lib/queryLimit.js +0 -20
- package/dist/lib/queryLimit.js.map +0 -1
package/dist/routes/changes.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import { streamSSE } from 'hono/streaming';
|
|
3
|
-
import {
|
|
4
|
-
import { parseChangeParams } from '@haverstack/core/wire';
|
|
5
|
-
import { serializeChange,
|
|
6
|
-
import { safeCompare
|
|
3
|
+
import { StackBadRequestError, StackPermissionError } from '@haverstack/core';
|
|
4
|
+
import { parseChangeParams, isOwnerActingAlone } from '@haverstack/core/wire';
|
|
5
|
+
import { serializeChange, isValidCursor } from '@haverstack/wire-types';
|
|
6
|
+
import { safeCompare } from '../middleware/auth.js';
|
|
7
7
|
import { FrameGate } from '../lib/frameGate.js';
|
|
8
8
|
import { decodeCursor } from '../lib/resumeCursor.js';
|
|
9
9
|
import { ResumeBufferRegistry, resumeBufferKey } from '../lib/resumeBuffer.js';
|
|
@@ -27,7 +27,7 @@ const DEFAULT_RESUME_RETENTION_MS = 5 * 60 * 1000;
|
|
|
27
27
|
* Raw cursor text presented on this connection, if any — `Last-Event-ID`
|
|
28
28
|
* takes priority over `?since=` (a browser EventSource-style reconnect
|
|
29
29
|
* sends the header; `?since=` exists for a client whose transport can't
|
|
30
|
-
* set one). Not yet validated or decoded — see
|
|
30
|
+
* set one). Not yet validated or decoded — see isValidCursor()/decodeCursor().
|
|
31
31
|
*/
|
|
32
32
|
function presentedCursorRaw(c, url) {
|
|
33
33
|
return c.req.header('Last-Event-ID') ?? url.searchParams.get('since') ?? undefined;
|
|
@@ -44,7 +44,7 @@ export function changeRoutes(ctx, config, logger, opts = {}) {
|
|
|
44
44
|
});
|
|
45
45
|
/** Scope to a session if authenticated, else the anonymous (public-only) view. */
|
|
46
46
|
function scopeFor(auth) {
|
|
47
|
-
return auth ? ctx.stack.
|
|
47
|
+
return auth ? ctx.stack.asActor(auth) : ctx.stack.asEntity(null);
|
|
48
48
|
}
|
|
49
49
|
// Single-process only: events exist only in the process owning the
|
|
50
50
|
// stack's storage (docs/spec/change-feed.md § Feed implementation
|
|
@@ -54,21 +54,21 @@ export function changeRoutes(ctx, config, logger, opts = {}) {
|
|
|
54
54
|
app.get('/', async (c) => {
|
|
55
55
|
const url = new URL(c.req.url);
|
|
56
56
|
const auth = c.get('auth');
|
|
57
|
-
const { filter, includeRecords
|
|
57
|
+
const { filter, includeRecords } = parseChangeParams(url);
|
|
58
58
|
const presentedRaw = presentedCursorRaw(c, url);
|
|
59
59
|
// Refused before the stream opens: a throw from subscribe() after
|
|
60
60
|
// streaming starts is caught below and merely closes the connection,
|
|
61
61
|
// silently, having already answered 200. includeUnlisted owes a real
|
|
62
62
|
// 403, the same one GET /records answers with.
|
|
63
|
-
if (includeUnlisted && !isOwnerActingAlone(auth, ctx.stack.ownerEntityId)) {
|
|
63
|
+
if (filter.includeUnlisted && !(auth && isOwnerActingAlone(auth, ctx.stack.ownerEntityId))) {
|
|
64
64
|
throw new StackPermissionError('includeUnlisted is owner-only');
|
|
65
65
|
}
|
|
66
66
|
// A charset-invalid cursor is refused rather than treated as a cache
|
|
67
67
|
// miss: no conformant server could have minted it, so there is nothing
|
|
68
|
-
// to reconcile.
|
|
68
|
+
// to reconcile. isValidCursor() is the rule minted cursors meet on the way
|
|
69
69
|
// out, applied here on the way in.
|
|
70
|
-
if (resumeEnabled && presentedRaw !== undefined && !
|
|
71
|
-
throw new
|
|
70
|
+
if (resumeEnabled && presentedRaw !== undefined && !isValidCursor(presentedRaw)) {
|
|
71
|
+
throw new StackBadRequestError(`Invalid cursor: "${presentedRaw}"`);
|
|
72
72
|
}
|
|
73
73
|
// Never accepted: a bearer token is read only from the Authorization
|
|
74
74
|
// header (authMiddleware), never from a query param — the feed is
|
|
@@ -106,7 +106,7 @@ export function changeRoutes(ctx, config, logger, opts = {}) {
|
|
|
106
106
|
}
|
|
107
107
|
unsubscribe = await scopeFor(auth).subscribe((change) => {
|
|
108
108
|
send('record', serializeChange(change));
|
|
109
|
-
}, { filter, includeRecords
|
|
109
|
+
}, { filter, includeRecords });
|
|
110
110
|
}
|
|
111
111
|
else {
|
|
112
112
|
const key = resumeBufferKey({
|
|
@@ -114,10 +114,9 @@ export function changeRoutes(ctx, config, logger, opts = {}) {
|
|
|
114
114
|
subjectId: auth?.subjectId ?? null,
|
|
115
115
|
filter,
|
|
116
116
|
includeRecords,
|
|
117
|
-
includeUnlisted,
|
|
118
117
|
});
|
|
119
118
|
const scoped = scopeFor(auth);
|
|
120
|
-
const buffer = await resumeBuffers.acquire(key, (onChange) => scoped.subscribe(onChange, { filter, includeRecords
|
|
119
|
+
const buffer = await resumeBuffers.acquire(key, (onChange) => scoped.subscribe(onChange, { filter, includeRecords }));
|
|
121
120
|
// Attached before anything below awaits, so there is no gap
|
|
122
121
|
// between what the backlog snapshot covers and what the live
|
|
123
122
|
// buffer reports. `replaying` holds live arrivals until the
|
|
@@ -129,7 +128,7 @@ export function changeRoutes(ctx, config, logger, opts = {}) {
|
|
|
129
128
|
if (replaying)
|
|
130
129
|
queued.push(entry);
|
|
131
130
|
else
|
|
132
|
-
send('record', entry.frame, entry.frame.
|
|
131
|
+
send('record', entry.frame, entry.frame.cursor);
|
|
133
132
|
});
|
|
134
133
|
// Registered before the first `await` below, so a subscription
|
|
135
134
|
// opened above is always released — including when that await
|
|
@@ -156,7 +155,7 @@ export function changeRoutes(ctx, config, logger, opts = {}) {
|
|
|
156
155
|
resetReason = outcome.status;
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
|
-
send('ready', {
|
|
158
|
+
send('ready', { cursor: buffer.headCursor() });
|
|
160
159
|
if (resetReason) {
|
|
161
160
|
send('reset', { reason: resetReason });
|
|
162
161
|
}
|
|
@@ -173,13 +172,13 @@ export function changeRoutes(ctx, config, logger, opts = {}) {
|
|
|
173
172
|
}
|
|
174
173
|
// Once the gate trips this connection is closing, so the
|
|
175
174
|
// remaining entries are permission checks nobody will read.
|
|
176
|
-
if (!send('record', entry.frame, entry.frame.
|
|
175
|
+
if (!send('record', entry.frame, entry.frame.cursor))
|
|
177
176
|
break;
|
|
178
177
|
}
|
|
179
178
|
}
|
|
180
179
|
replaying = false;
|
|
181
180
|
for (const entry of queued) {
|
|
182
|
-
if (!send('record', entry.frame, entry.frame.
|
|
181
|
+
if (!send('record', entry.frame, entry.frame.cursor))
|
|
183
182
|
break;
|
|
184
183
|
}
|
|
185
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/routes/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/routes/changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/routes/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/routes/entity.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,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAyB5D"}
|
package/dist/routes/entity.js
CHANGED
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
+
import { knownParams } from '../middleware/params.js';
|
|
2
3
|
import { requireAuth, requireOwner } from '../middleware/auth.js';
|
|
3
4
|
import { readJson } from '../lib/json.js';
|
|
4
5
|
import { serializeRecord } from '@haverstack/wire-types';
|
|
6
|
+
import { parseContentPatchBody } from '@haverstack/core/wire';
|
|
7
|
+
import { ifMatchVersion } from '../lib/ifMatch.js';
|
|
5
8
|
import { StackNotFoundError } from '@haverstack/core';
|
|
6
9
|
export function entityRoutes(ctx) {
|
|
7
10
|
const app = new Hono();
|
|
8
11
|
const { stack } = ctx;
|
|
9
12
|
const ownerEntityId = stack.ownerEntityId;
|
|
10
|
-
app.get('/', requireAuth(), async (c) => {
|
|
13
|
+
app.get('/', knownParams(), requireAuth(), async (c) => {
|
|
11
14
|
const auth = c.get('auth');
|
|
12
|
-
const record = await stack.
|
|
15
|
+
const record = await stack.asActor(auth).getOwnerEntity();
|
|
13
16
|
if (!record)
|
|
14
17
|
throw new StackNotFoundError('Entity record not found');
|
|
15
18
|
return c.json(serializeRecord(record));
|
|
16
19
|
});
|
|
17
|
-
|
|
20
|
+
// An alias for PATCH /records/:id/content on the owner's entity record,
|
|
21
|
+
// so it takes the same bare patch and the same If-Match.
|
|
22
|
+
// See docs/spec/wire-format.md § Entity.
|
|
23
|
+
app.patch('/content', knownParams(), requireOwner(ownerEntityId), async (c) => {
|
|
18
24
|
const auth = c.get('auth');
|
|
19
|
-
const
|
|
25
|
+
const patch = parseContentPatchBody(await readJson(c));
|
|
26
|
+
const record = await stack.asActor(auth).getOwnerEntity();
|
|
20
27
|
if (!record)
|
|
21
28
|
throw new StackNotFoundError('Entity record not found');
|
|
22
|
-
const
|
|
23
|
-
const updated = await stack
|
|
24
|
-
.forSession(auth)
|
|
25
|
-
.patchContent(record.id, (body.content ?? {}));
|
|
29
|
+
const updated = await stack.asActor(auth).patchContent(record.id, patch, ifMatchVersion(c));
|
|
26
30
|
return c.json(serializeRecord(updated));
|
|
27
31
|
});
|
|
28
32
|
return app;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/routes/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/routes/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,YAAY,CAAC,GAAiB;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACtB,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAE1C,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;QAC1D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,yDAAyD;IACzD,yCAAyC;IACzC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,YAAY,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5E,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;QAC1D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,wBAAgB,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,CAI3C"}
|
package/dist/routes/health.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
+
import { knownParams } from '../middleware/params.js';
|
|
2
3
|
export function healthRoutes() {
|
|
3
4
|
const app = new Hono();
|
|
4
|
-
app.get('/', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));
|
|
5
|
+
app.get('/', knownParams(), (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));
|
|
5
6
|
return app;
|
|
6
7
|
}
|
|
7
8
|
//# sourceMappingURL=health.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAC;IAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAClG,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../types.js';
|
|
3
|
+
import type { StackContext } from '../stack.js';
|
|
4
|
+
/**
|
|
5
|
+
* The two halves of an app install. POST /installs is the app's, and the
|
|
6
|
+
* wire contract pins it: a key presents its manifest and learns whether
|
|
7
|
+
* it was approved. /installs/requests is the owner's, which the spec
|
|
8
|
+
* leaves to the server: review what a pending request would change, then
|
|
9
|
+
* approve or decline it. Underneath, both are Stack.planInstall(), and
|
|
10
|
+
* approval is Stack.installApp(). See docs/spec/apps.md § Over the wire.
|
|
11
|
+
*/
|
|
12
|
+
export declare function installRoutes(ctx: StackContext): Hono<AppEnv>;
|
|
13
|
+
//# sourceMappingURL=installs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installs.d.ts","sourceRoot":"","sources":["../../src/routes/installs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CA6D7D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { StackNotFoundError, isPlanEmpty } from '@haverstack/core';
|
|
3
|
+
import { parseInstallBody } from '@haverstack/core/wire';
|
|
4
|
+
import { serializeRecord } from '@haverstack/wire-types';
|
|
5
|
+
import { knownParams } from '../middleware/params.js';
|
|
6
|
+
import { requireActingAlone, requireOwner } from '../middleware/auth.js';
|
|
7
|
+
import { readJson } from '../lib/json.js';
|
|
8
|
+
/**
|
|
9
|
+
* The two halves of an app install. POST /installs is the app's, and the
|
|
10
|
+
* wire contract pins it: a key presents its manifest and learns whether
|
|
11
|
+
* it was approved. /installs/requests is the owner's, which the spec
|
|
12
|
+
* leaves to the server: review what a pending request would change, then
|
|
13
|
+
* approve or decline it. Underneath, both are Stack.planInstall(), and
|
|
14
|
+
* approval is Stack.installApp(). See docs/spec/apps.md § Over the wire.
|
|
15
|
+
*/
|
|
16
|
+
export function installRoutes(ctx) {
|
|
17
|
+
const app = new Hono();
|
|
18
|
+
const { stack, installRequests } = ctx;
|
|
19
|
+
const ownerEntityId = stack.ownerEntityId;
|
|
20
|
+
// The key being installed is the session's principal, never named in
|
|
21
|
+
// the body, so no app can ask on behalf of a key it does not hold.
|
|
22
|
+
// Planning writes nothing; only an empty plan is answered as installed.
|
|
23
|
+
// See docs/spec/wire-format.md § Installs.
|
|
24
|
+
app.post('/', knownParams(), requireActingAlone(), async (c) => {
|
|
25
|
+
const auth = c.get('auth');
|
|
26
|
+
const manifest = parseInstallBody(await readJson(c));
|
|
27
|
+
const plan = await stack.planInstall(manifest, { did: auth.principalId });
|
|
28
|
+
if (isPlanEmpty(plan)) {
|
|
29
|
+
const pending = installRequests.forKey(auth.principalId);
|
|
30
|
+
if (pending)
|
|
31
|
+
installRequests.remove(pending.id);
|
|
32
|
+
const body = {
|
|
33
|
+
status: 'installed',
|
|
34
|
+
install: serializeRecord(plan.existing),
|
|
35
|
+
};
|
|
36
|
+
return c.json(body, 200);
|
|
37
|
+
}
|
|
38
|
+
installRequests.put(auth.principalId, manifest);
|
|
39
|
+
const body = { status: 'pending' };
|
|
40
|
+
return c.json(body, 202);
|
|
41
|
+
});
|
|
42
|
+
app.get('/requests', knownParams(), requireOwner(ownerEntityId), (c) => {
|
|
43
|
+
return c.json({ requests: installRequests.list().map(serializeRequest) });
|
|
44
|
+
});
|
|
45
|
+
// Planned on every read rather than stored, since what a manifest would
|
|
46
|
+
// change depends on the stack as it stands now.
|
|
47
|
+
app.get('/requests/:id', knownParams(), requireOwner(ownerEntityId), async (c) => {
|
|
48
|
+
const entry = requestOrNotFound(c.req.param('id'));
|
|
49
|
+
const plan = await stack.planInstall(entry.manifest, { did: entry.did });
|
|
50
|
+
return c.json({ ...serializeRequest(entry), plan: serializePlan(plan) });
|
|
51
|
+
});
|
|
52
|
+
// Applies the manifest the id names, planned afresh at approval.
|
|
53
|
+
app.post('/requests/:id/approve', knownParams(), requireOwner(ownerEntityId), async (c) => {
|
|
54
|
+
const entry = requestOrNotFound(c.req.param('id'));
|
|
55
|
+
const plan = await stack.planInstall(entry.manifest, { did: entry.did });
|
|
56
|
+
const install = await stack.installApp(plan);
|
|
57
|
+
installRequests.remove(entry.id);
|
|
58
|
+
const body = { status: 'installed', install: serializeRecord(install) };
|
|
59
|
+
return c.json(body);
|
|
60
|
+
});
|
|
61
|
+
app.delete('/requests/:id', knownParams(), requireOwner(ownerEntityId), (c) => {
|
|
62
|
+
installRequests.remove(requestOrNotFound(c.req.param('id')).id);
|
|
63
|
+
return c.body(null, 204);
|
|
64
|
+
});
|
|
65
|
+
function requestOrNotFound(id) {
|
|
66
|
+
const entry = installRequests.get(id);
|
|
67
|
+
if (!entry)
|
|
68
|
+
throw new StackNotFoundError('Install request not found');
|
|
69
|
+
return entry;
|
|
70
|
+
}
|
|
71
|
+
return app;
|
|
72
|
+
}
|
|
73
|
+
function serializeRequest(entry) {
|
|
74
|
+
return {
|
|
75
|
+
id: entry.id,
|
|
76
|
+
did: entry.did,
|
|
77
|
+
manifest: entry.manifest,
|
|
78
|
+
requestedAt: entry.requestedAt.toISOString(),
|
|
79
|
+
expiresAt: entry.expiresAt.toISOString(),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* What a plan would change; its manifest and key are already on the request.
|
|
84
|
+
* Every field is named, so nothing reaches the wire unchosen, and the return
|
|
85
|
+
* type covers every InstallPlan field, so a field core adds fails to compile
|
|
86
|
+
* here until someone decides whether the owner's review shows it.
|
|
87
|
+
*/
|
|
88
|
+
function serializePlan(plan) {
|
|
89
|
+
return {
|
|
90
|
+
existing: plan.existing ? serializeRecord(plan.existing) : null,
|
|
91
|
+
newFamilies: plan.newFamilies,
|
|
92
|
+
newVersions: plan.newVersions,
|
|
93
|
+
requestsAdded: plan.requestsAdded,
|
|
94
|
+
requestsRemoved: plan.requestsRemoved,
|
|
95
|
+
foreignRequests: plan.foreignRequests,
|
|
96
|
+
typeChanges: plan.typeChanges,
|
|
97
|
+
newKey: plan.newKey,
|
|
98
|
+
linkedKeys: plan.linkedKeys,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=installs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installs.js","sourceRoot":"","sources":["../../src/routes/installs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/routes/records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/routes/records.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;AA2ChD,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAwPpF"}
|