@graphty/graph-format 0.0.0 → 0.2.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 (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -43
  3. package/dist/graph-format.d.ts +1 -0
  4. package/dist/graph-format.d.ts.map +1 -0
  5. package/dist/graph-format.js +15798 -0
  6. package/dist/graph-format.js.map +1 -0
  7. package/dist/src/builder/arena.d.ts +85 -0
  8. package/dist/src/builder/arena.d.ts.map +1 -0
  9. package/dist/src/builder/arena.js +154 -0
  10. package/dist/src/builder/arena.js.map +1 -0
  11. package/dist/src/builder/compact.d.ts +515 -0
  12. package/dist/src/builder/compact.d.ts.map +1 -0
  13. package/dist/src/builder/compact.js +1553 -0
  14. package/dist/src/builder/compact.js.map +1 -0
  15. package/dist/src/builder/counting-sort.d.ts +96 -0
  16. package/dist/src/builder/counting-sort.d.ts.map +1 -0
  17. package/dist/src/builder/counting-sort.js +430 -0
  18. package/dist/src/builder/counting-sort.js.map +1 -0
  19. package/dist/src/builder/freeze.d.ts +72 -0
  20. package/dist/src/builder/freeze.d.ts.map +1 -0
  21. package/dist/src/builder/freeze.js +548 -0
  22. package/dist/src/builder/freeze.js.map +1 -0
  23. package/dist/src/builder/graph-builder.d.ts +602 -0
  24. package/dist/src/builder/graph-builder.d.ts.map +1 -0
  25. package/dist/src/builder/graph-builder.js +1940 -0
  26. package/dist/src/builder/graph-builder.js.map +1 -0
  27. package/dist/src/builder/options.d.ts +16 -0
  28. package/dist/src/builder/options.d.ts.map +1 -0
  29. package/dist/src/builder/options.js +21 -0
  30. package/dist/src/builder/options.js.map +1 -0
  31. package/dist/src/columns/bitmap.d.ts +96 -0
  32. package/dist/src/columns/bitmap.d.ts.map +1 -0
  33. package/dist/src/columns/bitmap.js +184 -0
  34. package/dist/src/columns/bitmap.js.map +1 -0
  35. package/dist/src/columns/column.d.ts +220 -0
  36. package/dist/src/columns/column.d.ts.map +1 -0
  37. package/dist/src/columns/column.js +2109 -0
  38. package/dist/src/columns/column.js.map +1 -0
  39. package/dist/src/columns/dictionary.d.ts +60 -0
  40. package/dist/src/columns/dictionary.d.ts.map +1 -0
  41. package/dist/src/columns/dictionary.js +102 -0
  42. package/dist/src/columns/dictionary.js.map +1 -0
  43. package/dist/src/columns/growable.d.ts +198 -0
  44. package/dist/src/columns/growable.d.ts.map +1 -0
  45. package/dist/src/columns/growable.js +296 -0
  46. package/dist/src/columns/growable.js.map +1 -0
  47. package/dist/src/columns/infer.d.ts +121 -0
  48. package/dist/src/columns/infer.d.ts.map +1 -0
  49. package/dist/src/columns/infer.js +268 -0
  50. package/dist/src/columns/infer.js.map +1 -0
  51. package/dist/src/columns/remap.d.ts +143 -0
  52. package/dist/src/columns/remap.d.ts.map +1 -0
  53. package/dist/src/columns/remap.js +588 -0
  54. package/dist/src/columns/remap.js.map +1 -0
  55. package/dist/src/columns/table.d.ts +184 -0
  56. package/dist/src/columns/table.d.ts.map +1 -0
  57. package/dist/src/columns/table.js +485 -0
  58. package/dist/src/columns/table.js.map +1 -0
  59. package/dist/src/constants.d.ts +34 -0
  60. package/dist/src/constants.d.ts.map +1 -0
  61. package/dist/src/constants.js +79 -0
  62. package/dist/src/constants.js.map +1 -0
  63. package/dist/src/errors.d.ts +76 -0
  64. package/dist/src/errors.d.ts.map +1 -0
  65. package/dist/src/errors.js +32 -0
  66. package/dist/src/errors.js.map +1 -0
  67. package/dist/src/ids/edge-id-index.d.ts +77 -0
  68. package/dist/src/ids/edge-id-index.d.ts.map +1 -0
  69. package/dist/src/ids/edge-id-index.js +155 -0
  70. package/dist/src/ids/edge-id-index.js.map +1 -0
  71. package/dist/src/ids/node-id-map.d.ts +280 -0
  72. package/dist/src/ids/node-id-map.d.ts.map +1 -0
  73. package/dist/src/ids/node-id-map.js +1139 -0
  74. package/dist/src/ids/node-id-map.js.map +1 -0
  75. package/dist/src/ids/string-store.d.ts +219 -0
  76. package/dist/src/ids/string-store.d.ts.map +1 -0
  77. package/dist/src/ids/string-store.js +526 -0
  78. package/dist/src/ids/string-store.js.map +1 -0
  79. package/dist/src/index.d.ts +30 -0
  80. package/dist/src/index.d.ts.map +1 -0
  81. package/dist/src/index.js +29 -0
  82. package/dist/src/index.js.map +1 -0
  83. package/dist/src/populate/from-csr.d.ts +61 -0
  84. package/dist/src/populate/from-csr.d.ts.map +1 -0
  85. package/dist/src/populate/from-csr.js +706 -0
  86. package/dist/src/populate/from-csr.js.map +1 -0
  87. package/dist/src/populate/from-edge-arrays.d.ts +51 -0
  88. package/dist/src/populate/from-edge-arrays.d.ts.map +1 -0
  89. package/dist/src/populate/from-edge-arrays.js +217 -0
  90. package/dist/src/populate/from-edge-arrays.js.map +1 -0
  91. package/dist/src/populate/from-records.d.ts +51 -0
  92. package/dist/src/populate/from-records.d.ts.map +1 -0
  93. package/dist/src/populate/from-records.js +447 -0
  94. package/dist/src/populate/from-records.js.map +1 -0
  95. package/dist/src/snapshot/derived.d.ts +211 -0
  96. package/dist/src/snapshot/derived.d.ts.map +1 -0
  97. package/dist/src/snapshot/derived.js +1254 -0
  98. package/dist/src/snapshot/derived.js.map +1 -0
  99. package/dist/src/snapshot/graph-meta.d.ts +23 -0
  100. package/dist/src/snapshot/graph-meta.d.ts.map +1 -0
  101. package/dist/src/snapshot/graph-meta.js +159 -0
  102. package/dist/src/snapshot/graph-meta.js.map +1 -0
  103. package/dist/src/snapshot/graph-snapshot.d.ts +509 -0
  104. package/dist/src/snapshot/graph-snapshot.d.ts.map +1 -0
  105. package/dist/src/snapshot/graph-snapshot.js +1247 -0
  106. package/dist/src/snapshot/graph-snapshot.js.map +1 -0
  107. package/dist/src/snapshot/hash.d.ts +90 -0
  108. package/dist/src/snapshot/hash.d.ts.map +1 -0
  109. package/dist/src/snapshot/hash.js +228 -0
  110. package/dist/src/snapshot/hash.js.map +1 -0
  111. package/dist/src/snapshot/queries.d.ts +74 -0
  112. package/dist/src/snapshot/queries.d.ts.map +1 -0
  113. package/dist/src/snapshot/queries.js +131 -0
  114. package/dist/src/snapshot/queries.js.map +1 -0
  115. package/dist/src/snapshot/validate.d.ts +192 -0
  116. package/dist/src/snapshot/validate.d.ts.map +1 -0
  117. package/dist/src/snapshot/validate.js +990 -0
  118. package/dist/src/snapshot/validate.js.map +1 -0
  119. package/dist/src/snapshot/views.d.ts +274 -0
  120. package/dist/src/snapshot/views.d.ts.map +1 -0
  121. package/dist/src/snapshot/views.js +856 -0
  122. package/dist/src/snapshot/views.js.map +1 -0
  123. package/dist/src/types/builder.d.ts +456 -0
  124. package/dist/src/types/builder.d.ts.map +1 -0
  125. package/dist/src/types/builder.js +11 -0
  126. package/dist/src/types/builder.js.map +1 -0
  127. package/dist/src/types/columns.d.ts +615 -0
  128. package/dist/src/types/columns.d.ts.map +1 -0
  129. package/dist/src/types/columns.js +14 -0
  130. package/dist/src/types/columns.js.map +1 -0
  131. package/dist/src/types/index.d.ts +14 -0
  132. package/dist/src/types/index.d.ts.map +1 -0
  133. package/dist/src/types/index.js +11 -0
  134. package/dist/src/types/index.js.map +1 -0
  135. package/dist/src/types/internal.d.ts +172 -0
  136. package/dist/src/types/internal.d.ts.map +1 -0
  137. package/dist/src/types/internal.js +13 -0
  138. package/dist/src/types/internal.js.map +1 -0
  139. package/dist/src/types/snapshot.d.ts +801 -0
  140. package/dist/src/types/snapshot.d.ts.map +1 -0
  141. package/dist/src/types/snapshot.js +14 -0
  142. package/dist/src/types/snapshot.js.map +1 -0
  143. package/dist/src/types/wire.d.ts +196 -0
  144. package/dist/src/types/wire.d.ts.map +1 -0
  145. package/dist/src/types/wire.js +8 -0
  146. package/dist/src/types/wire.js.map +1 -0
  147. package/dist/src/util/mask.d.ts +55 -0
  148. package/dist/src/util/mask.d.ts.map +1 -0
  149. package/dist/src/util/mask.js +71 -0
  150. package/dist/src/util/mask.js.map +1 -0
  151. package/dist/src/util/options.d.ts +22 -0
  152. package/dist/src/util/options.d.ts.map +1 -0
  153. package/dist/src/util/options.js +49 -0
  154. package/dist/src/util/options.js.map +1 -0
  155. package/dist/src/util/shared-buffers.d.ts +42 -0
  156. package/dist/src/util/shared-buffers.d.ts.map +1 -0
  157. package/dist/src/util/shared-buffers.js +52 -0
  158. package/dist/src/util/shared-buffers.js.map +1 -0
  159. package/dist/src/util/typed-array.d.ts +205 -0
  160. package/dist/src/util/typed-array.d.ts.map +1 -0
  161. package/dist/src/util/typed-array.js +289 -0
  162. package/dist/src/util/typed-array.js.map +1 -0
  163. package/dist/src/wire/bytes.d.ts +69 -0
  164. package/dist/src/wire/bytes.d.ts.map +1 -0
  165. package/dist/src/wire/bytes.js +361 -0
  166. package/dist/src/wire/bytes.js.map +1 -0
  167. package/dist/src/wire/carried-views.d.ts +111 -0
  168. package/dist/src/wire/carried-views.d.ts.map +1 -0
  169. package/dist/src/wire/carried-views.js +286 -0
  170. package/dist/src/wire/carried-views.js.map +1 -0
  171. package/dist/src/wire/from-wire.d.ts +144 -0
  172. package/dist/src/wire/from-wire.d.ts.map +1 -0
  173. package/dist/src/wire/from-wire.js +1425 -0
  174. package/dist/src/wire/from-wire.js.map +1 -0
  175. package/dist/src/wire/to-wire.d.ts +171 -0
  176. package/dist/src/wire/to-wire.d.ts.map +1 -0
  177. package/dist/src/wire/to-wire.js +652 -0
  178. package/dist/src/wire/to-wire.js.map +1 -0
  179. package/dist/tsconfig.build.tsbuildinfo +1 -0
  180. package/package.json +72 -7
  181. package/src/builder/arena.ts +192 -0
  182. package/src/builder/compact.ts +1811 -0
  183. package/src/builder/counting-sort.ts +506 -0
  184. package/src/builder/freeze.ts +689 -0
  185. package/src/builder/graph-builder.ts +2264 -0
  186. package/src/builder/options.ts +29 -0
  187. package/src/columns/bitmap.ts +196 -0
  188. package/src/columns/column.ts +2574 -0
  189. package/src/columns/dictionary.ts +114 -0
  190. package/src/columns/growable.ts +350 -0
  191. package/src/columns/infer.ts +285 -0
  192. package/src/columns/remap.ts +663 -0
  193. package/src/columns/table.ts +568 -0
  194. package/src/constants.ts +89 -0
  195. package/src/errors.ts +115 -0
  196. package/src/ids/edge-id-index.ts +179 -0
  197. package/src/ids/node-id-map.ts +1340 -0
  198. package/src/ids/string-store.ts +589 -0
  199. package/src/index.ts +139 -0
  200. package/src/lib-resizable-array-buffer.d.ts +34 -0
  201. package/src/populate/from-csr.ts +802 -0
  202. package/src/populate/from-edge-arrays.ts +257 -0
  203. package/src/populate/from-records.ts +536 -0
  204. package/src/snapshot/derived.ts +1486 -0
  205. package/src/snapshot/graph-meta.ts +167 -0
  206. package/src/snapshot/graph-snapshot.ts +1503 -0
  207. package/src/snapshot/hash.ts +241 -0
  208. package/src/snapshot/queries.ts +136 -0
  209. package/src/snapshot/validate.ts +1108 -0
  210. package/src/snapshot/views.ts +943 -0
  211. package/src/types/builder.ts +480 -0
  212. package/src/types/columns.ts +727 -0
  213. package/src/types/index.ts +14 -0
  214. package/src/types/internal.ts +195 -0
  215. package/src/types/snapshot.ts +886 -0
  216. package/src/types/wire.ts +207 -0
  217. package/src/util/mask.ts +89 -0
  218. package/src/util/options.ts +57 -0
  219. package/src/util/shared-buffers.ts +56 -0
  220. package/src/util/typed-array.ts +371 -0
  221. package/src/wire/bytes.ts +440 -0
  222. package/src/wire/carried-views.ts +327 -0
  223. package/src/wire/from-wire.ts +1690 -0
  224. package/src/wire/to-wire.ts +755 -0
@@ -0,0 +1,361 @@
1
+ /**
2
+ * The GSNP byte container (design section 9.2): `toBytes()` writes one contiguous buffer,
3
+ * `toByteChunks()` the same bytes as a sequence (header + manifest, then every 256-padded segment
4
+ * in manifest order), `fromBytes()` adopts a container's buffer region as the arena and
5
+ * `fromByteChunks()` adopts each chunk's buffer per segment. The snapshot's `toBytes` /
6
+ * `toByteChunks` methods call the functions of this module directly.
7
+ *
8
+ * Layout, all integers little-endian:
9
+ *
10
+ * ```
11
+ * offset size field
12
+ * 0 4 magic "GSNP"
13
+ * 4 2 wire major (u16)
14
+ * 6 2 wire minor (u16)
15
+ * 8 4 endianness probe: 0x01020304 written through a host-order Uint32Array
16
+ * 12 4 manifest byte length L (u32)
17
+ * 16 L manifest: UTF-8 JSON of the WireManifest, every reference into buffer 0 with a
18
+ * region-relative byteOffset
19
+ * 16+L pad zero padding to the next multiple of 256
20
+ * B ... buffer region: each array at a 256-aligned offset in manifest order, core arrays
21
+ * first so the region's prefix is the arena; every segment padded to 256 bytes
22
+ * ```
23
+ *
24
+ * The reader refuses a bad magic, an unexpected probe, a truncated header or manifest, a manifest
25
+ * whose versions disagree with the header (E_BAD_SERIALIZATION), an unknown wire major
26
+ * (E_UNSUPPORTED_VERSION) and everything the manifest reader of from-wire.ts refuses.
27
+ */
28
+ import { ALIGNMENT, CONTAINER_MAGIC, ENDIAN_PROBE, IS_LITTLE_ENDIAN, WIRE_MAJOR, WIRE_MINOR } from "../constants.js";
29
+ import { GraphFormatError } from "../errors.js";
30
+ import { alignUp, padTo4 } from "../util/typed-array.js";
31
+ import { badWire, bufferRegion, checkManifestVersions, decodeManifest, isSharedArrayBuffer, parseGuardedJson, resolveFromWireOptions, } from "./from-wire.js";
32
+ import { collectWire, encodeManifest, WireLayout } from "./to-wire.js";
33
+ // ============================================================ constants
34
+ /** Bytes before the manifest: magic, major, minor, probe and manifest length. */
35
+ export const CONTAINER_HEADER_BYTES = 16;
36
+ const fatalDecoder = new TextDecoder("utf-8", { fatal: true });
37
+ /**
38
+ * Lay a snapshot out for the container.
39
+ * @param snapshot - the snapshot
40
+ * @param options - the views to carry
41
+ * @returns the plan
42
+ */
43
+ function planContainer(snapshot, options) {
44
+ const layout = new WireLayout("container");
45
+ const { manifest } = collectWire(snapshot, layout, options.includeViews, true);
46
+ const manifestBytes = encodeManifest(manifest);
47
+ return {
48
+ manifestBytes,
49
+ regionStart: alignUp(CONTAINER_HEADER_BYTES + manifestBytes.byteLength, ALIGNMENT),
50
+ segments: layout.segments,
51
+ regionLength: layout.regionLength,
52
+ };
53
+ }
54
+ /**
55
+ * Write the 16-byte header into a fresh buffer (design section 9.2).
56
+ * @param out - a Uint8Array at offset 0 of its buffer with at least 16 bytes
57
+ * @param manifestLength - L
58
+ */
59
+ function writeHeader(out, manifestLength) {
60
+ out.set(CONTAINER_MAGIC, 0);
61
+ const view = new DataView(out.buffer, out.byteOffset, out.byteLength);
62
+ view.setUint16(4, WIRE_MAJOR, true);
63
+ view.setUint16(6, WIRE_MINOR, true);
64
+ new Uint32Array(out.buffer, out.byteOffset + 8, 1)[0] = ENDIAN_PROBE;
65
+ view.setUint32(12, manifestLength, true);
66
+ }
67
+ /**
68
+ * The bytes of a typed array as a Uint8Array view.
69
+ * @param view - the array
70
+ * @returns the byte view
71
+ */
72
+ function bytesOf(view) {
73
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
74
+ }
75
+ /**
76
+ * The GSNP container of a snapshot as one contiguous buffer (design section 9.2).
77
+ * @param snapshot - the snapshot
78
+ * @param options - the cached views to carry
79
+ * @returns the container bytes at offset 0 of a fresh ArrayBuffer; E_UNSUPPORTED on a big-endian host
80
+ */
81
+ export function toBytes(snapshot, options = {}) {
82
+ const plan = planContainer(snapshot, options);
83
+ const out = new Uint8Array(plan.regionStart + plan.regionLength);
84
+ writeHeader(out, plan.manifestBytes.byteLength);
85
+ out.set(plan.manifestBytes, CONTAINER_HEADER_BYTES);
86
+ for (const segment of plan.segments) {
87
+ out.set(bytesOf(segment.view), plan.regionStart + segment.ref.byteOffset);
88
+ }
89
+ return out;
90
+ }
91
+ /**
92
+ * Yield the chunks of a plan: the padded header + manifest, then every non-empty segment padded to
93
+ * 256 bytes.
94
+ * @param plan - the plan
95
+ * @yields the chunks in order
96
+ */
97
+ function* chunksOf(plan) {
98
+ const head = new Uint8Array(plan.regionStart);
99
+ writeHeader(head, plan.manifestBytes.byteLength);
100
+ head.set(plan.manifestBytes, CONTAINER_HEADER_BYTES);
101
+ yield head;
102
+ for (const segment of plan.segments) {
103
+ if (segment.ref.byteLength === 0) {
104
+ continue;
105
+ }
106
+ const chunk = new Uint8Array(alignUp(segment.ref.byteLength, ALIGNMENT));
107
+ chunk.set(bytesOf(segment.view));
108
+ yield chunk;
109
+ }
110
+ }
111
+ /**
112
+ * The GSNP container as a sequence of chunks whose concatenation equals `toBytes()` (design section
113
+ * 9.2): the header + manifest padded to 256, then each non-empty segment padded to 256, in manifest
114
+ * order. The layout is computed when this function is called; the chunk copies are made lazily.
115
+ * @param snapshot - the snapshot
116
+ * @param options - the cached views to carry
117
+ * @returns the chunks; E_UNSUPPORTED on a big-endian host
118
+ */
119
+ export function toByteChunks(snapshot, options = {}) {
120
+ return chunksOf(planContainer(snapshot, options));
121
+ }
122
+ /**
123
+ * Check and read the 16-byte header (design section 9.2).
124
+ * @param head - at least the first 16 bytes of the container
125
+ * @param totalLength - the container's total byte length
126
+ * @returns the header fields
127
+ */
128
+ function readHeader(head, totalLength) {
129
+ if (totalLength < CONTAINER_HEADER_BYTES) {
130
+ throw badWire("header", `truncated: ${totalLength} bytes, expected at least ${CONTAINER_HEADER_BYTES}`, {
131
+ byteLength: totalLength,
132
+ });
133
+ }
134
+ for (let i = 0; i < CONTAINER_MAGIC.length; i++) {
135
+ if (head[i] !== CONTAINER_MAGIC[i]) {
136
+ throw badWire("magic", "not a GSNP container", { found: Array.from(head.subarray(0, 4)) });
137
+ }
138
+ }
139
+ const view = new DataView(head.buffer, head.byteOffset, head.byteLength);
140
+ const major = view.getUint16(4, true);
141
+ const minor = view.getUint16(6, true);
142
+ if (major !== WIRE_MAJOR) {
143
+ throw new GraphFormatError("E_UNSUPPORTED_VERSION", `wire major ${major} is not supported (reader: ${WIRE_MAJOR})`, {
144
+ kind: "wire",
145
+ found: major,
146
+ supported: WIRE_MAJOR,
147
+ });
148
+ }
149
+ const probe = view.getUint32(8, IS_LITTLE_ENDIAN);
150
+ if (probe !== ENDIAN_PROBE) {
151
+ throw badWire("endianness", `probe reads 0x${probe.toString(16)}; the container was written on another endianness`, {
152
+ found: probe,
153
+ expected: ENDIAN_PROBE,
154
+ });
155
+ }
156
+ const manifestLength = view.getUint32(12, true);
157
+ if (CONTAINER_HEADER_BYTES + manifestLength > totalLength) {
158
+ throw badWire("manifest", `truncated: ${manifestLength} manifest bytes declared, ${totalLength} bytes in total`, {
159
+ manifestLength,
160
+ byteLength: totalLength,
161
+ });
162
+ }
163
+ return { major, minor, manifestLength };
164
+ }
165
+ /**
166
+ * Parse the manifest bytes: a fatal UTF-8 decode, the guarding JSON reviver, then the version check
167
+ * against the header.
168
+ * @param bytes - the manifest bytes
169
+ * @param header - the header the manifest must agree with
170
+ * @returns the manifest object
171
+ */
172
+ function readManifest(bytes, header) {
173
+ let text;
174
+ try {
175
+ text = fatalDecoder.decode(bytes);
176
+ }
177
+ catch {
178
+ throw badWire("manifest", "not valid UTF-8");
179
+ }
180
+ const manifest = parseGuardedJson(text, "manifest");
181
+ if (typeof manifest !== "object" || manifest === null || Array.isArray(manifest)) {
182
+ throw badWire("manifest", "expected an object");
183
+ }
184
+ const record = manifest;
185
+ const [major, minor] = checkManifestVersions(record);
186
+ if (major !== header.major || minor !== header.minor) {
187
+ throw badWire("wire", `manifest says [${major}, ${minor}], the header says [${header.major}, ${header.minor}]`, {
188
+ found: [major, minor],
189
+ header: [header.major, header.minor],
190
+ });
191
+ }
192
+ return record;
193
+ }
194
+ /**
195
+ * Rebuild a snapshot from a GSNP container (design section 9.2). Defaults: `validate: "full"` and
196
+ * `copy: false`. The buffer region is adopted as the arena when the container is a plain
197
+ * ArrayBuffer viewed at a byteOffset that is a multiple of 8 (so f64 segments align); a
198
+ * SharedArrayBuffer, an odd offset or `copy: true` take the copy path into a fresh 256-aligned
199
+ * buffer.
200
+ * @param bytes - the container: a Uint8Array, an ArrayBuffer or a SharedArrayBuffer
201
+ * @param options - validation level, copy and unknown-column policy
202
+ * @returns the snapshot; E_BAD_SERIALIZATION / E_UNSUPPORTED_VERSION / E_UNSUPPORTED / E_INVALID_SNAPSHOT on bad input
203
+ */
204
+ export function fromBytes(bytes, options) {
205
+ const resolved = resolveFromWireOptions(options, "full");
206
+ const view = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
207
+ const header = readHeader(view, view.byteLength);
208
+ const manifest = readManifest(view.subarray(CONTAINER_HEADER_BYTES, CONTAINER_HEADER_BYTES + header.manifestLength), header);
209
+ const regionStart = alignUp(CONTAINER_HEADER_BYTES + header.manifestLength, ALIGNMENT);
210
+ const regionLength = Math.max(0, view.byteLength - regionStart);
211
+ const { buffer } = view;
212
+ let region;
213
+ if (!resolved.copy && !isSharedArrayBuffer(buffer) && view.byteOffset % 8 === 0) {
214
+ region = bufferRegion(buffer, view.byteOffset + regionStart, regionLength);
215
+ }
216
+ else {
217
+ const copy = new Uint8Array(alignUp(regionLength, ALIGNMENT));
218
+ if (regionLength > 0) {
219
+ copy.set(view.subarray(regionStart));
220
+ }
221
+ region = bufferRegion(copy.buffer, 0, regionLength);
222
+ }
223
+ return decodeManifest(manifest, [region], resolved, true);
224
+ }
225
+ /**
226
+ * A byte stream made of chunks, addressed by absolute offset: ranges inside one chunk are located
227
+ * for adoption, ranges spanning chunks are copied.
228
+ */
229
+ class ChunkedBytes {
230
+ /**
231
+ * Wrap the chunks.
232
+ * @param chunks - the chunks in order
233
+ */
234
+ constructor(chunks) {
235
+ this.chunks = chunks;
236
+ this.starts = [];
237
+ let total = 0;
238
+ for (const chunk of chunks) {
239
+ this.starts.push(total);
240
+ total += chunk.byteLength;
241
+ }
242
+ this.byteLength = total;
243
+ }
244
+ /**
245
+ * The chunk index holding an absolute offset (the last chunk starting at or before it).
246
+ * @param offset - the absolute offset
247
+ * @returns the index, or -1 when there is no chunk
248
+ */
249
+ chunkAt(offset) {
250
+ let lo = 0;
251
+ let hi = this.starts.length - 1;
252
+ let found = -1;
253
+ while (lo <= hi) {
254
+ const mid = (lo + hi) >>> 1;
255
+ if (this.starts[mid] <= offset) {
256
+ found = mid;
257
+ lo = mid + 1;
258
+ }
259
+ else {
260
+ hi = mid - 1;
261
+ }
262
+ }
263
+ return found;
264
+ }
265
+ /**
266
+ * Find a range inside one chunk over a plain ArrayBuffer.
267
+ * @param offset - the absolute start
268
+ * @param length - the byte length
269
+ * @returns the buffer and absolute offset, or null when the range spans chunks or a SharedArrayBuffer
270
+ */
271
+ locate(offset, length) {
272
+ const i = this.chunkAt(offset);
273
+ if (i < 0) {
274
+ return null;
275
+ }
276
+ const chunk = this.chunks[i];
277
+ const start = this.starts[i];
278
+ if (offset + length > start + chunk.byteLength || isSharedArrayBuffer(chunk.buffer)) {
279
+ return null;
280
+ }
281
+ return { buffer: chunk.buffer, byteOffset: chunk.byteOffset + (offset - start) };
282
+ }
283
+ /**
284
+ * Copy a range out of the stream.
285
+ * @param offset - the absolute start
286
+ * @param length - the byte length
287
+ * @returns a fresh Uint8Array of `length` bytes at offset 0 of a padded buffer
288
+ */
289
+ read(offset, length) {
290
+ if (offset + length > this.byteLength) {
291
+ throw badWire("chunks", `range [${offset}, ${offset + length}) exceeds the ${this.byteLength} bytes given`);
292
+ }
293
+ const out = new Uint8Array(new ArrayBuffer(padTo4(length)), 0, length);
294
+ let written = 0;
295
+ let i = this.chunkAt(offset);
296
+ while (written < length && i < this.chunks.length) {
297
+ const chunk = this.chunks[i];
298
+ const start = this.starts[i];
299
+ const from = offset + written - start;
300
+ const take = Math.min(length - written, chunk.byteLength - from);
301
+ out.set(chunk.subarray(from, from + take), written);
302
+ written += take;
303
+ i++;
304
+ }
305
+ return out;
306
+ }
307
+ /**
308
+ * A view when the range lies inside one chunk, a copy otherwise.
309
+ * @param offset - the absolute start
310
+ * @param length - the byte length
311
+ * @returns the bytes
312
+ */
313
+ span(offset, length) {
314
+ const i = this.chunkAt(offset);
315
+ if (i >= 0) {
316
+ const chunk = this.chunks[i];
317
+ const start = this.starts[i];
318
+ if (offset + length <= start + chunk.byteLength) {
319
+ return chunk.subarray(offset - start, offset - start + length);
320
+ }
321
+ }
322
+ return this.read(offset, length);
323
+ }
324
+ /**
325
+ * The stream from `base` onward as a decoder region.
326
+ * @param base - the absolute offset of the region's start
327
+ * @returns the region
328
+ */
329
+ region(base) {
330
+ return {
331
+ byteLength: Math.max(0, this.byteLength - base),
332
+ locate: (byteOffset, byteLength) => this.locate(base + byteOffset, byteLength),
333
+ read: (byteOffset, byteLength) => this.read(base + byteOffset, byteLength),
334
+ };
335
+ }
336
+ }
337
+ /**
338
+ * Rebuild a snapshot from the chunks `toByteChunks()` produced (or any split of a container's
339
+ * bytes): each segment is adopted as a view into the chunk that holds it (a segment spanning two
340
+ * chunks, or one in a SharedArrayBuffer, is copied) and the snapshot has `arena === null` (design
341
+ * section 9.2). Defaults: `validate: "full"`, `copy: false`.
342
+ * @param chunks - the chunks in order
343
+ * @param options - validation level, copy and unknown-column policy
344
+ * @returns the snapshot
345
+ */
346
+ export function fromByteChunks(chunks, options) {
347
+ const resolved = resolveFromWireOptions(options, "full");
348
+ const list = [];
349
+ for (const chunk of chunks) {
350
+ if (!(chunk instanceof Uint8Array)) {
351
+ throw badWire(`chunks[${list.length}]`, "expected a Uint8Array");
352
+ }
353
+ list.push(resolved.copy ? chunk.slice() : chunk);
354
+ }
355
+ const bytes = new ChunkedBytes(list);
356
+ const header = readHeader(bytes.span(0, Math.min(CONTAINER_HEADER_BYTES, bytes.byteLength)), bytes.byteLength);
357
+ const manifest = readManifest(bytes.span(CONTAINER_HEADER_BYTES, header.manifestLength), header);
358
+ const regionStart = alignUp(CONTAINER_HEADER_BYTES + header.manifestLength, ALIGNMENT);
359
+ return decodeManifest(manifest, [bytes.region(regionStart)], resolved, false);
360
+ }
361
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../../src/wire/bytes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Content checks of the views a wire manifest carries (`includeViews`, design sections 9.1 and 9.5),
3
+ * run at the "structure" level before a carried view is installed on the receiver. Every view is a
4
+ * pure function of the core (design section 7.2), so each check is exact: the index views are
5
+ * compared with what the core says arc by arc in O(n + m) without allocating a second copy, and the
6
+ * four f64 views are compared with the snapshot's own computation. A view that disagrees is
7
+ * E_INVALID_SNAPSHOT with `details.invariant` "I2" (a corrupt index array) or "I17" (a corrupt
8
+ * value array) and `details.view` naming it. At "none" nothing is checked (the manifest is trusted,
9
+ * design section 9.5); at "full" carried views are never installed.
10
+ */
11
+ import { type GraphSnapshot } from "../snapshot/graph-snapshot.js";
12
+ import { type F32, type F64, type ReverseView, type U32 } from "../types/index.js";
13
+ /** The per-arc facts every index-view check reads, computed once per manifest. */
14
+ export declare class CoreFacts {
15
+ /** The row (source) of every arc. */
16
+ readonly arcRow: U32;
17
+ /** Loop arcs per node. */
18
+ readonly loops: U32;
19
+ /** In-arcs per node (directed only; the out-degree when undirected). */
20
+ readonly inDegree: U32;
21
+ /**
22
+ * Expand the core once.
23
+ * @param snapshot - the snapshot
24
+ */
25
+ constructor(snapshot: GraphSnapshot);
26
+ /**
27
+ * The exclusive prefix sum of the in-degrees (the reverse rowPtr).
28
+ * @returns nodeCount + 1 offsets
29
+ */
30
+ inDegreePrefix(): U32;
31
+ }
32
+ /**
33
+ * outDegree: the row lengths.
34
+ * @param snapshot - the snapshot
35
+ * @param data - the carried array
36
+ */
37
+ export declare function checkOutDegree(snapshot: GraphSnapshot, data: U32): void;
38
+ /**
39
+ * inDegree (directed): the in-arc counts.
40
+ * @param facts - the core facts
41
+ * @param data - the carried array
42
+ */
43
+ export declare function checkInDegree(facts: CoreFacts, data: U32): void;
44
+ /**
45
+ * degree: outDegree + inDegree (directed) or outDegree + loops (undirected), design section 3.4.
46
+ * @param snapshot - the snapshot
47
+ * @param facts - the core facts
48
+ * @param data - the carried array
49
+ */
50
+ export declare function checkDegree(snapshot: GraphSnapshot, facts: CoreFacts, data: U32): void;
51
+ /**
52
+ * selfLoopsPerNode: the loop arcs per row.
53
+ * @param facts - the core facts
54
+ * @param data - the carried array
55
+ */
56
+ export declare function checkSelfLoopsPerNode(facts: CoreFacts, data: U32): void;
57
+ /**
58
+ * selfLoopArcs: ascending arcs, each a loop; with the length fixed to selfLoopCount that is exact.
59
+ * @param snapshot - the snapshot
60
+ * @param facts - the core facts
61
+ * @param data - the carried array
62
+ */
63
+ export declare function checkSelfLoopArcs(snapshot: GraphSnapshot, facts: CoreFacts, data: U32): void;
64
+ /**
65
+ * coo.src: the row of every arc.
66
+ * @param facts - the core facts
67
+ * @param src - the carried array
68
+ */
69
+ export declare function checkCooSrc(facts: CoreFacts, src: U32): void;
70
+ /**
71
+ * edgeList: `src[e]` is the row of `edgeToArc[e]`, `dst[e]` its target, `weights[e]` its weight.
72
+ * @param snapshot - the snapshot
73
+ * @param facts - the core facts
74
+ * @param src - the carried sources
75
+ * @param dst - the carried targets, or null when colIdx is aliased
76
+ * @param weights - the carried weights, or null when aliased or unweighted
77
+ */
78
+ export declare function checkEdgeList(snapshot: GraphSnapshot, facts: CoreFacts, src: U32, dst: U32 | null, weights: F32 | null): void;
79
+ /**
80
+ * mate (undirected): an involution pairing the two arcs of every non-loop edge (invariant I7) and
81
+ * fixing every loop arc.
82
+ * @param snapshot - the snapshot
83
+ * @param facts - the core facts
84
+ * @param mate - the carried array
85
+ */
86
+ export declare function checkMate(snapshot: GraphSnapshot, facts: CoreFacts, mate: U32): void;
87
+ /**
88
+ * degreeOrder / reverseDegreeOrder: a permutation ordered by non-increasing degree with ties in
89
+ * ascending node index, and the cuGraph tier offsets of design section 7.2.
90
+ * @param name - the view name
91
+ * @param degree - the degree of every node the order sorts by
92
+ * @param perm - the carried permutation
93
+ * @param segmentOffsets - the carried tier offsets
94
+ */
95
+ export declare function checkDegreeOrder(name: "degreeOrder" | "reverseDegreeOrder", degree: U32, perm: U32, segmentOffsets: U32): void;
96
+ /**
97
+ * reverse (directed): the in-adjacency with rows sorted by source and ties by forward arc, `fwdArc`
98
+ * a permutation of the arcs, `colIdx` the sources, `weights` the forward weights gathered.
99
+ * @param snapshot - the snapshot
100
+ * @param facts - the core facts
101
+ * @param reverse - the carried view
102
+ */
103
+ export declare function checkReverse(snapshot: GraphSnapshot, facts: CoreFacts, reverse: ReverseView): void;
104
+ /**
105
+ * An f64 view: compared with the snapshot's own computation.
106
+ * @param name - the view name
107
+ * @param found - the carried array
108
+ * @param expected - the computed truth
109
+ */
110
+ export declare function checkF64View(name: string, found: F64, expected: F64): void;
111
+ //# sourceMappingURL=carried-views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carried-views.d.ts","sourceRoot":"","sources":["../../../src/wire/carried-views.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEnF,kFAAkF;AAClF,qBAAa,SAAS;IAClB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;IAEvB;;;OAGG;gBACS,QAAQ,EAAE,aAAa;IAuBnC;;;OAGG;IACH,cAAc,IAAI,GAAG;CAQxB;AA0DD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAEvE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAQtF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAQ5F;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAE5D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CACzB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,GAAG,IAAI,EACf,OAAO,EAAE,GAAG,GAAG,IAAI,GACpB,IAAI,CAeN;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CASpF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,aAAa,GAAG,oBAAoB,EAC1C,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,GAAG,EACT,cAAc,EAAE,GAAG,GACpB,IAAI,CAuBN;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CA+BlG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,CAE1E"}