@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.
Files changed (307) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +8 -2
  3. package/dist/agent/capabilities.d.ts +1 -3
  4. package/dist/agent/capabilities.d.ts.map +1 -1
  5. package/dist/agent/capabilities.js +10 -1
  6. package/dist/agent/capabilities.js.map +1 -1
  7. package/dist/agent/permissions.d.ts +43 -1
  8. package/dist/agent/permissions.d.ts.map +1 -1
  9. package/dist/agent/permissions.js +50 -2
  10. package/dist/agent/permissions.js.map +1 -1
  11. package/dist/cli.js +246 -97
  12. package/dist/cli.js.map +1 -1
  13. package/dist/codegen/dts.d.ts.map +1 -1
  14. package/dist/codegen/dts.js +1 -0
  15. package/dist/codegen/dts.js.map +1 -1
  16. package/dist/data/changeset.d.ts +12 -0
  17. package/dist/data/changeset.d.ts.map +1 -1
  18. package/dist/data/changeset.js +73 -17
  19. package/dist/data/changeset.js.map +1 -1
  20. package/dist/data/expr.d.ts +25 -1
  21. package/dist/data/expr.d.ts.map +1 -1
  22. package/dist/data/expr.js +47 -6
  23. package/dist/data/expr.js.map +1 -1
  24. package/dist/data/fleet.d.ts +41 -1
  25. package/dist/data/fleet.d.ts.map +1 -1
  26. package/dist/data/fleet.js +100 -11
  27. package/dist/data/fleet.js.map +1 -1
  28. package/dist/data/migrate.d.ts +20 -0
  29. package/dist/data/migrate.d.ts.map +1 -1
  30. package/dist/data/migrate.js +86 -3
  31. package/dist/data/migrate.js.map +1 -1
  32. package/dist/data/physical.d.ts +5 -0
  33. package/dist/data/physical.d.ts.map +1 -0
  34. package/dist/data/physical.js +196 -0
  35. package/dist/data/physical.js.map +1 -0
  36. package/dist/data/pool.d.ts +2 -1
  37. package/dist/data/pool.d.ts.map +1 -1
  38. package/dist/data/pool.js +159 -31
  39. package/dist/data/pool.js.map +1 -1
  40. package/dist/data/query.d.ts +10 -1
  41. package/dist/data/query.d.ts.map +1 -1
  42. package/dist/data/query.js +136 -27
  43. package/dist/data/query.js.map +1 -1
  44. package/dist/data/sqlite.d.ts.map +1 -1
  45. package/dist/data/sqlite.js +350 -52
  46. package/dist/data/sqlite.js.map +1 -1
  47. package/dist/data/time.d.ts +13 -0
  48. package/dist/data/time.d.ts.map +1 -1
  49. package/dist/data/time.js +61 -17
  50. package/dist/data/time.js.map +1 -1
  51. package/dist/index.d.ts +45 -24
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +34 -18
  54. package/dist/index.js.map +1 -1
  55. package/dist/kernel/audit.d.ts +27 -0
  56. package/dist/kernel/audit.d.ts.map +1 -0
  57. package/dist/kernel/audit.js +67 -0
  58. package/dist/kernel/audit.js.map +1 -0
  59. package/dist/kernel/classification.d.ts +26 -0
  60. package/dist/kernel/classification.d.ts.map +1 -0
  61. package/dist/kernel/classification.js +73 -0
  62. package/dist/kernel/classification.js.map +1 -0
  63. package/dist/kernel/compose.d.ts +6 -2
  64. package/dist/kernel/compose.d.ts.map +1 -1
  65. package/dist/kernel/compose.js +269 -15
  66. package/dist/kernel/compose.js.map +1 -1
  67. package/dist/kernel/define.d.ts +2 -3
  68. package/dist/kernel/define.d.ts.map +1 -1
  69. package/dist/kernel/define.js +22 -12
  70. package/dist/kernel/define.js.map +1 -1
  71. package/dist/kernel/diff.d.ts.map +1 -1
  72. package/dist/kernel/diff.js +28 -4
  73. package/dist/kernel/diff.js.map +1 -1
  74. package/dist/kernel/graph.js +1 -1
  75. package/dist/kernel/graph.js.map +1 -1
  76. package/dist/kernel/i18n.d.ts +10 -1
  77. package/dist/kernel/i18n.d.ts.map +1 -1
  78. package/dist/kernel/i18n.js +34 -1
  79. package/dist/kernel/i18n.js.map +1 -1
  80. package/dist/kernel/layout.d.ts +97 -0
  81. package/dist/kernel/layout.d.ts.map +1 -1
  82. package/dist/kernel/layout.js +294 -12
  83. package/dist/kernel/layout.js.map +1 -1
  84. package/dist/kernel/menu.d.ts +33 -2
  85. package/dist/kernel/menu.d.ts.map +1 -1
  86. package/dist/kernel/menu.js +99 -7
  87. package/dist/kernel/menu.js.map +1 -1
  88. package/dist/kernel/modules.d.ts +3 -3
  89. package/dist/kernel/modules.d.ts.map +1 -1
  90. package/dist/kernel/modules.js +21 -21
  91. package/dist/kernel/modules.js.map +1 -1
  92. package/dist/kernel/permissions.d.ts +10 -0
  93. package/dist/kernel/permissions.d.ts.map +1 -0
  94. package/dist/kernel/permissions.js +365 -0
  95. package/dist/kernel/permissions.js.map +1 -0
  96. package/dist/kernel/schedule.d.ts +23 -0
  97. package/dist/kernel/schedule.d.ts.map +1 -0
  98. package/dist/kernel/schedule.js +83 -0
  99. package/dist/kernel/schedule.js.map +1 -0
  100. package/dist/kernel/types.d.ts.map +1 -1
  101. package/dist/kernel/types.js +5 -4
  102. package/dist/kernel/types.js.map +1 -1
  103. package/dist/kernel/workspace.d.ts +92 -14
  104. package/dist/kernel/workspace.d.ts.map +1 -1
  105. package/dist/kernel/workspace.js +128 -49
  106. package/dist/kernel/workspace.js.map +1 -1
  107. package/dist/pdf/assets/Inter-Bold.ttf +0 -0
  108. package/dist/pdf/assets/Inter-Regular.ttf +0 -0
  109. package/dist/pdf/assets/Inter-SemiBold.ttf +0 -0
  110. package/dist/pdf/assets/LICENSE.txt +92 -0
  111. package/dist/pdf/font.d.ts +10 -0
  112. package/dist/pdf/font.d.ts.map +1 -0
  113. package/dist/pdf/font.js +83 -0
  114. package/dist/pdf/font.js.map +1 -0
  115. package/dist/pdf/image.d.ts +8 -0
  116. package/dist/pdf/image.d.ts.map +1 -0
  117. package/dist/pdf/image.js +94 -0
  118. package/dist/pdf/image.js.map +1 -0
  119. package/dist/pdf/index.d.ts +15 -0
  120. package/dist/pdf/index.d.ts.map +1 -0
  121. package/dist/pdf/index.js +17 -0
  122. package/dist/pdf/index.js.map +1 -0
  123. package/dist/pdf/markup.d.ts +19 -0
  124. package/dist/pdf/markup.d.ts.map +1 -0
  125. package/dist/pdf/markup.js +146 -0
  126. package/dist/pdf/markup.js.map +1 -0
  127. package/dist/pdf/render.d.ts +14 -0
  128. package/dist/pdf/render.d.ts.map +1 -0
  129. package/dist/pdf/render.js +387 -0
  130. package/dist/pdf/render.js.map +1 -0
  131. package/dist/scaffold/index.js +6 -6
  132. package/dist/scaffold/index.js.map +1 -1
  133. package/dist/scaffold/templates/{app.test.ts.tmpl → deployment.test.ts.tmpl} +3 -3
  134. package/dist/scaffold/templates/ket.workspace.ts.tmpl +4 -6
  135. package/dist/scaffold/templates/module.ts.tmpl +1 -4
  136. package/dist/server/assets.d.ts +23 -0
  137. package/dist/server/assets.d.ts.map +1 -0
  138. package/dist/server/assets.js +97 -0
  139. package/dist/server/assets.js.map +1 -0
  140. package/dist/server/boot.d.ts +174 -38
  141. package/dist/server/boot.d.ts.map +1 -1
  142. package/dist/server/boot.js +399 -140
  143. package/dist/server/boot.js.map +1 -1
  144. package/dist/server/config.d.ts +30 -10
  145. package/dist/server/config.d.ts.map +1 -1
  146. package/dist/server/config.js +73 -17
  147. package/dist/server/config.js.map +1 -1
  148. package/dist/server/ctx.d.ts +10 -0
  149. package/dist/server/ctx.d.ts.map +1 -1
  150. package/dist/server/ctx.js +284 -48
  151. package/dist/server/ctx.js.map +1 -1
  152. package/dist/server/development.d.ts +10 -0
  153. package/dist/server/development.d.ts.map +1 -0
  154. package/dist/server/development.js +15 -0
  155. package/dist/server/development.js.map +1 -0
  156. package/dist/server/fn.d.ts +22 -3
  157. package/dist/server/fn.d.ts.map +1 -1
  158. package/dist/server/fn.js +116 -32
  159. package/dist/server/fn.js.map +1 -1
  160. package/dist/server/form.d.ts +33 -0
  161. package/dist/server/form.d.ts.map +1 -0
  162. package/dist/server/form.js +47 -0
  163. package/dist/server/form.js.map +1 -0
  164. package/dist/server/http.d.ts +82 -3
  165. package/dist/server/http.d.ts.map +1 -1
  166. package/dist/server/http.js +373 -37
  167. package/dist/server/http.js.map +1 -1
  168. package/dist/server/idem.d.ts +3 -2
  169. package/dist/server/idem.d.ts.map +1 -1
  170. package/dist/server/idem.js +12 -4
  171. package/dist/server/idem.js.map +1 -1
  172. package/dist/server/jobs.js +1 -1
  173. package/dist/server/jobs.js.map +1 -1
  174. package/dist/server/log/combinators.d.ts +42 -0
  175. package/dist/server/log/combinators.d.ts.map +1 -0
  176. package/dist/server/log/combinators.js +270 -0
  177. package/dist/server/log/combinators.js.map +1 -0
  178. package/dist/server/log/console.d.ts +12 -0
  179. package/dist/server/log/console.d.ts.map +1 -0
  180. package/dist/server/log/console.js +96 -0
  181. package/dist/server/log/console.js.map +1 -0
  182. package/dist/server/log/file.d.ts +11 -0
  183. package/dist/server/log/file.d.ts.map +1 -0
  184. package/dist/server/log/file.js +61 -0
  185. package/dist/server/log/file.js.map +1 -0
  186. package/dist/server/log/index.d.ts +23 -0
  187. package/dist/server/log/index.d.ts.map +1 -0
  188. package/dist/server/log/index.js +45 -0
  189. package/dist/server/log/index.js.map +1 -0
  190. package/dist/server/log/logger.d.ts +53 -0
  191. package/dist/server/log/logger.d.ts.map +1 -0
  192. package/dist/server/log/logger.js +94 -0
  193. package/dist/server/log/logger.js.map +1 -0
  194. package/dist/server/log/memory.d.ts +11 -0
  195. package/dist/server/log/memory.d.ts.map +1 -0
  196. package/dist/server/log/memory.js +25 -0
  197. package/dist/server/log/memory.js.map +1 -0
  198. package/dist/server/log/types.d.ts +112 -0
  199. package/dist/server/log/types.d.ts.map +1 -0
  200. package/dist/server/log/types.js +58 -0
  201. package/dist/server/log/types.js.map +1 -0
  202. package/dist/server/policy.d.ts +29 -0
  203. package/dist/server/policy.d.ts.map +1 -0
  204. package/dist/server/policy.js +29 -0
  205. package/dist/server/policy.js.map +1 -0
  206. package/dist/server/queue.d.ts +1 -1
  207. package/dist/server/queue.d.ts.map +1 -1
  208. package/dist/server/queue.js.map +1 -1
  209. package/dist/server/ratelimit.d.ts +48 -0
  210. package/dist/server/ratelimit.d.ts.map +1 -0
  211. package/dist/server/ratelimit.js +102 -0
  212. package/dist/server/ratelimit.js.map +1 -0
  213. package/dist/server/respond.d.ts.map +1 -1
  214. package/dist/server/respond.js +16 -1
  215. package/dist/server/respond.js.map +1 -1
  216. package/dist/server/runtime.d.ts +18 -3
  217. package/dist/server/runtime.d.ts.map +1 -1
  218. package/dist/server/runtime.js +32 -2
  219. package/dist/server/runtime.js.map +1 -1
  220. package/dist/server/schedule.d.ts +18 -0
  221. package/dist/server/schedule.d.ts.map +1 -0
  222. package/dist/server/schedule.js +70 -0
  223. package/dist/server/schedule.js.map +1 -0
  224. package/dist/server/sequence.d.ts +42 -0
  225. package/dist/server/sequence.d.ts.map +1 -0
  226. package/dist/server/sequence.js +97 -0
  227. package/dist/server/sequence.js.map +1 -0
  228. package/dist/server/session.d.ts +21 -0
  229. package/dist/server/session.d.ts.map +1 -1
  230. package/dist/server/session.js +84 -10
  231. package/dist/server/session.js.map +1 -1
  232. package/dist/server/sessionstore.d.ts +3 -1
  233. package/dist/server/sessionstore.d.ts.map +1 -1
  234. package/dist/server/sessionstore.js +7 -3
  235. package/dist/server/sessionstore.js.map +1 -1
  236. package/dist/server/storage/index.d.ts +1 -1
  237. package/dist/server/storage/index.d.ts.map +1 -1
  238. package/dist/server/storage/index.js +61 -1
  239. package/dist/server/storage/index.js.map +1 -1
  240. package/dist/server/storage/types.d.ts +8 -0
  241. package/dist/server/storage/types.d.ts.map +1 -1
  242. package/dist/server/storage/types.js +58 -0
  243. package/dist/server/storage/types.js.map +1 -1
  244. package/dist/server/stream.d.ts +8 -2
  245. package/dist/server/stream.d.ts.map +1 -1
  246. package/dist/server/stream.js +44 -4
  247. package/dist/server/stream.js.map +1 -1
  248. package/dist/server/streamstore.d.ts +10 -0
  249. package/dist/server/streamstore.d.ts.map +1 -1
  250. package/dist/server/streamstore.js +72 -6
  251. package/dist/server/streamstore.js.map +1 -1
  252. package/dist/server/tenants.d.ts +20 -18
  253. package/dist/server/tenants.d.ts.map +1 -1
  254. package/dist/server/tenants.js +133 -84
  255. package/dist/server/tenants.js.map +1 -1
  256. package/dist/server/transport/types.js +2 -2
  257. package/dist/server/transport/types.js.map +1 -1
  258. package/dist/server/worker.d.ts +19 -3
  259. package/dist/server/worker.d.ts.map +1 -1
  260. package/dist/server/worker.js +168 -21
  261. package/dist/server/worker.js.map +1 -1
  262. package/dist/testing.d.ts +26 -10
  263. package/dist/testing.d.ts.map +1 -1
  264. package/dist/testing.js +41 -14
  265. package/dist/testing.js.map +1 -1
  266. package/dist/theme/contracts.d.ts +14 -1
  267. package/dist/theme/contracts.d.ts.map +1 -1
  268. package/dist/theme/contracts.js +35 -6
  269. package/dist/theme/contracts.js.map +1 -1
  270. package/dist/theme/index.d.ts +1 -1
  271. package/dist/theme/index.d.ts.map +1 -1
  272. package/dist/theme/index.js +1 -1
  273. package/dist/theme/index.js.map +1 -1
  274. package/dist/theme/joint-runtime.d.ts +33 -0
  275. package/dist/theme/joint-runtime.d.ts.map +1 -0
  276. package/dist/theme/joint-runtime.js +121 -0
  277. package/dist/theme/joint-runtime.js.map +1 -0
  278. package/dist/theme/joints.d.ts.map +1 -1
  279. package/dist/theme/joints.js +15 -97
  280. package/dist/theme/joints.js.map +1 -1
  281. package/dist/theme/ktl/compile.d.ts +4 -0
  282. package/dist/theme/ktl/compile.d.ts.map +1 -1
  283. package/dist/theme/ktl/compile.js +54 -1
  284. package/dist/theme/ktl/compile.js.map +1 -1
  285. package/dist/theme/ktl/parser.d.ts +4 -0
  286. package/dist/theme/ktl/parser.d.ts.map +1 -1
  287. package/dist/theme/ktl/parser.js +8 -0
  288. package/dist/theme/ktl/parser.js.map +1 -1
  289. package/dist/theme/render.d.ts +8 -0
  290. package/dist/theme/render.d.ts.map +1 -1
  291. package/dist/theme/render.js +88 -118
  292. package/dist/theme/render.js.map +1 -1
  293. package/dist/theme/tokens.d.ts +18 -0
  294. package/dist/theme/tokens.d.ts.map +1 -1
  295. package/dist/theme/tokens.js +33 -0
  296. package/dist/theme/tokens.js.map +1 -1
  297. package/dist/theme/viewmodel.d.ts +24 -0
  298. package/dist/theme/viewmodel.d.ts.map +1 -1
  299. package/dist/theme/viewmodel.js +75 -6
  300. package/dist/theme/viewmodel.js.map +1 -1
  301. package/dist/types.d.ts +320 -56
  302. package/dist/types.d.ts.map +1 -1
  303. package/package.json +6 -2
  304. package/dist/kernel/apps.d.ts +0 -43
  305. package/dist/kernel/apps.d.ts.map +0 -1
  306. package/dist/kernel/apps.js +0 -234
  307. 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":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/ketjs/src/server/storage/types.ts"],"names":[],"mappings":"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"}
@@ -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. A reader on the same instance is woken by the writer and never
31
- * polls; the slow poll is only a fallback for a writer on another instance.
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;AAEhE,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;;;OAGG;aAEG,MAAM,0BAEL;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3C,cAAc,CAAC,KAAK,CAAC;IAiCxB,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"}
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"}
@@ -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. A reader on the same instance is woken by the writer and never
72
- * polls; the slow poll is only a fallback for a writer on another instance.
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
- const pollMs = opt.pollMs ?? 250;
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;AAqBpD,MAAM,MAAM,GAAG,CAAC,CAAc,EAAS,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9F,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,OAAO,EAAE,CAAC,CAAC,OAAO;IAClB,OAAO,EAAE,CAAC,CAAC,OAAO;CACnB,CAAC,CAAA;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAK,GAAgB,iBAAiB,EAAE,EAAE,CAAC,GAAkB,EAAE;IACjG,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAA;IAErC,4EAA4E;IAC5E,0DAA0D;IAC1D,IAAI,MAAM,GAAyB,IAAI,CAAA;IACvC,MAAM,MAAM,GAAG,GAAkB,EAAE,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IAE7D,OAAO;QACL,KAAK;QAEL,KAAK,CAAC,IAAI,CAAC,EAAU;YACnB,MAAM,MAAM,EAAE,CAAA;YACd,4EAA4E;YAC5E,gFAAgF;YAChF,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC9B,IAAI,MAAM,GAAc,EAAE,CAAA;YAC1B,IAAI,KAAK,GAA0B,IAAI,CAAA;YACvC,IAAI,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;YAE5C,MAAM,QAAQ,GAAG,GAAkB,EAAE;gBACnC,IAAI,KAAK,EAAE,CAAC;oBACV,YAAY,CAAC,KAAK,CAAC,CAAA;oBACnB,KAAK,GAAG,IAAI,CAAA;gBACd,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,MAAM;oBAAE,OAAO,KAAK,CAAA;gBAChC,MAAM,KAAK,GAAG,MAAM,CAAA;gBACpB,MAAM,EAAE,GAAG,GAAG,EAAE,CAAA;gBAChB,MAAM,GAAG,EAAE,CAAA;gBACX,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;gBACrD,OAAO,KAAK,CAAA;YACd,CAAC,CAAA;YAED,OAAO;gBACL,EAAE;gBACF,KAAK,CAAC,KAAK;oBACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBAClB,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;wBAChC,KAAK,QAAQ,EAAE,CAAA;wBACf,OAAM;oBACR,CAAC;oBACD,KAAK,KAAK,UAAU,CAAC,GAAG,EAAE;wBACxB,KAAK,QAAQ,EAAE,CAAA;oBACjB,CAAC,EAAE,OAAO,CAAC,CAAA;gBACb,CAAC;gBACD,KAAK,EAAE,QAAQ;gBACf,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI;oBACtB,MAAM,QAAQ,EAAE,CAAA;oBAChB,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;gBACzC,CAAC;aACF,CAAA;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,EAAU,EAAE,OAAO,GAAG,CAAC;YACjC,MAAM,MAAM,EAAE,CAAA;YACd,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC3D,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,CAAC,IAAI,CACT,EAAU,EACV,OAAO,GAAG,CAAC,EACX,GAAG,GAA4C,EAAE;YAEjD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAA;YAChC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,MAAM,CAAA;YACzC,MAAM,MAAM,EAAE,CAAA;YACd,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAE1B,IAAI,IAAI,GAAwB,IAAI,CAAA;YACpC,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE;gBAC3C,IAAI,EAAE,EAAE,CAAA;YACV,CAAC,CAAC,CAAA;YACF,IAAI,CAAC;gBACH,SAAS,CAAC;oBACR,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;oBAC/C,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM;wBAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBAChF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;wBAAE,MAAM,CAAC,CAAA;oBACjC,IAAI,CAAC,CAAC,IAAI;wBAAE,OAAM;oBAClB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS;wBAClC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,qBAAqB,SAAS,IAAI,CAAC,CAAA;oBAClE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;wBAClC,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;wBACrC,IAAI,GAAG,GAAG,EAAE;4BACV,YAAY,CAAC,CAAC,CAAC,CAAA;4BACf,IAAI,GAAG,IAAI,CAAA;4BACX,OAAO,EAAE,CAAA;wBACX,CAAC,CAAA;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,WAAW,EAAE,CAAA;YACf,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,GAAG,MAAM;YACnC,MAAM,MAAM,EAAE,CAAA;YACd,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACjC,CAAC;KACF,CAAA;AACH,CAAC;AAGD,OAAO,EAAE,iBAAiB,EAAE,aAAa,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;AAgBD,wBAAgB,iBAAiB,IAAI,WAAW,CAkD/C;AAED,eAAO,MAAM,UAAU,8VAWtB,CAAA;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAAG,WAAW,CA2E3F"}
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
- notifier.notify(topic);
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
- notifier.notify(topic);
153
+ announce(topic);
102
154
  },
103
- // One query, not the three the old implementation used.
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
- let head = 0;
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: (t, cb) => notifier.subscribe(t, cb),
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":"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"}
1
+ {"version":3,"file":"streamstore.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/streamstore.ts"],"names":[],"mappings":"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"}
@@ -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
- /** Open the datastore for one tenant. The app's, because drivers are the app's. */
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, and what is switched on in it. */
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 what this tenant has installed, and cached with it. */
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 installed set — one bound to the deployment default made every
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 — which it is
48
- * when tenants arrive by subdomain, because the Host says so. An app on one
49
- * domain for every tenant cannot do that (reading the session needs the
50
- * database, knowing the database needs the session), and supplies one shared
51
- * store instead. Both are expressible; neither is assumed.
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's installed set. Cached, because compiling
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 once per tenant, against that tenant's own datastore. */
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":"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"}
1
+ {"version":3,"file":"tenants.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/tenants.ts"],"names":[],"mappings":"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"}