@brass-build/client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/AGENTS.md +255 -0
  2. package/CHANGELOG.md +15 -0
  3. package/LICENSE +21 -0
  4. package/README.md +836 -0
  5. package/dist/api-fetch.d.ts +16 -0
  6. package/dist/api-fetch.d.ts.map +1 -0
  7. package/dist/api-fetch.js +97 -0
  8. package/dist/api-fetch.js.map +1 -0
  9. package/dist/api-headers.d.ts +3 -0
  10. package/dist/api-headers.d.ts.map +1 -0
  11. package/dist/api-headers.js +25 -0
  12. package/dist/api-headers.js.map +1 -0
  13. package/dist/auth-flow.d.ts +23 -0
  14. package/dist/auth-flow.d.ts.map +1 -0
  15. package/dist/auth-flow.js +76 -0
  16. package/dist/auth-flow.js.map +1 -0
  17. package/dist/client.d.ts +106 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +1278 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/doc-url-sync.d.ts +19 -0
  22. package/dist/doc-url-sync.d.ts.map +1 -0
  23. package/dist/doc-url-sync.js +181 -0
  24. package/dist/doc-url-sync.js.map +1 -0
  25. package/dist/document-branches.d.ts +32 -0
  26. package/dist/document-branches.d.ts.map +1 -0
  27. package/dist/document-branches.js +89 -0
  28. package/dist/document-branches.js.map +1 -0
  29. package/dist/document-checkpoints.d.ts +24 -0
  30. package/dist/document-checkpoints.d.ts.map +1 -0
  31. package/dist/document-checkpoints.js +115 -0
  32. package/dist/document-checkpoints.js.map +1 -0
  33. package/dist/document-commands.d.ts +93 -0
  34. package/dist/document-commands.d.ts.map +1 -0
  35. package/dist/document-commands.js +423 -0
  36. package/dist/document-commands.js.map +1 -0
  37. package/dist/document-signals.d.ts +53 -0
  38. package/dist/document-signals.d.ts.map +1 -0
  39. package/dist/document-signals.js +114 -0
  40. package/dist/document-signals.js.map +1 -0
  41. package/dist/document-streams.d.ts +22 -0
  42. package/dist/document-streams.d.ts.map +1 -0
  43. package/dist/document-streams.js +98 -0
  44. package/dist/document-streams.js.map +1 -0
  45. package/dist/document-thumbnail-capture.d.ts +27 -0
  46. package/dist/document-thumbnail-capture.d.ts.map +1 -0
  47. package/dist/document-thumbnail-capture.js +160 -0
  48. package/dist/document-thumbnail-capture.js.map +1 -0
  49. package/dist/documents-namespace.d.ts +134 -0
  50. package/dist/documents-namespace.d.ts.map +1 -0
  51. package/dist/documents-namespace.js +190 -0
  52. package/dist/documents-namespace.js.map +1 -0
  53. package/dist/documents.d.ts +146 -0
  54. package/dist/documents.d.ts.map +1 -0
  55. package/dist/documents.js +2045 -0
  56. package/dist/documents.js.map +1 -0
  57. package/dist/emitter.d.ts +15 -0
  58. package/dist/emitter.d.ts.map +1 -0
  59. package/dist/emitter.js +90 -0
  60. package/dist/emitter.js.map +1 -0
  61. package/dist/errors.d.ts +18 -0
  62. package/dist/errors.d.ts.map +1 -0
  63. package/dist/errors.js +22 -0
  64. package/dist/errors.js.map +1 -0
  65. package/dist/export-guest.d.ts +9 -0
  66. package/dist/export-guest.d.ts.map +1 -0
  67. package/dist/export-guest.js +225 -0
  68. package/dist/export-guest.js.map +1 -0
  69. package/dist/fetch-retry.d.ts +16 -0
  70. package/dist/fetch-retry.d.ts.map +1 -0
  71. package/dist/fetch-retry.js +90 -0
  72. package/dist/fetch-retry.js.map +1 -0
  73. package/dist/guest-link.d.ts +3 -0
  74. package/dist/guest-link.d.ts.map +1 -0
  75. package/dist/guest-link.js +13 -0
  76. package/dist/guest-link.js.map +1 -0
  77. package/dist/handles.d.ts +57 -0
  78. package/dist/handles.d.ts.map +1 -0
  79. package/dist/handles.js +1375 -0
  80. package/dist/handles.js.map +1 -0
  81. package/dist/hosted-runtime.d.ts +33 -0
  82. package/dist/hosted-runtime.d.ts.map +1 -0
  83. package/dist/hosted-runtime.js +99 -0
  84. package/dist/hosted-runtime.js.map +1 -0
  85. package/dist/hosted-ui.d.ts +84 -0
  86. package/dist/hosted-ui.d.ts.map +1 -0
  87. package/dist/hosted-ui.js +673 -0
  88. package/dist/hosted-ui.js.map +1 -0
  89. package/dist/importer.d.ts +22 -0
  90. package/dist/importer.d.ts.map +1 -0
  91. package/dist/importer.js +54 -0
  92. package/dist/importer.js.map +1 -0
  93. package/dist/index.d.ts +54 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +132 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/init-keys.d.ts +3 -0
  98. package/dist/init-keys.d.ts.map +1 -0
  99. package/dist/init-keys.js +13 -0
  100. package/dist/init-keys.js.map +1 -0
  101. package/dist/internal.d.ts +6 -0
  102. package/dist/internal.d.ts.map +1 -0
  103. package/dist/internal.js +17 -0
  104. package/dist/internal.js.map +1 -0
  105. package/dist/jwt.d.ts +3 -0
  106. package/dist/jwt.d.ts.map +1 -0
  107. package/dist/jwt.js +22 -0
  108. package/dist/jwt.js.map +1 -0
  109. package/dist/launch-context.d.ts +4 -0
  110. package/dist/launch-context.d.ts.map +1 -0
  111. package/dist/launch-context.js +44 -0
  112. package/dist/launch-context.js.map +1 -0
  113. package/dist/login-hint.d.ts +4 -0
  114. package/dist/login-hint.d.ts.map +1 -0
  115. package/dist/login-hint.js +63 -0
  116. package/dist/login-hint.js.map +1 -0
  117. package/dist/mutate-batching.d.ts +14 -0
  118. package/dist/mutate-batching.d.ts.map +1 -0
  119. package/dist/mutate-batching.js +65 -0
  120. package/dist/mutate-batching.js.map +1 -0
  121. package/dist/open-document.d.ts +127 -0
  122. package/dist/open-document.d.ts.map +1 -0
  123. package/dist/open-document.js +2121 -0
  124. package/dist/open-document.js.map +1 -0
  125. package/dist/page-title.d.ts +3 -0
  126. package/dist/page-title.d.ts.map +1 -0
  127. package/dist/page-title.js +32 -0
  128. package/dist/page-title.js.map +1 -0
  129. package/dist/perf.d.ts +9 -0
  130. package/dist/perf.d.ts.map +1 -0
  131. package/dist/perf.js +39 -0
  132. package/dist/perf.js.map +1 -0
  133. package/dist/presence.d.ts +62 -0
  134. package/dist/presence.d.ts.map +1 -0
  135. package/dist/presence.js +331 -0
  136. package/dist/presence.js.map +1 -0
  137. package/dist/record-paging.d.ts +99 -0
  138. package/dist/record-paging.d.ts.map +1 -0
  139. package/dist/record-paging.js +220 -0
  140. package/dist/record-paging.js.map +1 -0
  141. package/dist/schema-conflict-dialog.d.ts +10 -0
  142. package/dist/schema-conflict-dialog.d.ts.map +1 -0
  143. package/dist/schema-conflict-dialog.js +164 -0
  144. package/dist/schema-conflict-dialog.js.map +1 -0
  145. package/dist/selection-persistence.d.ts +5 -0
  146. package/dist/selection-persistence.d.ts.map +1 -0
  147. package/dist/selection-persistence.js +90 -0
  148. package/dist/selection-persistence.js.map +1 -0
  149. package/dist/serializer.d.ts +3 -0
  150. package/dist/serializer.d.ts.map +1 -0
  151. package/dist/serializer.js +2 -0
  152. package/dist/serializer.js.map +1 -0
  153. package/dist/session-persistence.d.ts +4 -0
  154. package/dist/session-persistence.d.ts.map +1 -0
  155. package/dist/session-persistence.js +68 -0
  156. package/dist/session-persistence.js.map +1 -0
  157. package/dist/session-toolbar.d.ts +62 -0
  158. package/dist/session-toolbar.d.ts.map +1 -0
  159. package/dist/session-toolbar.js +1205 -0
  160. package/dist/session-toolbar.js.map +1 -0
  161. package/dist/session.d.ts +69 -0
  162. package/dist/session.d.ts.map +1 -0
  163. package/dist/session.js +926 -0
  164. package/dist/session.js.map +1 -0
  165. package/dist/tail-ops.d.ts +28 -0
  166. package/dist/tail-ops.d.ts.map +1 -0
  167. package/dist/tail-ops.js +46 -0
  168. package/dist/tail-ops.js.map +1 -0
  169. package/dist/topic-lifecycle.d.ts +41 -0
  170. package/dist/topic-lifecycle.d.ts.map +1 -0
  171. package/dist/topic-lifecycle.js +169 -0
  172. package/dist/topic-lifecycle.js.map +1 -0
  173. package/dist/types.d.ts +22 -0
  174. package/dist/types.d.ts.map +1 -0
  175. package/dist/types.js +2 -0
  176. package/dist/types.js.map +1 -0
  177. package/dist/undo.d.ts +18 -0
  178. package/dist/undo.d.ts.map +1 -0
  179. package/dist/undo.js +110 -0
  180. package/dist/undo.js.map +1 -0
  181. package/dist/version-bar.d.ts +22 -0
  182. package/dist/version-bar.d.ts.map +1 -0
  183. package/dist/version-bar.js +169 -0
  184. package/dist/version-bar.js.map +1 -0
  185. package/dist/version.d.ts +3 -0
  186. package/dist/version.d.ts.map +1 -0
  187. package/dist/version.js +8 -0
  188. package/dist/version.js.map +1 -0
  189. package/dist/vite.d.ts +15 -0
  190. package/dist/vite.d.ts.map +1 -0
  191. package/dist/vite.js +36 -0
  192. package/dist/vite.js.map +1 -0
  193. package/dist/ws-client.d.ts +53 -0
  194. package/dist/ws-client.d.ts.map +1 -0
  195. package/dist/ws-client.js +604 -0
  196. package/dist/ws-client.js.map +1 -0
  197. package/dist/ws-frame-limit.d.ts +21 -0
  198. package/dist/ws-frame-limit.d.ts.map +1 -0
  199. package/dist/ws-frame-limit.js +40 -0
  200. package/dist/ws-frame-limit.js.map +1 -0
  201. package/docs/app-manifest.md +65 -0
  202. package/docs/custom-chrome.md +147 -0
  203. package/docs/hosted-ui-advanced.md +77 -0
  204. package/docs/imported-documents.md +261 -0
  205. package/docs/presence.md +129 -0
  206. package/docs/schemas.md +135 -0
  207. package/docs/streams.md +248 -0
  208. package/package.json +60 -0
  209. package/scripts/prepare.mjs +50 -0
  210. package/src/api-fetch.ts +127 -0
  211. package/src/api-headers.ts +28 -0
  212. package/src/auth-flow.ts +125 -0
  213. package/src/client.ts +1457 -0
  214. package/src/doc-url-sync.ts +183 -0
  215. package/src/document-branches.ts +124 -0
  216. package/src/document-checkpoints.ts +135 -0
  217. package/src/document-commands.ts +651 -0
  218. package/src/document-signals.ts +234 -0
  219. package/src/document-streams.ts +132 -0
  220. package/src/document-thumbnail-capture.ts +191 -0
  221. package/src/documents-namespace.ts +516 -0
  222. package/src/documents.ts +2426 -0
  223. package/src/emitter.ts +129 -0
  224. package/src/errors.ts +45 -0
  225. package/src/export-guest.ts +282 -0
  226. package/src/fetch-retry.ts +119 -0
  227. package/src/guest-link.ts +14 -0
  228. package/src/handles.ts +1731 -0
  229. package/src/hosted-runtime.ts +109 -0
  230. package/src/hosted-ui.ts +1020 -0
  231. package/src/importer.ts +89 -0
  232. package/src/index.ts +267 -0
  233. package/src/init-keys.ts +15 -0
  234. package/src/internal.ts +23 -0
  235. package/src/jwt.ts +18 -0
  236. package/src/launch-context.ts +43 -0
  237. package/src/login-hint.ts +60 -0
  238. package/src/mutate-batching.ts +63 -0
  239. package/src/open-document.ts +2869 -0
  240. package/src/page-title.ts +33 -0
  241. package/src/perf.ts +46 -0
  242. package/src/presence.ts +471 -0
  243. package/src/record-paging.ts +270 -0
  244. package/src/schema-conflict-dialog.ts +176 -0
  245. package/src/selection-persistence.ts +98 -0
  246. package/src/serializer.ts +15 -0
  247. package/src/session-persistence.ts +69 -0
  248. package/src/session-toolbar.ts +1457 -0
  249. package/src/session.ts +1262 -0
  250. package/src/tail-ops.ts +63 -0
  251. package/src/topic-lifecycle.ts +217 -0
  252. package/src/types.ts +75 -0
  253. package/src/undo.ts +125 -0
  254. package/src/version-bar.ts +221 -0
  255. package/src/version.ts +8 -0
  256. package/src/vite.ts +49 -0
  257. package/src/ws-client.ts +678 -0
  258. package/src/ws-frame-limit.ts +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /** Field names inside a stored record container: `type` is the tag, `params`
2
+ * the body. Verbatim so the substrate and SDK name the same fields. */
3
+ export declare const TAG_FIELD = "type";
4
+ export declare const BODY_FIELD = "params";
5
+ /** Root container keys the record store occupies on a document. */
6
+ export declare const META_KEY = "meta";
7
+ export declare const RECORDS_KEY = "instances";
8
+ export declare const ORDER_KEY = "instance_order";
9
+ /** `meta` key holding a paged store's page count; absent (or 0) means
10
+ * unpaged. The read path detects pages by tag; only an in-place edit needs
11
+ * the count, to hash a key to its page. */
12
+ export declare const PAGE_COUNT_KEY = "page_count";
13
+ /** `meta` key holding the paging codec's scheme number, stamped on a paged
14
+ * write. The scheme fixes the page-key hash (`pageKeyFor`), the `p<n>` key
15
+ * format, and the packed-record layout together: a reader that hashes a key
16
+ * with a different scheme than the store was written under targets the wrong
17
+ * page on an in-place edit, silently writing a record into a page it does not
18
+ * belong to. The stamp lets a pinned reader detect a store written under a
19
+ * scheme it does not implement and refuse the edit instead of corrupting it.
20
+ * Absent means the current scheme (paged stores written before the stamp
21
+ * existed used scheme 1's hash and layout). */
22
+ export declare const PAGING_SCHEME_KEY = "paging_scheme";
23
+ /** The paging scheme this build writes and can edit. Bump ONLY alongside a
24
+ * change to `pageKeyFor`'s hash, the `p<n>` key format, or the packed-record
25
+ * layout, so an older pinned reader trips `isPagingSchemeEditable` and fails
26
+ * loud rather than editing a store it would mis-hash. */
27
+ export declare const CURRENT_PAGING_SCHEME = 1;
28
+ /** Whether a store stamped with `scheme` can be edited in place by this build.
29
+ * Absent / non-numeric / `0` is a scheme-1 store (the stamp postdates it), so
30
+ * editable; any scheme at or below the current one is editable; a higher
31
+ * scheme is not (this reader would hash into the wrong page). Reads stay
32
+ * best-effort and are not gated here; only an in-place edit can persist the
33
+ * mis-hash, so the edit path is where the guard belongs. */
34
+ export declare function isPagingSchemeEditable(scheme: unknown): boolean;
35
+ /** Above this many records the store is written paged; at or below it it keeps
36
+ * the one-container-per-record shape. */
37
+ export declare const UNPAGED_MAX_RECORDS = 50000;
38
+ /** The tag a page container carries in place of a record tag, so a reader
39
+ * tells a page (body = record triples) from a single record (body = one
40
+ * plain value). */
41
+ export declare const PAGE_TAG = "__page__";
42
+ /** A record packed inside a page body: `[key, tag, body]`. The tuple form
43
+ * keeps a paged snapshot compact. */
44
+ export type PackedRecord<B> = [key: string, tag: string, body: B];
45
+ /** Encode a page's triples as its stored body: JSON-serialised, gzipped, held
46
+ * as a latin1 string. A STRING body avoids loro's superlinear per-value
47
+ * conversion of a deeply nested triple array; gzipping keeps a heavy file in
48
+ * memory + export budget. (Full rationale in the substrate's `encodePageBody`.) */
49
+ export declare function encodePageBody<B>(triples: PackedRecord<B>[]): string;
50
+ /** Encode one record's `[key, tag, body]` triple as the JSON string it
51
+ * occupies inside a page body. Split from page assembly so a large write can
52
+ * stringify each record as it buckets and release the parsed body before the
53
+ * gzip loop, rather than holding the whole parsed model live through it (see
54
+ * `writeRecordStoreConsuming` for why that release keeps the encode fast). */
55
+ export declare function encodeRecordForPage<B>(key: string, tag: string, body: B): string;
56
+ /** Assemble a page body from records already JSON-encoded by
57
+ * `encodeRecordForPage`: wrap in a JSON array, gzip, hold as a latin1 string.
58
+ * Byte-identical to `encodePageBody` over the same triples, so the wire shape
59
+ * is unchanged; the split exists only so the writer frees each parsed body
60
+ * first. */
61
+ export declare function encodePageBodyFromEncoded(encoded: string[]): string;
62
+ /** Decode a page body back to its record triples. Returns [] for anything that
63
+ * does not decompress to a JSON array, so a reader tolerates a corrupt or
64
+ * stray page rather than throwing. */
65
+ export declare function decodePageBody(body: unknown): PackedRecord<unknown>[];
66
+ /** The page count for a record population: 0 (unpaged) at or below
67
+ * `UNPAGED_MAX_RECORDS`, else ~`TARGET_PAGE_SIZE` records per page, capped at
68
+ * `MAX_PAGES`. */
69
+ export declare function pageCountFor(recordCount: number): number;
70
+ /** The page key a record key lives in, for a store of `pageCount` pages. */
71
+ export declare function pageKeyFor(key: string, pageCount: number): string;
72
+ /** A stored container's tag (`type`), or null for any value not in the
73
+ * `{ type, params }` shape, so a reader skips a corrupt entry. A page carries
74
+ * `PAGE_TAG`. */
75
+ export declare function peekRecordTag(value: unknown): string | null;
76
+ /** Decode a stored container (`{ type, params }`) to its tag + raw body,
77
+ * or null when it is not in the record shape. */
78
+ export declare function decodeRecordValue(value: unknown): {
79
+ tag: string;
80
+ body: unknown;
81
+ } | null;
82
+ /** Whether a `meta.page_count` value denotes a PAGED store. The writer sets
83
+ * it to a positive count only when it pages, and never on an unpaged write,
84
+ * so a positive finite number is the authoritative "is paged" signal. */
85
+ export declare function isPagedByPageCount(pageCount: unknown): boolean;
86
+ /** Flatten a possibly-PAGED `instances` lookup to the flat
87
+ * `key -> { type, params }` lookup a reader consumes. An unpaged lookup is
88
+ * returned unchanged (no allocation). The single place paging is undone on the
89
+ * read side.
90
+ *
91
+ * `paged` is the AUTHORITATIVE page state, read from `meta.page_count` by the
92
+ * caller (`isPagedByPageCount`). Page interpretation MUST be gated on it, not
93
+ * on whether some entry is `PAGE_TAG`-tagged: a genuine record whose codec tag
94
+ * happens to equal `PAGE_TAG` in an UNPAGED store is a real record, not a
95
+ * page. Treating it as a page decodes its plain body as `decodePageBody`
96
+ * (which returns `[]` for a non-page body), silently DROPPING the record, and
97
+ * a crafted page-shaped body could forge records into the lookup. */
98
+ export declare function flattenPagedLookup(lookup: Record<string, unknown>, paged: boolean): Record<string, unknown>;
99
+ //# sourceMappingURL=record-paging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-paging.d.ts","sourceRoot":"","sources":["../src/record-paging.ts"],"names":[],"mappings":"AAmEA;wEACwE;AACxE,eAAO,MAAM,SAAS,SAAS,CAAC;AAChC,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC,mEAAmE;AACnE,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,WAAW,cAAc,CAAC;AACvC,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAE1C;;4CAE4C;AAC5C,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C;;;;;;;;gDAQgD;AAChD,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD;;;0DAG0D;AAC1D,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC;;;;;6DAK6D;AAC7D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAK/D;AAED;0CAC0C;AAC1C,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAQ1C;;oBAEoB;AACpB,eAAO,MAAM,QAAQ,aAAa,CAAC;AAEnC;sCACsC;AACtC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAElE;;;oFAGoF;AACpF,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAEpE;AAED;;;;+EAI+E;AAC/E,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,GACN,MAAM,CAER;AAED;;;;aAIa;AACb,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAEnE;AAED;;uCAEuC;AACvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,CASrE;AAED;;mBAEmB;AACnB,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGxD;AAeD,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;kBAEkB;AAClB,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;kDACkD;AAClD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,GACb;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAMvC;AAED;;0EAE0E;AAC1E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED;;;;;;;;;;;sEAWsE;AACtE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,OAAO,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyBzB"}
@@ -0,0 +1,220 @@
1
+ // The record-store paging codec: how a large record-graph document packs its
2
+ // `instances` map into page containers, and how to undo that back to a flat
3
+ // `key -> { type, params }` lookup.
4
+ //
5
+ // It lives in the SDK (not in `formats/core`, where the record store lives)
6
+ // because the published `@brass-build/client` ships unbundled and can only
7
+ // import published packages and its own relative files; `formats/core` is
8
+ // neither. The substrate imports these helpers back from here, so the codec is
9
+ // defined ONCE and the SDK's paged read / edit cannot drift from how the store
10
+ // is written. Deliberately loro-free (fflate, a stable hash, JSON), so it
11
+ // stays a pure value codec on both sides.
12
+ //
13
+ // Wire recap (full rationale in `formats/core/src/record-store.ts`): the root
14
+ // `instances` LoroMap is EITHER unpaged (key -> `{ type, params }`, params a
15
+ // plain value) or, above `UNPAGED_MAX_RECORDS` records, PAGED: keyed
16
+ // `p0,p1,...` -> a `{ type: '__page__', params: <string> }` container whose
17
+ // params is a gzipped latin1 string of a JSON array of `[key, tag, body]`
18
+ // triples. `meta.page_count` carries the count; `instance_order` lists record
19
+ // keys in order in both shapes. A record's page is a hash of its key, so it is
20
+ // resolved with no stored index.
21
+ import { gzipSync, gunzipSync, strToU8, strFromU8 } from 'fflate';
22
+ let nativeZlib;
23
+ function zlibBackend() {
24
+ if (nativeZlib === undefined) {
25
+ try {
26
+ const proc = globalThis.process;
27
+ nativeZlib =
28
+ proc?.getBuiltinModule?.('node:zlib') ??
29
+ null;
30
+ }
31
+ catch {
32
+ nativeZlib = null;
33
+ }
34
+ }
35
+ return nativeZlib;
36
+ }
37
+ function gzip(bytes) {
38
+ const zlib = zlibBackend();
39
+ return zlib ? zlib.gzipSync(bytes) : gzipSync(bytes);
40
+ }
41
+ function gunzip(bytes) {
42
+ const zlib = zlibBackend();
43
+ return zlib ? zlib.gunzipSync(bytes) : gunzipSync(bytes);
44
+ }
45
+ /** Field names inside a stored record container: `type` is the tag, `params`
46
+ * the body. Verbatim so the substrate and SDK name the same fields. */
47
+ export const TAG_FIELD = 'type';
48
+ export const BODY_FIELD = 'params';
49
+ /** Root container keys the record store occupies on a document. */
50
+ export const META_KEY = 'meta';
51
+ export const RECORDS_KEY = 'instances';
52
+ export const ORDER_KEY = 'instance_order';
53
+ /** `meta` key holding a paged store's page count; absent (or 0) means
54
+ * unpaged. The read path detects pages by tag; only an in-place edit needs
55
+ * the count, to hash a key to its page. */
56
+ export const PAGE_COUNT_KEY = 'page_count';
57
+ /** `meta` key holding the paging codec's scheme number, stamped on a paged
58
+ * write. The scheme fixes the page-key hash (`pageKeyFor`), the `p<n>` key
59
+ * format, and the packed-record layout together: a reader that hashes a key
60
+ * with a different scheme than the store was written under targets the wrong
61
+ * page on an in-place edit, silently writing a record into a page it does not
62
+ * belong to. The stamp lets a pinned reader detect a store written under a
63
+ * scheme it does not implement and refuse the edit instead of corrupting it.
64
+ * Absent means the current scheme (paged stores written before the stamp
65
+ * existed used scheme 1's hash and layout). */
66
+ export const PAGING_SCHEME_KEY = 'paging_scheme';
67
+ /** The paging scheme this build writes and can edit. Bump ONLY alongside a
68
+ * change to `pageKeyFor`'s hash, the `p<n>` key format, or the packed-record
69
+ * layout, so an older pinned reader trips `isPagingSchemeEditable` and fails
70
+ * loud rather than editing a store it would mis-hash. */
71
+ export const CURRENT_PAGING_SCHEME = 1;
72
+ /** Whether a store stamped with `scheme` can be edited in place by this build.
73
+ * Absent / non-numeric / `0` is a scheme-1 store (the stamp postdates it), so
74
+ * editable; any scheme at or below the current one is editable; a higher
75
+ * scheme is not (this reader would hash into the wrong page). Reads stay
76
+ * best-effort and are not gated here; only an in-place edit can persist the
77
+ * mis-hash, so the edit path is where the guard belongs. */
78
+ export function isPagingSchemeEditable(scheme) {
79
+ if (typeof scheme !== 'number' || !Number.isFinite(scheme) || scheme <= 0) {
80
+ return true;
81
+ }
82
+ return scheme <= CURRENT_PAGING_SCHEME;
83
+ }
84
+ /** Above this many records the store is written paged; at or below it it keeps
85
+ * the one-container-per-record shape. */
86
+ export const UNPAGED_MAX_RECORDS = 50_000;
87
+ // Target records per page and a page-count ceiling so even the 2M-record cap
88
+ // stays out of the slow zone. Mirrored from the substrate's write path so
89
+ // `pageCountFor` agrees with how the store was written.
90
+ const TARGET_PAGE_SIZE = 64;
91
+ const MAX_PAGES = 50_000;
92
+ /** The tag a page container carries in place of a record tag, so a reader
93
+ * tells a page (body = record triples) from a single record (body = one
94
+ * plain value). */
95
+ export const PAGE_TAG = '__page__';
96
+ /** Encode a page's triples as its stored body: JSON-serialised, gzipped, held
97
+ * as a latin1 string. A STRING body avoids loro's superlinear per-value
98
+ * conversion of a deeply nested triple array; gzipping keeps a heavy file in
99
+ * memory + export budget. (Full rationale in the substrate's `encodePageBody`.) */
100
+ export function encodePageBody(triples) {
101
+ return encodePageBodyFromEncoded(triples.map((t) => JSON.stringify(t)));
102
+ }
103
+ /** Encode one record's `[key, tag, body]` triple as the JSON string it
104
+ * occupies inside a page body. Split from page assembly so a large write can
105
+ * stringify each record as it buckets and release the parsed body before the
106
+ * gzip loop, rather than holding the whole parsed model live through it (see
107
+ * `writeRecordStoreConsuming` for why that release keeps the encode fast). */
108
+ export function encodeRecordForPage(key, tag, body) {
109
+ return JSON.stringify([key, tag, body]);
110
+ }
111
+ /** Assemble a page body from records already JSON-encoded by
112
+ * `encodeRecordForPage`: wrap in a JSON array, gzip, hold as a latin1 string.
113
+ * Byte-identical to `encodePageBody` over the same triples, so the wire shape
114
+ * is unchanged; the split exists only so the writer frees each parsed body
115
+ * first. */
116
+ export function encodePageBodyFromEncoded(encoded) {
117
+ return strFromU8(gzip(strToU8('[' + encoded.join(',') + ']')), true);
118
+ }
119
+ /** Decode a page body back to its record triples. Returns [] for anything that
120
+ * does not decompress to a JSON array, so a reader tolerates a corrupt or
121
+ * stray page rather than throwing. */
122
+ export function decodePageBody(body) {
123
+ if (typeof body !== 'string')
124
+ return [];
125
+ try {
126
+ const json = strFromU8(gunzip(strToU8(body, true)));
127
+ const parsed = JSON.parse(json);
128
+ return Array.isArray(parsed) ? parsed : [];
129
+ }
130
+ catch {
131
+ return [];
132
+ }
133
+ }
134
+ /** The page count for a record population: 0 (unpaged) at or below
135
+ * `UNPAGED_MAX_RECORDS`, else ~`TARGET_PAGE_SIZE` records per page, capped at
136
+ * `MAX_PAGES`. */
137
+ export function pageCountFor(recordCount) {
138
+ if (recordCount <= UNPAGED_MAX_RECORDS)
139
+ return 0;
140
+ return Math.min(Math.ceil(recordCount / TARGET_PAGE_SIZE), MAX_PAGES);
141
+ }
142
+ /** FNV-1a (32-bit) assigning a record key to a page. Stable and
143
+ * engine-independent: the same key resolves to the same page on write, read,
144
+ * and edit across processes, which is what lets the page be found with no
145
+ * stored index. */
146
+ function hashKey(key) {
147
+ let h = 0x811c9dc5;
148
+ for (let i = 0; i < key.length; i += 1) {
149
+ h ^= key.charCodeAt(i);
150
+ h = Math.imul(h, 0x01000193);
151
+ }
152
+ return h >>> 0;
153
+ }
154
+ /** The page key a record key lives in, for a store of `pageCount` pages. */
155
+ export function pageKeyFor(key, pageCount) {
156
+ return `p${hashKey(key) % pageCount}`;
157
+ }
158
+ /** A stored container's tag (`type`), or null for any value not in the
159
+ * `{ type, params }` shape, so a reader skips a corrupt entry. A page carries
160
+ * `PAGE_TAG`. */
161
+ export function peekRecordTag(value) {
162
+ if (!value || typeof value !== 'object' || Array.isArray(value))
163
+ return null;
164
+ const tag = value[TAG_FIELD];
165
+ return typeof tag === 'string' ? tag : null;
166
+ }
167
+ /** Decode a stored container (`{ type, params }`) to its tag + raw body,
168
+ * or null when it is not in the record shape. */
169
+ export function decodeRecordValue(value) {
170
+ if (!value || typeof value !== 'object' || Array.isArray(value))
171
+ return null;
172
+ const o = value;
173
+ const tag = o[TAG_FIELD];
174
+ if (typeof tag !== 'string' || !(BODY_FIELD in o))
175
+ return null;
176
+ return { tag, body: o[BODY_FIELD] };
177
+ }
178
+ /** Whether a `meta.page_count` value denotes a PAGED store. The writer sets
179
+ * it to a positive count only when it pages, and never on an unpaged write,
180
+ * so a positive finite number is the authoritative "is paged" signal. */
181
+ export function isPagedByPageCount(pageCount) {
182
+ return typeof pageCount === 'number' && Number.isFinite(pageCount) && pageCount > 0;
183
+ }
184
+ /** Flatten a possibly-PAGED `instances` lookup to the flat
185
+ * `key -> { type, params }` lookup a reader consumes. An unpaged lookup is
186
+ * returned unchanged (no allocation). The single place paging is undone on the
187
+ * read side.
188
+ *
189
+ * `paged` is the AUTHORITATIVE page state, read from `meta.page_count` by the
190
+ * caller (`isPagedByPageCount`). Page interpretation MUST be gated on it, not
191
+ * on whether some entry is `PAGE_TAG`-tagged: a genuine record whose codec tag
192
+ * happens to equal `PAGE_TAG` in an UNPAGED store is a real record, not a
193
+ * page. Treating it as a page decodes its plain body as `decodePageBody`
194
+ * (which returns `[]` for a non-page body), silently DROPPING the record, and
195
+ * a crafted page-shaped body could forge records into the lookup. */
196
+ export function flattenPagedLookup(lookup, paged) {
197
+ if (!paged)
198
+ return lookup;
199
+ const flat = {};
200
+ for (const [key, value] of Object.entries(lookup)) {
201
+ if (peekRecordTag(value) !== PAGE_TAG) {
202
+ flat[key] = value; // tolerate a stray non-page entry by its own key
203
+ continue;
204
+ }
205
+ const body = decodePageBody(decodeRecordValue(value)?.body);
206
+ for (const packed of body) {
207
+ if (Array.isArray(packed) &&
208
+ packed.length >= 3 &&
209
+ typeof packed[0] === 'string' &&
210
+ typeof packed[1] === 'string') {
211
+ flat[packed[0]] = {
212
+ [TAG_FIELD]: packed[1],
213
+ [BODY_FIELD]: packed[2],
214
+ };
215
+ }
216
+ }
217
+ }
218
+ return flat;
219
+ }
220
+ //# sourceMappingURL=record-paging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-paging.js","sourceRoot":"","sources":["../src/record-paging.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,oCAAoC;AACpC,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,0CAA0C;AAC1C,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,qEAAqE;AACrE,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,iCAAiC;AAEjC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAgBlE,IAAI,UAA0C,CAAC;AAE/C,SAAS,WAAW;IAClB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GACR,UAGD,CAAC,OAAO,CAAC;YACV,UAAU;gBACP,IAAI,EAAE,gBAAgB,EAAE,CAAC,WAAW,CAA6B;oBAClE,IAAI,CAAC;QACT,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,IAAI,CAAC,KAAiB;IAC7B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,MAAM,CAAC,KAAiB;IAC/B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;wEACwE;AACxE,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAEnC,mEAAmE;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAE1C;;4CAE4C;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C;;;;;;;;gDAQgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD;;;0DAG0D;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC;;;;;6DAK6D;AAC7D,MAAM,UAAU,sBAAsB,CAAC,MAAe;IACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,IAAI,qBAAqB,CAAC;AACzC,CAAC;AAED;0CAC0C;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,6EAA6E;AAC7E,0EAA0E;AAC1E,wDAAwD;AACxD,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB;;oBAEoB;AACpB,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAMnC;;;oFAGoF;AACpF,MAAM,UAAU,cAAc,CAAI,OAA0B;IAC1D,OAAO,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;+EAI+E;AAC/E,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,GAAW,EACX,IAAO;IAEP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAoB,CAAC,CAAC;AAC7D,CAAC;AAED;;;;aAIa;AACb,MAAM,UAAU,yBAAyB,CAAC,OAAiB;IACzD,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAED;;uCAEuC;AACvC,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;mBAEmB;AACnB,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,IAAI,WAAW,IAAI,mBAAmB;QAAE,OAAO,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAC;AACxE,CAAC;AAED;;;oBAGoB;AACpB,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,SAAiB;IACvD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC;AACxC,CAAC;AAED;;kBAEkB;AAClB,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,GAAG,GAAI,KAAiC,CAAC,SAAS,CAAC,CAAC;IAC1D,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED;kDACkD;AAClD,MAAM,UAAU,iBAAiB,CAC/B,KAAc;IAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;AACtC,CAAC;AAED;;0EAE0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,SAAkB;IACnD,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;;;;;;sEAWsE;AACtE,MAAM,UAAU,kBAAkB,CAChC,MAA+B,EAC/B,KAAc;IAEd,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,iDAAiD;YACpE,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,IACE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACrB,MAAM,CAAC,MAAM,IAAI,CAAC;gBAClB,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC7B,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAC7B,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG;oBAChB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;oBACtB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;iBACxB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface SchemaConflictChoice {
2
+ openAnyway: boolean;
3
+ }
4
+ /**
5
+ * Ask whether to open the document anyway. Resolves `openAnyway: false` on
6
+ * Close, on Escape, and when there is no DOM to ask in: every one of those is
7
+ * an open nobody agreed to, and the refusal stands.
8
+ */
9
+ export declare function askSchemaConflict(message: string, title?: string): Promise<SchemaConflictChoice>;
10
+ //# sourceMappingURL=schema-conflict-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-conflict-dialog.d.ts","sourceRoot":"","sources":["../src/schema-conflict-dialog.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,OAAO,CAAC;CACrB;AAqED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAiF/B"}
@@ -0,0 +1,164 @@
1
+ // The prompt shown when the platform refuses to open a document this app's
2
+ // declared schema cannot read.
3
+ //
4
+ // SDK-rendered rather than a hosted iframe: it asks one question about a
5
+ // document already named on this page, needs no session of its own, and has
6
+ // to appear on a cold boot from a bookmark, which is the moment an iframe
7
+ // round-trip is least welcome. The hosted dialogs exist for surfaces that
8
+ // read the person's whole account; this reads nothing.
9
+ //
10
+ // Both strings are the server's own, rendered verbatim. A client compiles
11
+ // into an app's bundle and freezes there, so a word this file holds itself
12
+ // can only be corrected by every app republishing, while a word it is handed
13
+ // reaches every app the moment the platform deploys. The fallback below is
14
+ // for a platform that predates the title, not a second opinion about wording.
15
+ const STYLE = `
16
+ /* A dialog opened with showModal(), so the browser holds the keyboard inside
17
+ the prompt. The UA box styles for a dialog (content-sized, centered,
18
+ bordered, padded, max-width capped) are all wrong for a full-viewport
19
+ backdrop, so each is zeroed, and the UA backdrop is cleared because this
20
+ element paints the dim itself. */
21
+ .brass-sc-backdrop {
22
+ position: fixed;
23
+ inset: 0;
24
+ margin: 0;
25
+ border: 0;
26
+ width: auto;
27
+ height: auto;
28
+ max-width: none;
29
+ max-height: none;
30
+ z-index: 2147483646;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ padding: 1rem;
35
+ background: rgba(20, 18, 13, 0.45);
36
+ font: 15px/1.5 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
37
+ }
38
+ .brass-sc-backdrop::backdrop {
39
+ background: transparent;
40
+ }
41
+ .brass-sc-panel {
42
+ background: Canvas;
43
+ color: CanvasText;
44
+ color-scheme: light dark;
45
+ max-width: 26rem;
46
+ width: 100%;
47
+ padding: 1.25rem;
48
+ border-radius: 0.75rem;
49
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.28);
50
+ }
51
+ .brass-sc-title {
52
+ margin: 0 0 0.5rem;
53
+ font-size: 1.0625rem;
54
+ font-weight: 600;
55
+ }
56
+ .brass-sc-body {
57
+ margin: 0 0 1.25rem;
58
+ }
59
+ .brass-sc-actions {
60
+ display: flex;
61
+ flex-wrap: wrap;
62
+ justify-content: flex-end;
63
+ gap: 0.5rem;
64
+ }
65
+ .brass-sc-actions button {
66
+ font: inherit;
67
+ min-height: 2.5rem;
68
+ padding: 0 0.875rem;
69
+ border-radius: 0.375rem;
70
+ border: 1px solid rgba(128, 128, 128, 0.4);
71
+ background: transparent;
72
+ color: inherit;
73
+ cursor: pointer;
74
+ }
75
+ .brass-sc-actions button.brass-sc-go {
76
+ border-color: transparent;
77
+ background: CanvasText;
78
+ color: Canvas;
79
+ }
80
+ `;
81
+ /**
82
+ * Ask whether to open the document anyway. Resolves `openAnyway: false` on
83
+ * Close, on Escape, and when there is no DOM to ask in: every one of those is
84
+ * an open nobody agreed to, and the refusal stands.
85
+ */
86
+ export function askSchemaConflict(message, title) {
87
+ if (typeof document === 'undefined') {
88
+ return Promise.resolve({ openAnyway: false });
89
+ }
90
+ return new Promise((resolve) => {
91
+ const host = document.createElement('div');
92
+ const shadow = host.attachShadow({ mode: 'open' });
93
+ const style = document.createElement('style');
94
+ style.textContent = STYLE;
95
+ const backdrop = document.createElement('dialog');
96
+ backdrop.className = 'brass-sc-backdrop';
97
+ const panel = document.createElement('div');
98
+ panel.className = 'brass-sc-panel';
99
+ panel.setAttribute('role', 'alertdialog');
100
+ panel.setAttribute('aria-modal', 'true');
101
+ panel.setAttribute('aria-labelledby', 'brass-sc-title');
102
+ const titleEl = document.createElement('h2');
103
+ titleEl.className = 'brass-sc-title';
104
+ titleEl.id = 'brass-sc-title';
105
+ titleEl.textContent = title ?? 'This app may not read this file correctly';
106
+ const body = document.createElement('p');
107
+ body.className = 'brass-sc-body';
108
+ body.textContent = message;
109
+ const actions = document.createElement('div');
110
+ actions.className = 'brass-sc-actions';
111
+ const close = document.createElement('button');
112
+ close.type = 'button';
113
+ close.textContent = 'Close';
114
+ const go = document.createElement('button');
115
+ go.type = 'button';
116
+ go.className = 'brass-sc-go';
117
+ go.textContent = 'Open anyway';
118
+ // Where the reader was when the prompt opened. Answering it detaches the
119
+ // prompt rather than closing it in place, so putting them back is this
120
+ // function's job.
121
+ const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;
122
+ let settled = false;
123
+ const settle = (openAnyway) => {
124
+ if (settled)
125
+ return;
126
+ settled = true;
127
+ document.removeEventListener('keydown', onKey, true);
128
+ if (backdrop.open)
129
+ backdrop.close();
130
+ host.remove();
131
+ if (opener?.isConnected)
132
+ opener.focus();
133
+ resolve({ openAnyway });
134
+ };
135
+ function onKey(event) {
136
+ if (event.key === 'Escape')
137
+ settle(false);
138
+ }
139
+ close.addEventListener('click', () => settle(false));
140
+ go.addEventListener('click', () => settle(true));
141
+ document.addEventListener('keydown', onKey, true);
142
+ // An open dialog answers Escape itself, which would close it without
143
+ // resolving. Route it into the one answer path; `onKey` above normally
144
+ // gets there first.
145
+ backdrop.addEventListener('cancel', (event) => {
146
+ event.preventDefault();
147
+ settle(false);
148
+ });
149
+ actions.append(close, go);
150
+ panel.append(titleEl, body, actions);
151
+ backdrop.append(panel);
152
+ shadow.append(style, backdrop);
153
+ document.body.append(host);
154
+ // The call that holds the keyboard inside the prompt: without it Tab keeps
155
+ // walking the app behind it. Guarded so a browser without the top layer
156
+ // still gets the prompt, non-modal, rather than none.
157
+ if (typeof backdrop.showModal === 'function')
158
+ backdrop.showModal();
159
+ // Close is the safe answer, so it takes focus: Enter on a dialog nobody
160
+ // read declines rather than opening a document the platform refused.
161
+ close.focus();
162
+ });
163
+ }
164
+ //# sourceMappingURL=schema-conflict-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-conflict-dialog.js","sourceRoot":"","sources":["../src/schema-conflict-dialog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SelectDocumentResult } from './hosted-ui.js';
2
+ export declare function storeLastDocument(appId: string, value: SelectDocumentResult): void;
3
+ export declare function readLastDocument(appId: string): SelectDocumentResult | null;
4
+ export declare function clearAll(appId: string): void;
5
+ //# sourceMappingURL=selection-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-persistence.d.ts","sourceRoot":"","sources":["../src/selection-persistence.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AA6C3D,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAYN;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GACZ,oBAAoB,GAAG,IAAI,CAe7B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ5C"}
@@ -0,0 +1,90 @@
1
+ // Per-app sessionStorage layer that stashes the last value returned by
2
+ // `Brass.selectDocument()`; the session's boot restore reads it back as
3
+ // the bare-URL fallback.
4
+ //
5
+ // Keys are namespaced per-app id so integrations on one origin don't
6
+ // collide. Cleared on sign-out (`clearAll`); session storage also drops on
7
+ // tab close.
8
+ const KEY_PREFIX = '__brass_';
9
+ const DOC_KEY = `${KEY_PREFIX}last_doc_`;
10
+ // Single per-page-load warn: `storeLastDocument` runs on every successful pick,
11
+ // so without the latch a server-rendered host would flood its logs.
12
+ let warnedUnavailable = false;
13
+ function getStorage() {
14
+ if (typeof sessionStorage === 'undefined')
15
+ return null;
16
+ try {
17
+ return sessionStorage;
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ function warnOnceUnavailable() {
24
+ if (warnedUnavailable)
25
+ return;
26
+ warnedUnavailable = true;
27
+ console.warn('Brass: sessionStorage is unavailable; selection persistence is disabled.');
28
+ }
29
+ function docKey(appId) {
30
+ return `${DOC_KEY}${appId}`;
31
+ }
32
+ function isSelectDocumentResult(value) {
33
+ if (!value || typeof value !== 'object')
34
+ return false;
35
+ const v = value;
36
+ return (typeof v['doc_id'] === 'string' &&
37
+ // `project_id: string | null` (loose docs have no project).
38
+ (typeof v['project_id'] === 'string' || v['project_id'] === null) &&
39
+ typeof v['organization_id'] === 'string' &&
40
+ typeof v['role'] === 'string' &&
41
+ typeof v['name'] === 'string' &&
42
+ typeof v['created_at'] === 'string' &&
43
+ typeof v['updated_at'] === 'string');
44
+ }
45
+ export function storeLastDocument(appId, value) {
46
+ const storage = getStorage();
47
+ if (!storage) {
48
+ warnOnceUnavailable();
49
+ return;
50
+ }
51
+ try {
52
+ storage.setItem(docKey(appId), JSON.stringify(value));
53
+ }
54
+ catch {
55
+ // Quota / disabled storage; drop silently so a recall-on-reload
56
+ // niceness never breaks the launcher path that just succeeded.
57
+ }
58
+ }
59
+ export function readLastDocument(appId) {
60
+ const storage = getStorage();
61
+ if (!storage)
62
+ return null;
63
+ const raw = storage.getItem(docKey(appId));
64
+ if (raw === null)
65
+ return null;
66
+ let parsed;
67
+ try {
68
+ parsed = JSON.parse(raw);
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ // A value written by an older SDK version may not match the current
74
+ // shape; ignore it rather than hand the caller a half-typed object.
75
+ if (!isSelectDocumentResult(parsed))
76
+ return null;
77
+ return parsed;
78
+ }
79
+ export function clearAll(appId) {
80
+ const storage = getStorage();
81
+ if (!storage)
82
+ return;
83
+ try {
84
+ storage.removeItem(docKey(appId));
85
+ }
86
+ catch {
87
+ // See `storeLastDocument`.
88
+ }
89
+ }
90
+ //# sourceMappingURL=selection-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-persistence.js","sourceRoot":"","sources":["../src/selection-persistence.ts"],"names":[],"mappings":"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"}