@ketvietlab/ketjs 0.1.2 → 0.1.5
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/LICENSE +1 -1
- package/README.md +8 -2
- package/dist/agent/capabilities.d.ts +1 -3
- package/dist/agent/capabilities.d.ts.map +1 -1
- package/dist/agent/capabilities.js +10 -1
- package/dist/agent/capabilities.js.map +1 -1
- package/dist/agent/permissions.d.ts +43 -1
- package/dist/agent/permissions.d.ts.map +1 -1
- package/dist/agent/permissions.js +50 -2
- package/dist/agent/permissions.js.map +1 -1
- package/dist/cli.js +246 -97
- package/dist/cli.js.map +1 -1
- package/dist/codegen/dts.d.ts.map +1 -1
- package/dist/codegen/dts.js +1 -0
- package/dist/codegen/dts.js.map +1 -1
- package/dist/data/changeset.d.ts +12 -0
- package/dist/data/changeset.d.ts.map +1 -1
- package/dist/data/changeset.js +73 -17
- package/dist/data/changeset.js.map +1 -1
- package/dist/data/expr.d.ts +25 -1
- package/dist/data/expr.d.ts.map +1 -1
- package/dist/data/expr.js +47 -6
- package/dist/data/expr.js.map +1 -1
- package/dist/data/fleet.d.ts +41 -1
- package/dist/data/fleet.d.ts.map +1 -1
- package/dist/data/fleet.js +100 -11
- package/dist/data/fleet.js.map +1 -1
- package/dist/data/migrate.d.ts +20 -0
- package/dist/data/migrate.d.ts.map +1 -1
- package/dist/data/migrate.js +86 -3
- package/dist/data/migrate.js.map +1 -1
- package/dist/data/physical.d.ts +5 -0
- package/dist/data/physical.d.ts.map +1 -0
- package/dist/data/physical.js +196 -0
- package/dist/data/physical.js.map +1 -0
- package/dist/data/pool.d.ts +2 -1
- package/dist/data/pool.d.ts.map +1 -1
- package/dist/data/pool.js +159 -31
- package/dist/data/pool.js.map +1 -1
- package/dist/data/query.d.ts +10 -1
- package/dist/data/query.d.ts.map +1 -1
- package/dist/data/query.js +136 -27
- package/dist/data/query.js.map +1 -1
- package/dist/data/sqlite.d.ts.map +1 -1
- package/dist/data/sqlite.js +350 -52
- package/dist/data/sqlite.js.map +1 -1
- package/dist/data/time.d.ts +13 -0
- package/dist/data/time.d.ts.map +1 -1
- package/dist/data/time.js +61 -17
- package/dist/data/time.js.map +1 -1
- package/dist/index.d.ts +45 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -18
- package/dist/index.js.map +1 -1
- package/dist/kernel/audit.d.ts +27 -0
- package/dist/kernel/audit.d.ts.map +1 -0
- package/dist/kernel/audit.js +67 -0
- package/dist/kernel/audit.js.map +1 -0
- package/dist/kernel/classification.d.ts +26 -0
- package/dist/kernel/classification.d.ts.map +1 -0
- package/dist/kernel/classification.js +73 -0
- package/dist/kernel/classification.js.map +1 -0
- package/dist/kernel/compose.d.ts +6 -2
- package/dist/kernel/compose.d.ts.map +1 -1
- package/dist/kernel/compose.js +269 -15
- package/dist/kernel/compose.js.map +1 -1
- package/dist/kernel/define.d.ts +2 -3
- package/dist/kernel/define.d.ts.map +1 -1
- package/dist/kernel/define.js +22 -12
- package/dist/kernel/define.js.map +1 -1
- package/dist/kernel/diff.d.ts.map +1 -1
- package/dist/kernel/diff.js +28 -4
- package/dist/kernel/diff.js.map +1 -1
- package/dist/kernel/graph.js +1 -1
- package/dist/kernel/graph.js.map +1 -1
- package/dist/kernel/i18n.d.ts +10 -1
- package/dist/kernel/i18n.d.ts.map +1 -1
- package/dist/kernel/i18n.js +34 -1
- package/dist/kernel/i18n.js.map +1 -1
- package/dist/kernel/layout.d.ts +97 -0
- package/dist/kernel/layout.d.ts.map +1 -1
- package/dist/kernel/layout.js +294 -12
- package/dist/kernel/layout.js.map +1 -1
- package/dist/kernel/menu.d.ts +33 -2
- package/dist/kernel/menu.d.ts.map +1 -1
- package/dist/kernel/menu.js +99 -7
- package/dist/kernel/menu.js.map +1 -1
- package/dist/kernel/modules.d.ts +3 -3
- package/dist/kernel/modules.d.ts.map +1 -1
- package/dist/kernel/modules.js +21 -21
- package/dist/kernel/modules.js.map +1 -1
- package/dist/kernel/permissions.d.ts +10 -0
- package/dist/kernel/permissions.d.ts.map +1 -0
- package/dist/kernel/permissions.js +365 -0
- package/dist/kernel/permissions.js.map +1 -0
- package/dist/kernel/schedule.d.ts +23 -0
- package/dist/kernel/schedule.d.ts.map +1 -0
- package/dist/kernel/schedule.js +83 -0
- package/dist/kernel/schedule.js.map +1 -0
- package/dist/kernel/types.d.ts.map +1 -1
- package/dist/kernel/types.js +5 -4
- package/dist/kernel/types.js.map +1 -1
- package/dist/kernel/workspace.d.ts +92 -14
- package/dist/kernel/workspace.d.ts.map +1 -1
- package/dist/kernel/workspace.js +128 -49
- package/dist/kernel/workspace.js.map +1 -1
- package/dist/pdf/assets/Inter-Bold.ttf +0 -0
- package/dist/pdf/assets/Inter-Regular.ttf +0 -0
- package/dist/pdf/assets/Inter-SemiBold.ttf +0 -0
- package/dist/pdf/assets/LICENSE.txt +92 -0
- package/dist/pdf/font.d.ts +10 -0
- package/dist/pdf/font.d.ts.map +1 -0
- package/dist/pdf/font.js +83 -0
- package/dist/pdf/font.js.map +1 -0
- package/dist/pdf/image.d.ts +8 -0
- package/dist/pdf/image.d.ts.map +1 -0
- package/dist/pdf/image.js +94 -0
- package/dist/pdf/image.js.map +1 -0
- package/dist/pdf/index.d.ts +15 -0
- package/dist/pdf/index.d.ts.map +1 -0
- package/dist/pdf/index.js +17 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/markup.d.ts +19 -0
- package/dist/pdf/markup.d.ts.map +1 -0
- package/dist/pdf/markup.js +146 -0
- package/dist/pdf/markup.js.map +1 -0
- package/dist/pdf/render.d.ts +14 -0
- package/dist/pdf/render.d.ts.map +1 -0
- package/dist/pdf/render.js +387 -0
- package/dist/pdf/render.js.map +1 -0
- package/dist/scaffold/index.js +6 -6
- package/dist/scaffold/index.js.map +1 -1
- package/dist/scaffold/templates/{app.test.ts.tmpl → deployment.test.ts.tmpl} +3 -3
- package/dist/scaffold/templates/ket.workspace.ts.tmpl +4 -6
- package/dist/scaffold/templates/module.ts.tmpl +1 -4
- package/dist/server/assets.d.ts +23 -0
- package/dist/server/assets.d.ts.map +1 -0
- package/dist/server/assets.js +97 -0
- package/dist/server/assets.js.map +1 -0
- package/dist/server/boot.d.ts +174 -38
- package/dist/server/boot.d.ts.map +1 -1
- package/dist/server/boot.js +399 -140
- package/dist/server/boot.js.map +1 -1
- package/dist/server/config.d.ts +30 -10
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +73 -17
- package/dist/server/config.js.map +1 -1
- package/dist/server/ctx.d.ts +10 -0
- package/dist/server/ctx.d.ts.map +1 -1
- package/dist/server/ctx.js +284 -48
- package/dist/server/ctx.js.map +1 -1
- package/dist/server/development.d.ts +10 -0
- package/dist/server/development.d.ts.map +1 -0
- package/dist/server/development.js +15 -0
- package/dist/server/development.js.map +1 -0
- package/dist/server/fn.d.ts +22 -3
- package/dist/server/fn.d.ts.map +1 -1
- package/dist/server/fn.js +116 -32
- package/dist/server/fn.js.map +1 -1
- package/dist/server/form.d.ts +33 -0
- package/dist/server/form.d.ts.map +1 -0
- package/dist/server/form.js +47 -0
- package/dist/server/form.js.map +1 -0
- package/dist/server/http.d.ts +82 -3
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +373 -37
- package/dist/server/http.js.map +1 -1
- package/dist/server/idem.d.ts +3 -2
- package/dist/server/idem.d.ts.map +1 -1
- package/dist/server/idem.js +12 -4
- package/dist/server/idem.js.map +1 -1
- package/dist/server/jobs.js +1 -1
- package/dist/server/jobs.js.map +1 -1
- package/dist/server/log/combinators.d.ts +42 -0
- package/dist/server/log/combinators.d.ts.map +1 -0
- package/dist/server/log/combinators.js +270 -0
- package/dist/server/log/combinators.js.map +1 -0
- package/dist/server/log/console.d.ts +12 -0
- package/dist/server/log/console.d.ts.map +1 -0
- package/dist/server/log/console.js +96 -0
- package/dist/server/log/console.js.map +1 -0
- package/dist/server/log/file.d.ts +11 -0
- package/dist/server/log/file.d.ts.map +1 -0
- package/dist/server/log/file.js +61 -0
- package/dist/server/log/file.js.map +1 -0
- package/dist/server/log/index.d.ts +23 -0
- package/dist/server/log/index.d.ts.map +1 -0
- package/dist/server/log/index.js +45 -0
- package/dist/server/log/index.js.map +1 -0
- package/dist/server/log/logger.d.ts +53 -0
- package/dist/server/log/logger.d.ts.map +1 -0
- package/dist/server/log/logger.js +94 -0
- package/dist/server/log/logger.js.map +1 -0
- package/dist/server/log/memory.d.ts +11 -0
- package/dist/server/log/memory.d.ts.map +1 -0
- package/dist/server/log/memory.js +25 -0
- package/dist/server/log/memory.js.map +1 -0
- package/dist/server/log/types.d.ts +112 -0
- package/dist/server/log/types.d.ts.map +1 -0
- package/dist/server/log/types.js +58 -0
- package/dist/server/log/types.js.map +1 -0
- package/dist/server/policy.d.ts +29 -0
- package/dist/server/policy.d.ts.map +1 -0
- package/dist/server/policy.js +29 -0
- package/dist/server/policy.js.map +1 -0
- package/dist/server/queue.d.ts +1 -1
- package/dist/server/queue.d.ts.map +1 -1
- package/dist/server/queue.js.map +1 -1
- package/dist/server/ratelimit.d.ts +48 -0
- package/dist/server/ratelimit.d.ts.map +1 -0
- package/dist/server/ratelimit.js +102 -0
- package/dist/server/ratelimit.js.map +1 -0
- package/dist/server/respond.d.ts.map +1 -1
- package/dist/server/respond.js +16 -1
- package/dist/server/respond.js.map +1 -1
- package/dist/server/runtime.d.ts +18 -3
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +32 -2
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/schedule.d.ts +18 -0
- package/dist/server/schedule.d.ts.map +1 -0
- package/dist/server/schedule.js +70 -0
- package/dist/server/schedule.js.map +1 -0
- package/dist/server/sequence.d.ts +42 -0
- package/dist/server/sequence.d.ts.map +1 -0
- package/dist/server/sequence.js +97 -0
- package/dist/server/sequence.js.map +1 -0
- package/dist/server/session.d.ts +21 -0
- package/dist/server/session.d.ts.map +1 -1
- package/dist/server/session.js +84 -10
- package/dist/server/session.js.map +1 -1
- package/dist/server/sessionstore.d.ts +3 -1
- package/dist/server/sessionstore.d.ts.map +1 -1
- package/dist/server/sessionstore.js +7 -3
- package/dist/server/sessionstore.js.map +1 -1
- package/dist/server/storage/index.d.ts +1 -1
- package/dist/server/storage/index.d.ts.map +1 -1
- package/dist/server/storage/index.js +61 -1
- package/dist/server/storage/index.js.map +1 -1
- package/dist/server/storage/types.d.ts +8 -0
- package/dist/server/storage/types.d.ts.map +1 -1
- package/dist/server/storage/types.js +58 -0
- package/dist/server/storage/types.js.map +1 -1
- package/dist/server/stream.d.ts +8 -2
- package/dist/server/stream.d.ts.map +1 -1
- package/dist/server/stream.js +44 -4
- package/dist/server/stream.js.map +1 -1
- package/dist/server/streamstore.d.ts +10 -0
- package/dist/server/streamstore.d.ts.map +1 -1
- package/dist/server/streamstore.js +72 -6
- package/dist/server/streamstore.js.map +1 -1
- package/dist/server/tenants.d.ts +20 -18
- package/dist/server/tenants.d.ts.map +1 -1
- package/dist/server/tenants.js +133 -84
- package/dist/server/tenants.js.map +1 -1
- package/dist/server/transport/types.js +2 -2
- package/dist/server/transport/types.js.map +1 -1
- package/dist/server/worker.d.ts +19 -3
- package/dist/server/worker.d.ts.map +1 -1
- package/dist/server/worker.js +168 -21
- package/dist/server/worker.js.map +1 -1
- package/dist/testing.d.ts +26 -10
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +41 -14
- package/dist/testing.js.map +1 -1
- package/dist/theme/contracts.d.ts +14 -1
- package/dist/theme/contracts.d.ts.map +1 -1
- package/dist/theme/contracts.js +35 -6
- package/dist/theme/contracts.js.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/joint-runtime.d.ts +33 -0
- package/dist/theme/joint-runtime.d.ts.map +1 -0
- package/dist/theme/joint-runtime.js +121 -0
- package/dist/theme/joint-runtime.js.map +1 -0
- package/dist/theme/joints.d.ts.map +1 -1
- package/dist/theme/joints.js +15 -97
- package/dist/theme/joints.js.map +1 -1
- package/dist/theme/ktl/compile.d.ts +4 -0
- package/dist/theme/ktl/compile.d.ts.map +1 -1
- package/dist/theme/ktl/compile.js +54 -1
- package/dist/theme/ktl/compile.js.map +1 -1
- package/dist/theme/ktl/parser.d.ts +4 -0
- package/dist/theme/ktl/parser.d.ts.map +1 -1
- package/dist/theme/ktl/parser.js +8 -0
- package/dist/theme/ktl/parser.js.map +1 -1
- package/dist/theme/render.d.ts +8 -0
- package/dist/theme/render.d.ts.map +1 -1
- package/dist/theme/render.js +88 -118
- package/dist/theme/render.js.map +1 -1
- package/dist/theme/tokens.d.ts +18 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +33 -0
- package/dist/theme/tokens.js.map +1 -1
- package/dist/theme/viewmodel.d.ts +24 -0
- package/dist/theme/viewmodel.d.ts.map +1 -1
- package/dist/theme/viewmodel.js +75 -6
- package/dist/theme/viewmodel.js.map +1 -1
- package/dist/types.d.ts +320 -56
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -2
- package/dist/kernel/apps.d.ts +0 -43
- package/dist/kernel/apps.d.ts.map +0 -1
- package/dist/kernel/apps.js +0 -234
- package/dist/kernel/apps.js.map +0 -1
|
@@ -12,6 +12,15 @@ export function effectStorage(storage, effects, operation) {
|
|
|
12
12
|
};
|
|
13
13
|
return {
|
|
14
14
|
name: storage.name,
|
|
15
|
+
...(storage.public ? { public: effectStorage(storage.public, effects, operation) } : {}),
|
|
16
|
+
...(storage.publicUrl
|
|
17
|
+
? {
|
|
18
|
+
publicUrl(key) {
|
|
19
|
+
need('storage:read');
|
|
20
|
+
return storage.publicUrl(key);
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
: {}),
|
|
15
24
|
put(key, body, options) {
|
|
16
25
|
need('storage:write');
|
|
17
26
|
return storage.put(key, body, options);
|
|
@@ -56,6 +65,8 @@ export function namespacedStorage(storage, namespace) {
|
|
|
56
65
|
const strip = (key) => key.slice(prefix.length);
|
|
57
66
|
return {
|
|
58
67
|
name: `${storage.name}:${safe}`,
|
|
68
|
+
...(storage.public ? { public: namespacedStorage(storage.public, namespace) } : {}),
|
|
69
|
+
...(storage.publicUrl ? { publicUrl: (key) => storage.publicUrl(keyOf(key)) } : {}),
|
|
59
70
|
put: (key, body, options) => storage.put(keyOf(key), body, options).then((meta) => ({ ...meta, key })),
|
|
60
71
|
async get(key) {
|
|
61
72
|
const found = await storage.get(keyOf(key));
|
|
@@ -79,4 +90,51 @@ export function namespacedStorage(storage, namespace) {
|
|
|
79
90
|
signedUrl: (key, options) => storage.signedUrl(keyOf(key), options),
|
|
80
91
|
};
|
|
81
92
|
}
|
|
93
|
+
/** Compose two backends without changing existing private-only callers. */
|
|
94
|
+
export function withPublicStorage(privateStorage, publicStorage, options = {}) {
|
|
95
|
+
if (privateStorage === publicStorage ||
|
|
96
|
+
privateStorage.public ||
|
|
97
|
+
publicStorage.public ||
|
|
98
|
+
privateStorage.publicUrl)
|
|
99
|
+
throw new KetError({
|
|
100
|
+
code: 'E_STORAGE_CONFIG',
|
|
101
|
+
message: 'private and public storage must be distinct leaf backends',
|
|
102
|
+
});
|
|
103
|
+
let base;
|
|
104
|
+
if (options.baseUrl != null) {
|
|
105
|
+
try {
|
|
106
|
+
base = new URL(options.baseUrl);
|
|
107
|
+
if (!['http:', 'https:'].includes(base.protocol) ||
|
|
108
|
+
base.username ||
|
|
109
|
+
base.password ||
|
|
110
|
+
base.search ||
|
|
111
|
+
base.hash)
|
|
112
|
+
throw new Error('unsafe URL');
|
|
113
|
+
if (!base.pathname.endsWith('/'))
|
|
114
|
+
base.pathname += '/';
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
throw new KetError({
|
|
118
|
+
code: 'E_STORAGE_CONFIG',
|
|
119
|
+
message: 'public storage URL must be HTTP(S) without credentials, query or fragment',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const delegate = (storage) => ({
|
|
124
|
+
name: storage.name,
|
|
125
|
+
put: (key, body, o) => storage.put(key, body, o),
|
|
126
|
+
get: (key) => storage.get(key),
|
|
127
|
+
head: (key) => storage.head(key),
|
|
128
|
+
remove: (key) => storage.remove(key),
|
|
129
|
+
list: (prefix, o) => storage.list(prefix, o),
|
|
130
|
+
signedUrl: (key, o) => storage.signedUrl(key, o),
|
|
131
|
+
...(storage.publicUrl ? { publicUrl: (key) => storage.publicUrl(key) } : {}),
|
|
132
|
+
});
|
|
133
|
+
const published = delegate(publicStorage);
|
|
134
|
+
if (base) {
|
|
135
|
+
const prefix = base.href;
|
|
136
|
+
published.publicUrl = (key) => prefix + storageKey(key).split('/').map(encodeURIComponent).join('/');
|
|
137
|
+
}
|
|
138
|
+
return { ...delegate(privateStorage), public: published };
|
|
139
|
+
}
|
|
82
140
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/ketjs/src/server/storage/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/ketjs/src/server/storage/types.ts"],"names":[],"mappings":"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"}
|
package/dist/server/stream.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { StreamStore } from './streamstore.ts';
|
|
2
|
+
import type { Adapter } from '../types.ts';
|
|
2
3
|
export type Chunk = {
|
|
3
4
|
seq: number;
|
|
4
5
|
data: unknown;
|
|
@@ -27,12 +28,16 @@ export declare function createStreams(store?: StreamStore, o?: StreamOptions): P
|
|
|
27
28
|
open(id: string): Promise<Writer>;
|
|
28
29
|
since(id: string, fromSeq?: number): Promise<Since>;
|
|
29
30
|
/**
|
|
30
|
-
* Live tail.
|
|
31
|
-
*
|
|
31
|
+
* Live tail. The reader is woken by the writer — on this instance through the
|
|
32
|
+
* store's own bus, and on another through the database's notification channel
|
|
33
|
+
* where the driver has one. The poll underneath is the fallback for the case
|
|
34
|
+
* where neither reached: a store that cannot notify at all, or a notification
|
|
35
|
+
* lost while a listener connection was down.
|
|
32
36
|
*/
|
|
33
37
|
tail(id: string, fromSeq?: number, opt?: {
|
|
34
38
|
pollMs?: number;
|
|
35
39
|
timeoutMs?: number;
|
|
40
|
+
signal?: AbortSignal;
|
|
36
41
|
}): AsyncGenerator<Chunk>;
|
|
37
42
|
/** Drop finished streams past their grace period. Nothing else expires them. */
|
|
38
43
|
sweep(olderThanMs?: number): Promise<number>;
|
|
@@ -40,4 +45,5 @@ export declare function createStreams(store?: StreamStore, o?: StreamOptions): P
|
|
|
40
45
|
export type Streams = Awaited<ReturnType<typeof createStreams>>;
|
|
41
46
|
export { memoryStreamStore, dbStreamStore } from './streamstore.ts';
|
|
42
47
|
export type { StreamStore } from './streamstore.ts';
|
|
48
|
+
export declare const streamsOf: (adapter: Adapter) => Promise<Streams>;
|
|
43
49
|
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/stream.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/stream.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,KAAK,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAClD,MAAM,MAAM,KAAK,GAAG;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC,CAAA;AASD,wBAAsB,aAAa,CAAC,KAAK,GAAE,WAAiC,EAAE,CAAC,GAAE,aAAkB;;aAYhF,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cA0CvB,MAAM,qBAAgB,OAAO,CAAC,KAAK,CAAC;IAKpD;;;;;;OAMG;aAEG,MAAM,0BAEL;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACjE,cAAc,CAAC,KAAK,CAAC;IAgDxB,gFAAgF;iCACxC,OAAO,CAAC,MAAM,CAAC;GAK1D;AAED,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAgBnD,eAAO,MAAM,SAAS,YAAa,OAAO,KAAG,OAAO,CAAC,OAAO,CAO3D,CAAA"}
|
package/dist/server/stream.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
//
|
|
8
8
|
// Chunks are also batched: "resumable" means a reader never sees a gap or a
|
|
9
9
|
// duplicate, not that every token is its own transaction.
|
|
10
|
-
import { memoryStreamStore } from './streamstore.js';
|
|
10
|
+
import { dbStreamStore, memoryStreamStore } from './streamstore.js';
|
|
11
11
|
const expand = (r) => ({
|
|
12
12
|
chunks: r.batches.flatMap((b) => b.chunks.map((data, i) => ({ seq: b.seq + i / 1000, data }))),
|
|
13
13
|
done: r.done,
|
|
@@ -68,11 +68,21 @@ export async function createStreams(store = memoryStreamStore(), o = {}) {
|
|
|
68
68
|
return expand(await store.since(id, Math.floor(fromSeq)));
|
|
69
69
|
},
|
|
70
70
|
/**
|
|
71
|
-
* Live tail.
|
|
72
|
-
*
|
|
71
|
+
* Live tail. The reader is woken by the writer — on this instance through the
|
|
72
|
+
* store's own bus, and on another through the database's notification channel
|
|
73
|
+
* where the driver has one. The poll underneath is the fallback for the case
|
|
74
|
+
* where neither reached: a store that cannot notify at all, or a notification
|
|
75
|
+
* lost while a listener connection was down.
|
|
73
76
|
*/
|
|
74
77
|
async *tail(id, fromSeq = 0, opt = {}) {
|
|
75
|
-
|
|
78
|
+
// How long to wait before reading again when nobody has said anything.
|
|
79
|
+
//
|
|
80
|
+
// A store that can reach every writer wakes this loop the moment a chunk
|
|
81
|
+
// lands, so the read is a safety net for a missed notification rather than
|
|
82
|
+
// the way news arrives. One that cannot — SQLite, where the database has no
|
|
83
|
+
// way to tell another process — keeps the tight poll, because there the
|
|
84
|
+
// read *is* the mechanism.
|
|
85
|
+
const pollMs = opt.pollMs ?? (store.notifies ? 5_000 : 250);
|
|
76
86
|
const timeoutMs = opt.timeoutMs ?? 30_000;
|
|
77
87
|
await ensure();
|
|
78
88
|
let cursor = Math.floor(fromSeq);
|
|
@@ -81,8 +91,16 @@ export async function createStreams(store = memoryStreamStore(), o = {}) {
|
|
|
81
91
|
const unsubscribe = store.subscribe(id, () => {
|
|
82
92
|
wake?.();
|
|
83
93
|
});
|
|
94
|
+
// A reader that has gone away must stop this loop where it is sleeping, not
|
|
95
|
+
// at the next thing it would have read. The wait can be seconds long now
|
|
96
|
+
// that a notification is what usually ends it, and a read taken after the
|
|
97
|
+
// caller has finished is a read against a database that may be closing.
|
|
98
|
+
const abort = () => wake?.();
|
|
99
|
+
opt.signal?.addEventListener('abort', abort);
|
|
84
100
|
try {
|
|
85
101
|
for (;;) {
|
|
102
|
+
if (opt.signal?.aborted)
|
|
103
|
+
return;
|
|
86
104
|
const s = expand(await store.since(id, cursor));
|
|
87
105
|
if (s.chunks.length)
|
|
88
106
|
cursor = Math.floor(s.chunks[s.chunks.length - 1].seq) + 1;
|
|
@@ -103,6 +121,7 @@ export async function createStreams(store = memoryStreamStore(), o = {}) {
|
|
|
103
121
|
}
|
|
104
122
|
}
|
|
105
123
|
finally {
|
|
124
|
+
opt.signal?.removeEventListener('abort', abort);
|
|
106
125
|
unsubscribe();
|
|
107
126
|
}
|
|
108
127
|
},
|
|
@@ -114,4 +133,25 @@ export async function createStreams(store = memoryStreamStore(), o = {}) {
|
|
|
114
133
|
};
|
|
115
134
|
}
|
|
116
135
|
export { memoryStreamStore, dbStreamStore } from './streamstore.js';
|
|
136
|
+
/**
|
|
137
|
+
* The streams of one database, made once.
|
|
138
|
+
*
|
|
139
|
+
* A stream is about something that lives in a database, so it belongs in that
|
|
140
|
+
* database. Saying so here rather than at each call site is what lets a job in a
|
|
141
|
+
* worker and a reader in a web process meet: given the same tenant adapter they
|
|
142
|
+
* are handed the same `Streams`, which is also what makes the in-process bus
|
|
143
|
+
* work between them when they do share a process.
|
|
144
|
+
*
|
|
145
|
+
* Keyed weakly, because the pool owns the adapter's life and a closed tenant
|
|
146
|
+
* should take its streams with it rather than pin them.
|
|
147
|
+
*/
|
|
148
|
+
const streamsByAdapter = new WeakMap();
|
|
149
|
+
export const streamsOf = (adapter) => {
|
|
150
|
+
let held = streamsByAdapter.get(adapter);
|
|
151
|
+
if (!held) {
|
|
152
|
+
held = createStreams(dbStreamStore(adapter));
|
|
153
|
+
streamsByAdapter.set(adapter, held);
|
|
154
|
+
}
|
|
155
|
+
return held;
|
|
156
|
+
};
|
|
117
157
|
//# sourceMappingURL=stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/stream.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,EAAE;AACF,mFAAmF;AACnF,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,EAAE;AACF,4EAA4E;AAC5E,0DAA0D;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,16 @@ export type StreamStore = {
|
|
|
18
18
|
/** Highest batch sequence written, recovered once when a writer opens. */
|
|
19
19
|
head(topic: string): Promise<number>;
|
|
20
20
|
subscribe(topic: string, cb: () => void): () => void;
|
|
21
|
+
/**
|
|
22
|
+
* Whether `subscribe` reaches every writer this deployment has.
|
|
23
|
+
*
|
|
24
|
+
* A reader polls because it cannot be told. When the store can tell it, the
|
|
25
|
+
* poll stops being the mechanism and becomes the safety net, and `tail` may
|
|
26
|
+
* wait far longer between reads. False — or absent — keeps the tight poll,
|
|
27
|
+
* which is what a store whose notifications end at the process boundary
|
|
28
|
+
* needs.
|
|
29
|
+
*/
|
|
30
|
+
readonly notifies?: boolean;
|
|
21
31
|
/** Delete finished streams older than the grace period. Returns rows removed. */
|
|
22
32
|
sweep(olderThanMs: number): Promise<number>;
|
|
23
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamstore.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/streamstore.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,KAAK,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAAA;AACtD,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhG,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3D,0EAA0E;IAC1E,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACpC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IACpD,iFAAiF;IACjF,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5C,CAAA;
|
|
1
|
+
{"version":3,"file":"streamstore.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/streamstore.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,KAAK,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAAA;AACtD,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhG,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3D,0EAA0E;IAC1E,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACpC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IACpD;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,iFAAiF;IACjF,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5C,CAAA;AAoBD,wBAAgB,iBAAiB,IAAI,WAAW,CAoD/C;AAED,eAAO,MAAM,UAAU,8VAWtB,CAAA;AAaD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAAG,WAAW,CA8H3F"}
|
|
@@ -21,6 +21,11 @@ class Notifier {
|
|
|
21
21
|
notify(topic) {
|
|
22
22
|
this.bus.emit(topic);
|
|
23
23
|
}
|
|
24
|
+
/** Wake everyone, for the moment when what was missed is not known. */
|
|
25
|
+
notifyEveryone() {
|
|
26
|
+
for (const topic of this.bus.eventNames())
|
|
27
|
+
this.bus.emit(topic);
|
|
28
|
+
}
|
|
24
29
|
}
|
|
25
30
|
export function memoryStreamStore() {
|
|
26
31
|
const topics = new Map();
|
|
@@ -58,6 +63,8 @@ export function memoryStreamStore() {
|
|
|
58
63
|
return s.batches.length ? s.batches[s.batches.length - 1].seq + 1 : 0;
|
|
59
64
|
},
|
|
60
65
|
subscribe: (t, cb) => notifier.subscribe(t, cb),
|
|
66
|
+
// One process holds the whole store, so the local bus is every writer there is.
|
|
67
|
+
notifies: true,
|
|
61
68
|
async sweep(olderThanMs) {
|
|
62
69
|
const cutoff = Date.now() - olderThanMs;
|
|
63
70
|
let n = 0;
|
|
@@ -82,11 +89,56 @@ CREATE TABLE IF NOT EXISTS ket_stream (
|
|
|
82
89
|
);
|
|
83
90
|
CREATE INDEX IF NOT EXISTS ket_stream_ended ON ket_stream (ended, created_at);
|
|
84
91
|
`;
|
|
92
|
+
/**
|
|
93
|
+
* The channel every stream notification travels on, with the topic as payload.
|
|
94
|
+
*
|
|
95
|
+
* One channel rather than one per topic, because a topic is chosen by the
|
|
96
|
+
* application and a PostgreSQL channel is an identifier: sixty-three bytes, and
|
|
97
|
+
* quoting rules a caller should not have to know. A payload has neither limit
|
|
98
|
+
* that matters here. The cost is that each process wakes for every stream and
|
|
99
|
+
* filters, which is the right trade while streams are counted in tens.
|
|
100
|
+
*/
|
|
101
|
+
const STREAM_CHANNEL = 'ket_stream';
|
|
85
102
|
export function dbStreamStore(adapter, o = {}) {
|
|
86
103
|
const now = o.now ?? (() => new Date().toISOString());
|
|
87
104
|
const pg = adapter.name === 'postgres';
|
|
88
105
|
const p = (n) => (pg ? `$${n}` : '?');
|
|
89
106
|
const notifier = new Notifier();
|
|
107
|
+
const notifications = adapter.notifications;
|
|
108
|
+
/**
|
|
109
|
+
* Tell the other processes, and let the database decide when.
|
|
110
|
+
*
|
|
111
|
+
* A job runs in a worker; the reader tailing it is in a web process. The local
|
|
112
|
+
* bus never crosses that boundary, which is why a reader used to find out only
|
|
113
|
+
* on its next poll. Inside a transaction the database holds the notification
|
|
114
|
+
* until commit, so a reader is never woken to read a row that is not there yet.
|
|
115
|
+
*/
|
|
116
|
+
const announce = (topic) => {
|
|
117
|
+
notifier.notify(topic);
|
|
118
|
+
// A failed announcement is not a failed write: the poll is still underneath,
|
|
119
|
+
// so the reader is late rather than wrong. Throwing here would fail the
|
|
120
|
+
// append instead.
|
|
121
|
+
void notifications?.publish(STREAM_CHANNEL, topic).catch(() => { });
|
|
122
|
+
};
|
|
123
|
+
// Listening costs a connection, so it is opened by the first reader and never
|
|
124
|
+
// by a process that only writes.
|
|
125
|
+
let listening = null;
|
|
126
|
+
const listen = () => {
|
|
127
|
+
if (!notifications?.subscribe)
|
|
128
|
+
return Promise.resolve();
|
|
129
|
+
return (listening ??= notifications
|
|
130
|
+
.subscribe(STREAM_CHANNEL, (topic) => notifier.notify(topic),
|
|
131
|
+
// Also called after the driver reconnects its listener. Whatever was
|
|
132
|
+
// announced while the connection was down is gone, and which topics
|
|
133
|
+
// those were is not knowable, so every reader reads once.
|
|
134
|
+
() => notifier.notifyEveryone())
|
|
135
|
+
.then(() => undefined)
|
|
136
|
+
.catch(() => {
|
|
137
|
+
// The poll remains. Clearing the promise lets a later reader try again
|
|
138
|
+
// rather than leaving the process permanently deaf after one bad moment.
|
|
139
|
+
listening = null;
|
|
140
|
+
}));
|
|
141
|
+
};
|
|
90
142
|
return {
|
|
91
143
|
name: `db:${adapter.name}`,
|
|
92
144
|
async init() {
|
|
@@ -94,18 +146,26 @@ export function dbStreamStore(adapter, o = {}) {
|
|
|
94
146
|
},
|
|
95
147
|
async append(topic, seq, chunks) {
|
|
96
148
|
await adapter.run(`INSERT INTO ket_stream (topic, seq, chunks, created_at) VALUES (${p(1)}, ${p(2)}, ${p(3)}, ${p(4)})`, [topic, seq, JSON.stringify(chunks), now()]);
|
|
97
|
-
|
|
149
|
+
announce(topic);
|
|
98
150
|
},
|
|
99
151
|
async markEnd(topic, seq, summary) {
|
|
100
152
|
await adapter.run(`INSERT INTO ket_stream (topic, seq, chunks, ended, summary, created_at) VALUES (${p(1)}, ${p(2)}, ${p(3)}, 1, ${p(4)}, ${p(5)})`, [topic, seq, '[]', summary == null ? null : JSON.stringify(summary), now()]);
|
|
101
|
-
|
|
153
|
+
announce(topic);
|
|
102
154
|
},
|
|
103
|
-
// One query,
|
|
155
|
+
// One query, and only the rows the reader has not seen.
|
|
156
|
+
//
|
|
157
|
+
// It used to read the whole topic and drop the old rows in JavaScript, which
|
|
158
|
+
// a tail pays for on every pass: a stream that has written a thousand chunks
|
|
159
|
+
// re-read and re-parsed all thousand to learn there was nothing new. The end
|
|
160
|
+
// marker is exempt from the cursor because `done` and the summary live on it,
|
|
161
|
+
// and a reader that resumes past it still has to be told the stream is over.
|
|
104
162
|
async since(topic, fromSeq) {
|
|
105
|
-
const rows = await adapter.all(`SELECT seq, chunks, ended, summary FROM ket_stream WHERE topic = ${p(1)} ORDER BY seq`, [topic]);
|
|
163
|
+
const rows = await adapter.all(`SELECT seq, chunks, ended, summary FROM ket_stream WHERE topic = ${p(1)} AND (seq >= ${p(2)} OR ended = 1) ORDER BY seq`, [topic, fromSeq]);
|
|
106
164
|
let done = false;
|
|
107
165
|
let summary = null;
|
|
108
|
-
|
|
166
|
+
// The cursor is the floor: with the older rows no longer read, "nothing
|
|
167
|
+
// newer than where you already are" has to resume where the reader is.
|
|
168
|
+
let head = fromSeq;
|
|
109
169
|
const batches = [];
|
|
110
170
|
for (const r of rows) {
|
|
111
171
|
const seq = Number(r.seq);
|
|
@@ -124,7 +184,13 @@ export function dbStreamStore(adapter, o = {}) {
|
|
|
124
184
|
const r = await adapter.all(`SELECT COALESCE(MAX(seq), -1) AS m FROM ket_stream WHERE topic = ${p(1)}`, [topic]);
|
|
125
185
|
return Number(r[0].m) + 1;
|
|
126
186
|
},
|
|
127
|
-
subscribe
|
|
187
|
+
subscribe(t, cb) {
|
|
188
|
+
void listen();
|
|
189
|
+
return notifier.subscribe(t, cb);
|
|
190
|
+
},
|
|
191
|
+
// Only when the database can carry a notification to the other processes.
|
|
192
|
+
// SQLite cannot, and a reader there keeps the tight poll it has always had.
|
|
193
|
+
notifies: Boolean(notifications?.subscribe),
|
|
128
194
|
async sweep(olderThanMs) {
|
|
129
195
|
const cutoff = new Date(Date.now() - olderThanMs).toISOString();
|
|
130
196
|
const ended = await adapter.all(`SELECT topic FROM ket_stream WHERE ended = 1 AND created_at <= ${p(1)}`, [cutoff]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamstore.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/streamstore.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,wEAAwE;AACxE,kFAAkF;AAClF,mFAAmF;AACnF,qFAAqF;AACrF,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,qFAAqF;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"streamstore.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/streamstore.ts"],"names":[],"mappings":"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"}
|
package/dist/server/tenants.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { AdapterPool } from '../data/pool.ts';
|
|
2
|
-
import type { AppRegistry } from '../kernel/apps.ts';
|
|
3
2
|
import type { Adapter, Manifest } from '../types.ts';
|
|
4
3
|
import type { ThemeRuntime } from '../theme/render.ts';
|
|
5
4
|
import type { Sessions } from './session.ts';
|
|
@@ -13,8 +12,16 @@ export type TenantSpec = {
|
|
|
13
12
|
* tenant is how one customer's request quietly reads another's data.
|
|
14
13
|
*/
|
|
15
14
|
resolve: (url: URL, req: IncomingMessage) => string | null;
|
|
16
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Create a fresh adapter for one tenant. The pool owns open/close; do not hand
|
|
17
|
+
* back an adapter object that a prior pool entry already closed.
|
|
18
|
+
*/
|
|
17
19
|
open: (key: string, config: RuntimeConfig) => Adapter | Promise<Adapter>;
|
|
20
|
+
/**
|
|
21
|
+
* Check that a tenant datastore already exists without creating or opening it.
|
|
22
|
+
* Required by read-only fleet inspection commands such as `ket schema verify`.
|
|
23
|
+
*/
|
|
24
|
+
exists?: (key: string, config: RuntimeConfig) => boolean | Promise<boolean>;
|
|
18
25
|
/**
|
|
19
26
|
* Every tenant this deployment serves. Needed to migrate the fleet, and to fail
|
|
20
27
|
* at boot rather than at 3am if one of them cannot be opened.
|
|
@@ -24,19 +31,18 @@ export type TenantSpec = {
|
|
|
24
31
|
max?: number;
|
|
25
32
|
idleMs?: number;
|
|
26
33
|
};
|
|
27
|
-
/** What a request resolves to: its database
|
|
34
|
+
/** What a request resolves to: its database and the deployment manifest. */
|
|
28
35
|
export type Tenant = {
|
|
29
36
|
key: string;
|
|
30
37
|
adapter: Adapter;
|
|
31
|
-
apps: AppRegistry;
|
|
32
38
|
live: Manifest;
|
|
33
|
-
/** Compiled against
|
|
39
|
+
/** Compiled against the deployment manifest and cached per tenant. */
|
|
34
40
|
theme: ThemeRuntime | null;
|
|
35
41
|
/**
|
|
36
42
|
* Extension points for one locale.
|
|
37
43
|
*
|
|
38
44
|
* KTL binds its `_` filter when it compiles, so a runtime is per language as
|
|
39
|
-
* well as per
|
|
45
|
+
* well as per tenant — one bound to the deployment default made every
|
|
40
46
|
* fill answer in that language while the page around it answered in the
|
|
41
47
|
* reader's, which is what a sidebar entry in the wrong language looks like.
|
|
42
48
|
*/
|
|
@@ -44,11 +50,11 @@ export type Tenant = {
|
|
|
44
50
|
/**
|
|
45
51
|
* Whose logins these are.
|
|
46
52
|
*
|
|
47
|
-
* Per tenant when the tenant is known before the cookie is read —
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
53
|
+
* Per tenant when the tenant is known before the cookie is read — for example
|
|
54
|
+
* from a subdomain, a trusted gateway assertion, or an explicit path/header.
|
|
55
|
+
* Deployments whose tenants share one domain may supply a shared identity store,
|
|
56
|
+
* but each record remains tenant-bound; a session is never allowed to select a
|
|
57
|
+
* different datastore by itself.
|
|
52
58
|
*/
|
|
53
59
|
sessions: Sessions | null;
|
|
54
60
|
};
|
|
@@ -71,23 +77,20 @@ export declare function createTenants(o: {
|
|
|
71
77
|
spec: TenantSpec;
|
|
72
78
|
pool: AdapterPool;
|
|
73
79
|
manifest: Manifest;
|
|
74
|
-
autoInstall: boolean;
|
|
75
80
|
/**
|
|
76
81
|
* Run once per datastore, before anything reads it — this is where the schema
|
|
77
82
|
* arrives. A tenant database nobody migrated is a tenant with no tables, and
|
|
78
83
|
* every query against it fails in a way that looks like a bug in the query.
|
|
79
84
|
*/
|
|
80
85
|
prepare?: (key: string, adapter: Adapter) => Promise<void>;
|
|
81
|
-
/** Run once, after the registry exists: the bootstrap set for a new tenant. */
|
|
82
|
-
onFirstTouch?: (key: string, apps: AppRegistry, adapter: Adapter) => Promise<void>;
|
|
83
86
|
/**
|
|
84
|
-
* Compiles the theme for one tenant
|
|
87
|
+
* Compiles the theme for one tenant. Cached, because compiling
|
|
85
88
|
* every template on every request would be the most expensive thing here.
|
|
86
89
|
*/
|
|
87
90
|
theme?: (live: Manifest) => ThemeRuntime;
|
|
88
91
|
joints: (live: Manifest, locale: string) => Joints;
|
|
89
|
-
/** Built
|
|
90
|
-
sessions?: (adapter: Adapter) => Promise<Sessions>;
|
|
92
|
+
/** Built against the current adapter; the returned facade reacquires a lease per operation. */
|
|
93
|
+
sessions?: (adapter: Adapter, key: string) => Promise<Sessions>;
|
|
91
94
|
}): Tenants;
|
|
92
95
|
/**
|
|
93
96
|
* One datastore, expressed as the same interface.
|
|
@@ -99,7 +102,6 @@ export declare function createTenants(o: {
|
|
|
99
102
|
*/
|
|
100
103
|
export declare function singleTenant(o: {
|
|
101
104
|
adapter: Adapter;
|
|
102
|
-
apps: AppRegistry;
|
|
103
105
|
manifest: Manifest;
|
|
104
106
|
theme?: (live: Manifest) => ThemeRuntime;
|
|
105
107
|
joints: (live: Manifest, locale: string) => Joints;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenants.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/tenants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tenants.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/tenants.ts"],"names":[],"mappings":"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"}
|