@freqhole/reliquary 0.0.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 (226) hide show
  1. package/dist/automerge/acl-filtering.d.ts +87 -0
  2. package/dist/automerge/acl-filtering.d.ts.map +1 -0
  3. package/dist/automerge/acl-filtering.js +138 -0
  4. package/dist/automerge/acl-filtering.test.d.ts +2 -0
  5. package/dist/automerge/acl-filtering.test.d.ts.map +1 -0
  6. package/dist/automerge/acl-filtering.test.js +302 -0
  7. package/dist/automerge/index.d.ts +5 -0
  8. package/dist/automerge/index.d.ts.map +1 -0
  9. package/dist/automerge/index.js +7 -0
  10. package/dist/automerge/iroh-network-adapter.d.ts +178 -0
  11. package/dist/automerge/iroh-network-adapter.d.ts.map +1 -0
  12. package/dist/automerge/iroh-network-adapter.js +691 -0
  13. package/dist/automerge/iroh-network-adapter.test.d.ts +2 -0
  14. package/dist/automerge/iroh-network-adapter.test.d.ts.map +1 -0
  15. package/dist/automerge/iroh-network-adapter.test.js +818 -0
  16. package/dist/automerge/types.d.ts +66 -0
  17. package/dist/automerge/types.d.ts.map +1 -0
  18. package/dist/automerge/types.js +10 -0
  19. package/dist/blobs/bytes-backend.d.ts +41 -0
  20. package/dist/blobs/bytes-backend.d.ts.map +1 -0
  21. package/dist/blobs/bytes-backend.js +252 -0
  22. package/dist/blobs/bytes-backend.test.d.ts +2 -0
  23. package/dist/blobs/bytes-backend.test.d.ts.map +1 -0
  24. package/dist/blobs/bytes-backend.test.js +241 -0
  25. package/dist/blobs/db.d.ts +8 -0
  26. package/dist/blobs/db.d.ts.map +1 -0
  27. package/dist/blobs/db.js +141 -0
  28. package/dist/blobs/db.test.d.ts +2 -0
  29. package/dist/blobs/db.test.d.ts.map +1 -0
  30. package/dist/blobs/db.test.js +120 -0
  31. package/dist/blobs/index.d.ts +5 -0
  32. package/dist/blobs/index.d.ts.map +1 -0
  33. package/dist/blobs/index.js +2 -0
  34. package/dist/blobs/store.d.ts +47 -0
  35. package/dist/blobs/store.d.ts.map +1 -0
  36. package/dist/blobs/store.js +263 -0
  37. package/dist/blobs/store.test.d.ts +2 -0
  38. package/dist/blobs/store.test.d.ts.map +1 -0
  39. package/dist/blobs/store.test.js +377 -0
  40. package/dist/blobs/types.d.ts +55 -0
  41. package/dist/blobs/types.d.ts.map +1 -0
  42. package/dist/blobs/types.js +8 -0
  43. package/dist/ensure/client.d.ts +19 -0
  44. package/dist/ensure/client.d.ts.map +1 -0
  45. package/dist/ensure/client.js +74 -0
  46. package/dist/ensure/client.test.d.ts +2 -0
  47. package/dist/ensure/client.test.d.ts.map +1 -0
  48. package/dist/ensure/client.test.js +133 -0
  49. package/dist/ensure/index.d.ts +4 -0
  50. package/dist/ensure/index.d.ts.map +1 -0
  51. package/dist/ensure/index.js +4 -0
  52. package/dist/ensure/responder.d.ts +20 -0
  53. package/dist/ensure/responder.d.ts.map +1 -0
  54. package/dist/ensure/responder.js +100 -0
  55. package/dist/ensure/responder.test.d.ts +2 -0
  56. package/dist/ensure/responder.test.d.ts.map +1 -0
  57. package/dist/ensure/responder.test.js +191 -0
  58. package/dist/ensure/types.d.ts +19 -0
  59. package/dist/ensure/types.d.ts.map +1 -0
  60. package/dist/ensure/types.js +4 -0
  61. package/dist/ensure/types.test.d.ts +2 -0
  62. package/dist/ensure/types.test.d.ts.map +1 -0
  63. package/dist/ensure/types.test.js +81 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +3 -0
  67. package/dist/index.test.d.ts +2 -0
  68. package/dist/index.test.d.ts.map +1 -0
  69. package/dist/index.test.js +7 -0
  70. package/dist/solid/blob-url.d.ts +10 -0
  71. package/dist/solid/blob-url.d.ts.map +1 -0
  72. package/dist/solid/blob-url.js +34 -0
  73. package/dist/solid/blob-url.test.d.ts +2 -0
  74. package/dist/solid/blob-url.test.d.ts.map +1 -0
  75. package/dist/solid/blob-url.test.js +62 -0
  76. package/dist/solid/connection-summary.d.ts +25 -0
  77. package/dist/solid/connection-summary.d.ts.map +1 -0
  78. package/dist/solid/connection-summary.js +29 -0
  79. package/dist/solid/connection-summary.test.d.ts +2 -0
  80. package/dist/solid/connection-summary.test.d.ts.map +1 -0
  81. package/dist/solid/connection-summary.test.js +57 -0
  82. package/dist/solid/doc-store.d.ts +29 -0
  83. package/dist/solid/doc-store.d.ts.map +1 -0
  84. package/dist/solid/doc-store.js +79 -0
  85. package/dist/solid/doc-store.test.d.ts +2 -0
  86. package/dist/solid/doc-store.test.d.ts.map +1 -0
  87. package/dist/solid/doc-store.test.js +234 -0
  88. package/dist/solid/index.d.ts +4 -0
  89. package/dist/solid/index.d.ts.map +1 -0
  90. package/dist/solid/index.js +9 -0
  91. package/dist/solid/transfer-progress.d.ts +21 -0
  92. package/dist/solid/transfer-progress.d.ts.map +1 -0
  93. package/dist/solid/transfer-progress.js +32 -0
  94. package/dist/solid/transfer-progress.test.d.ts +2 -0
  95. package/dist/solid/transfer-progress.test.d.ts.map +1 -0
  96. package/dist/solid/transfer-progress.test.js +76 -0
  97. package/dist/testing/blob-fixtures.d.ts +19 -0
  98. package/dist/testing/blob-fixtures.d.ts.map +1 -0
  99. package/dist/testing/blob-fixtures.js +46 -0
  100. package/dist/testing/blob-fixtures.test.d.ts +2 -0
  101. package/dist/testing/blob-fixtures.test.d.ts.map +1 -0
  102. package/dist/testing/blob-fixtures.test.js +46 -0
  103. package/dist/testing/idb-harness.d.ts +10 -0
  104. package/dist/testing/idb-harness.d.ts.map +1 -0
  105. package/dist/testing/idb-harness.js +17 -0
  106. package/dist/testing/idb-harness.test.d.ts +2 -0
  107. package/dist/testing/idb-harness.test.d.ts.map +1 -0
  108. package/dist/testing/idb-harness.test.js +48 -0
  109. package/dist/testing/index.d.ts +7 -0
  110. package/dist/testing/index.d.ts.map +1 -0
  111. package/dist/testing/index.js +11 -0
  112. package/dist/testing/media.d.ts +15 -0
  113. package/dist/testing/media.d.ts.map +1 -0
  114. package/dist/testing/media.js +37 -0
  115. package/dist/testing/media.test.d.ts +2 -0
  116. package/dist/testing/media.test.d.ts.map +1 -0
  117. package/dist/testing/media.test.js +47 -0
  118. package/dist/testing/mock-blob-fetch.d.ts +33 -0
  119. package/dist/testing/mock-blob-fetch.d.ts.map +1 -0
  120. package/dist/testing/mock-blob-fetch.js +39 -0
  121. package/dist/testing/mock-blob-fetch.test.d.ts +2 -0
  122. package/dist/testing/mock-blob-fetch.test.d.ts.map +1 -0
  123. package/dist/testing/mock-blob-fetch.test.js +65 -0
  124. package/dist/testing/mock-node.d.ts +36 -0
  125. package/dist/testing/mock-node.d.ts.map +1 -0
  126. package/dist/testing/mock-node.js +97 -0
  127. package/dist/testing/mock-node.test.d.ts +2 -0
  128. package/dist/testing/mock-node.test.d.ts.map +1 -0
  129. package/dist/testing/mock-node.test.js +66 -0
  130. package/dist/testing/streams.d.ts +68 -0
  131. package/dist/testing/streams.d.ts.map +1 -0
  132. package/dist/testing/streams.js +99 -0
  133. package/dist/testing/streams.test.d.ts +2 -0
  134. package/dist/testing/streams.test.d.ts.map +1 -0
  135. package/dist/testing/streams.test.js +82 -0
  136. package/dist/transfer/cancellation.d.ts +8 -0
  137. package/dist/transfer/cancellation.d.ts.map +1 -0
  138. package/dist/transfer/cancellation.js +19 -0
  139. package/dist/transfer/index.d.ts +8 -0
  140. package/dist/transfer/index.d.ts.map +1 -0
  141. package/dist/transfer/index.js +4 -0
  142. package/dist/transfer/prefetch.d.ts +38 -0
  143. package/dist/transfer/prefetch.d.ts.map +1 -0
  144. package/dist/transfer/prefetch.js +61 -0
  145. package/dist/transfer/prefetch.test.d.ts +2 -0
  146. package/dist/transfer/prefetch.test.d.ts.map +1 -0
  147. package/dist/transfer/prefetch.test.js +136 -0
  148. package/dist/transfer/serve.d.ts +66 -0
  149. package/dist/transfer/serve.d.ts.map +1 -0
  150. package/dist/transfer/serve.js +126 -0
  151. package/dist/transfer/serve.test.d.ts +2 -0
  152. package/dist/transfer/serve.test.d.ts.map +1 -0
  153. package/dist/transfer/serve.test.js +101 -0
  154. package/dist/transfer/snatch.d.ts +39 -0
  155. package/dist/transfer/snatch.d.ts.map +1 -0
  156. package/dist/transfer/snatch.js +289 -0
  157. package/dist/transfer/snatch.test.d.ts +2 -0
  158. package/dist/transfer/snatch.test.d.ts.map +1 -0
  159. package/dist/transfer/snatch.test.js +337 -0
  160. package/dist/transfer/types.d.ts +85 -0
  161. package/dist/transfer/types.d.ts.map +1 -0
  162. package/dist/transfer/types.js +15 -0
  163. package/dist/utils/hash.d.ts +13 -0
  164. package/dist/utils/hash.d.ts.map +1 -0
  165. package/dist/utils/hash.js +31 -0
  166. package/dist/utils/hash.test.d.ts +2 -0
  167. package/dist/utils/hash.test.d.ts.map +1 -0
  168. package/dist/utils/hash.test.js +56 -0
  169. package/dist/utils/image-utils.d.ts +28 -0
  170. package/dist/utils/image-utils.d.ts.map +1 -0
  171. package/dist/utils/image-utils.js +113 -0
  172. package/dist/utils/image-utils.test.d.ts +2 -0
  173. package/dist/utils/image-utils.test.d.ts.map +1 -0
  174. package/dist/utils/image-utils.test.js +181 -0
  175. package/dist/utils/index.d.ts +4 -0
  176. package/dist/utils/index.d.ts.map +1 -0
  177. package/dist/utils/index.js +3 -0
  178. package/dist/utils/log.d.ts +22 -0
  179. package/dist/utils/log.d.ts.map +1 -0
  180. package/dist/utils/log.js +100 -0
  181. package/dist/utils/log.test.d.ts +2 -0
  182. package/dist/utils/log.test.d.ts.map +1 -0
  183. package/dist/utils/log.test.js +113 -0
  184. package/dist/worker/blob-worker-client.d.ts +118 -0
  185. package/dist/worker/blob-worker-client.d.ts.map +1 -0
  186. package/dist/worker/blob-worker-client.js +361 -0
  187. package/dist/worker/blob-worker-client.test.d.ts +2 -0
  188. package/dist/worker/blob-worker-client.test.d.ts.map +1 -0
  189. package/dist/worker/blob-worker-client.test.js +137 -0
  190. package/dist/worker/blob-worker-logic.d.ts +120 -0
  191. package/dist/worker/blob-worker-logic.d.ts.map +1 -0
  192. package/dist/worker/blob-worker-logic.js +368 -0
  193. package/dist/worker/blob-worker-logic.test.d.ts +2 -0
  194. package/dist/worker/blob-worker-logic.test.d.ts.map +1 -0
  195. package/dist/worker/blob-worker-logic.test.js +191 -0
  196. package/dist/worker/blob-worker.d.ts +21 -0
  197. package/dist/worker/blob-worker.d.ts.map +1 -0
  198. package/dist/worker/blob-worker.js +44 -0
  199. package/dist/worker/index.d.ts +12 -0
  200. package/dist/worker/index.d.ts.map +1 -0
  201. package/dist/worker/index.js +6 -0
  202. package/dist/worker/midden-blake3.d.ts +23 -0
  203. package/dist/worker/midden-blake3.d.ts.map +1 -0
  204. package/dist/worker/midden-blake3.js +47 -0
  205. package/dist/worker/midden-blake3.test.d.ts +2 -0
  206. package/dist/worker/midden-blake3.test.d.ts.map +1 -0
  207. package/dist/worker/midden-blake3.test.js +25 -0
  208. package/dist/worker/midden-not-bundled.stub.d.ts +1 -0
  209. package/dist/worker/midden-not-bundled.stub.d.ts.map +1 -0
  210. package/dist/worker/midden-not-bundled.stub.js +10 -0
  211. package/dist/worker/midden-stub.d.ts +10 -0
  212. package/dist/worker/midden-stub.d.ts.map +1 -0
  213. package/dist/worker/midden-stub.js +31 -0
  214. package/dist/worker/midden-stub.test.d.ts +2 -0
  215. package/dist/worker/midden-stub.test.d.ts.map +1 -0
  216. package/dist/worker/midden-stub.test.js +25 -0
  217. package/dist/worker/midden-worker-client.d.ts +103 -0
  218. package/dist/worker/midden-worker-client.d.ts.map +1 -0
  219. package/dist/worker/midden-worker-client.js +246 -0
  220. package/dist/worker/midden-worker-client.test.d.ts +2 -0
  221. package/dist/worker/midden-worker-client.test.d.ts.map +1 -0
  222. package/dist/worker/midden-worker-client.test.js +151 -0
  223. package/dist/worker/midden-worker-contract.d.ts +87 -0
  224. package/dist/worker/midden-worker-contract.d.ts.map +1 -0
  225. package/dist/worker/midden-worker-contract.js +30 -0
  226. package/package.json +90 -0
@@ -0,0 +1,100 @@
1
+ // lightweight logger with level + tag filtering.
2
+ // level order: trace < debug < info < warn < error
3
+ //
4
+ // configuration precedence (highest wins):
5
+ // 1. localStorage overrides (browser devtools, no rebuild needed):
6
+ // localStorage.logLevel = "trace";
7
+ // localStorage.logFilter = "automerge.repo,idb.docindex";
8
+ // location.reload();
9
+ // 2. configureLogging({ level, filter }) - call this once at app startup.
10
+ // this is the hook a consuming app uses to wire up its own build-time env
11
+ // vars (e.g. `configureLogging({ level: import.meta.env.VITE_LOG_LEVEL })`
12
+ // in a vite app) without this package hard-depending on any bundler's env
13
+ // injection.
14
+ // 3. default: "warn", no tag filter.
15
+ //
16
+ // trace is off by default even when a lower level is configured - enable it
17
+ // explicitly when needed. it's useful for detailed call-by-call tracing of
18
+ // services without adding noise to normal debug output.
19
+ //
20
+ // tags use dotted namespaces, e.g. "p2p.transfer", "audio.player", "idb.service".
21
+ // filter prefix matching: "p2p" matches "p2p", "p2p.transfer", "p2p.knock", etc.
22
+ //
23
+ // usage:
24
+ // import { log } from "@freqhole/reliquary/utils";
25
+ // log.warn("share.panel", "could not build share link:", err);
26
+ // log.debug("playlist.sync", "syncPlaylists #", syncId, "entries:", entries.length);
27
+ // log.trace("automerge.repo", "findPlaylistDoc call #", n, docId);
28
+ const LEVEL_NUM = {
29
+ trace: -1,
30
+ debug: 0,
31
+ info: 1,
32
+ warn: 2,
33
+ error: 3,
34
+ };
35
+ const DEFAULT_LEVEL = "warn";
36
+ let configuredLevel;
37
+ let configuredFilter;
38
+ /**
39
+ * set the default log level and/or tag filter. intended to be called once at
40
+ * app startup; localStorage overrides (if present) still take priority so
41
+ * logging can be adjusted at runtime without a rebuild.
42
+ */
43
+ export function configureLogging(config) {
44
+ if (config.level !== undefined)
45
+ configuredLevel = config.level;
46
+ if (config.filter !== undefined)
47
+ configuredFilter = config.filter;
48
+ }
49
+ /** clear any configureLogging() overrides, restoring the built-in default. */
50
+ export function resetLoggingConfig() {
51
+ configuredLevel = undefined;
52
+ configuredFilter = undefined;
53
+ }
54
+ function readLocalStorage(key) {
55
+ return typeof localStorage !== "undefined" && typeof localStorage.getItem === "function"
56
+ ? localStorage.getItem(key)
57
+ : null;
58
+ }
59
+ function resolveLevel() {
60
+ const override = readLocalStorage("logLevel");
61
+ const raw = override ?? configuredLevel ?? DEFAULT_LEVEL;
62
+ return LEVEL_NUM[raw] ?? LEVEL_NUM.warn;
63
+ }
64
+ function resolveFilter() {
65
+ const override = readLocalStorage("logFilter");
66
+ if (override !== null) {
67
+ return override
68
+ .split(",")
69
+ .map((s) => s.trim())
70
+ .filter(Boolean);
71
+ }
72
+ return configuredFilter ?? [];
73
+ }
74
+ function allowed(tag) {
75
+ const filter = resolveFilter();
76
+ if (filter.length === 0)
77
+ return true;
78
+ return filter.some((prefix) => tag === prefix || tag.startsWith(prefix + "."));
79
+ }
80
+ function emit(level, tag, msg, ...args) {
81
+ if (LEVEL_NUM[level] < resolveLevel())
82
+ return;
83
+ if (!allowed(tag))
84
+ return;
85
+ const prefix = `[${tag}]`;
86
+ if (level === "error")
87
+ console.error(prefix, msg, ...args);
88
+ else if (level === "warn")
89
+ console.warn(prefix, msg, ...args);
90
+ // eslint-disable-next-line no-console -- this IS the logger implementation
91
+ else
92
+ console.log(prefix, msg, ...args);
93
+ }
94
+ export const log = {
95
+ trace: (tag, msg, ...args) => emit("trace", tag, msg, ...args),
96
+ debug: (tag, msg, ...args) => emit("debug", tag, msg, ...args),
97
+ info: (tag, msg, ...args) => emit("info", tag, msg, ...args),
98
+ warn: (tag, msg, ...args) => emit("warn", tag, msg, ...args),
99
+ error: (tag, msg, ...args) => emit("error", tag, msg, ...args),
100
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=log.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.test.d.ts","sourceRoot":"","sources":["../../src/utils/log.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { configureLogging, log, resetLoggingConfig } from "./log.js";
3
+ // minimal in-memory localStorage stand-in so these tests don't depend on a DOM
4
+ // environment; log.ts only touches localStorage.getItem.
5
+ class FakeLocalStorage {
6
+ store = new Map();
7
+ getItem(key) {
8
+ return this.store.get(key) ?? null;
9
+ }
10
+ setItem(key, value) {
11
+ this.store.set(key, value);
12
+ }
13
+ removeItem(key) {
14
+ this.store.delete(key);
15
+ }
16
+ clear() {
17
+ this.store.clear();
18
+ }
19
+ }
20
+ describe("log", () => {
21
+ let consoleLog;
22
+ let consoleWarn;
23
+ let consoleError;
24
+ beforeEach(() => {
25
+ consoleLog = vi.spyOn(console, "log").mockImplementation(() => { });
26
+ consoleWarn = vi.spyOn(console, "warn").mockImplementation(() => { });
27
+ consoleError = vi.spyOn(console, "error").mockImplementation(() => { });
28
+ });
29
+ afterEach(() => {
30
+ resetLoggingConfig();
31
+ vi.unstubAllGlobals();
32
+ consoleLog.mockRestore();
33
+ consoleWarn.mockRestore();
34
+ consoleError.mockRestore();
35
+ });
36
+ it("defaults to the warn level: debug/info/trace are suppressed, warn/error are not", () => {
37
+ log.trace("app", "trace msg");
38
+ log.debug("app", "debug msg");
39
+ log.info("app", "info msg");
40
+ log.warn("app", "warn msg");
41
+ log.error("app", "error msg");
42
+ expect(consoleLog).not.toHaveBeenCalled();
43
+ expect(consoleWarn).toHaveBeenCalledTimes(1);
44
+ expect(consoleError).toHaveBeenCalledTimes(1);
45
+ });
46
+ it("configureLogging lowers the level so debug/info start emitting", () => {
47
+ configureLogging({ level: "debug" });
48
+ log.trace("app", "trace msg");
49
+ log.debug("app", "debug msg");
50
+ log.info("app", "info msg");
51
+ expect(consoleLog).toHaveBeenCalledTimes(2); // debug + info, both route through console.log
52
+ });
53
+ it("trace stays off even when the configured level is debug", () => {
54
+ configureLogging({ level: "debug" });
55
+ log.trace("app", "trace msg");
56
+ expect(consoleLog).not.toHaveBeenCalled();
57
+ });
58
+ it("trace only emits when explicitly configured", () => {
59
+ configureLogging({ level: "trace" });
60
+ log.trace("app", "trace msg");
61
+ expect(consoleLog).toHaveBeenCalledTimes(1);
62
+ });
63
+ it("resetLoggingConfig restores the default level", () => {
64
+ configureLogging({ level: "trace" });
65
+ resetLoggingConfig();
66
+ log.debug("app", "debug msg");
67
+ expect(consoleLog).not.toHaveBeenCalled();
68
+ });
69
+ it("configureLogging's filter allows only matching tag prefixes", () => {
70
+ configureLogging({ level: "debug", filter: ["p2p"] });
71
+ log.debug("p2p.transfer", "in filter");
72
+ log.debug("audio.player", "not in filter");
73
+ expect(consoleLog).toHaveBeenCalledTimes(1);
74
+ expect(consoleLog).toHaveBeenCalledWith("[p2p.transfer]", "in filter");
75
+ });
76
+ it("an empty filter (or none configured) allows every tag", () => {
77
+ configureLogging({ level: "debug" });
78
+ log.debug("anything.goes", "msg");
79
+ expect(consoleLog).toHaveBeenCalledTimes(1);
80
+ });
81
+ it("prefixes emitted messages with [tag]", () => {
82
+ log.error("share.panel", "could not build link", { reason: "boom" });
83
+ expect(consoleError).toHaveBeenCalledWith("[share.panel]", "could not build link", {
84
+ reason: "boom",
85
+ });
86
+ });
87
+ describe("localStorage overrides", () => {
88
+ beforeEach(() => {
89
+ vi.stubGlobal("localStorage", new FakeLocalStorage());
90
+ });
91
+ it("localStorage.logLevel overrides configureLogging's level", () => {
92
+ configureLogging({ level: "warn" });
93
+ localStorage.setItem("logLevel", "debug");
94
+ log.debug("app", "debug msg");
95
+ expect(consoleLog).toHaveBeenCalledTimes(1);
96
+ });
97
+ it("localStorage.logFilter overrides configureLogging's filter", () => {
98
+ configureLogging({ level: "debug", filter: ["p2p"] });
99
+ localStorage.setItem("logFilter", "audio");
100
+ log.debug("audio.player", "now allowed");
101
+ log.debug("p2p.transfer", "no longer allowed");
102
+ expect(consoleLog).toHaveBeenCalledTimes(1);
103
+ expect(consoleLog).toHaveBeenCalledWith("[audio.player]", "now allowed");
104
+ });
105
+ it("an empty localStorage.logFilter value means no filter (allow every tag)", () => {
106
+ configureLogging({ level: "debug", filter: ["p2p"] });
107
+ localStorage.setItem("logFilter", "");
108
+ log.debug("p2p.transfer", "allowed");
109
+ log.debug("audio.player", "also allowed, since an explicit empty override clears the filter");
110
+ expect(consoleLog).toHaveBeenCalledTimes(2);
111
+ });
112
+ });
113
+ });
@@ -0,0 +1,118 @@
1
+ import * as Comlink from "comlink";
2
+ import type { BlobWorkerApi } from "./blob-worker.js";
3
+ /**
4
+ * get (and lazily spawn) the comlink-wrapped blob worker proxy.
5
+ *
6
+ * returns null if Worker isn't available, or if the worker doesn't signal
7
+ * readiness within `WORKER_READY_TIMEOUT_MS` - callers should branch and use
8
+ * a main-thread fallback (every exported helper below already does this).
9
+ *
10
+ * waits for an explicit "ready" postMessage from the worker before handing
11
+ * out the Comlink proxy. this avoids a real race: the worker's module top
12
+ * level may await a wasm module's instantiation before calling
13
+ * `Comlink.expose()` (which registers the "message" listener). an RPC call
14
+ * sent before that listener exists fires with no listener attached and is
15
+ * silently dropped forever - the caller's promise then never resolves.
16
+ * waiting for the ready signal (sent immediately after `Comlink.expose()`
17
+ * in blob-worker.ts) guarantees the listener is registered before any real
18
+ * RPC call goes out.
19
+ */
20
+ export declare function getBlobWorker(): Promise<Comlink.Remote<BlobWorkerApi> | null>;
21
+ /**
22
+ * tear down the worker. mainly useful for tests; production code can leave
23
+ * the worker alive for the page lifetime.
24
+ */
25
+ export declare function shutdownBlobWorker(): void;
26
+ /**
27
+ * hash bytes with blake3, preferring the worker. accepts a Uint8Array.
28
+ * note: this DOES copy across the worker boundary (Uint8Array isn't
29
+ * transferable directly without giving up the underlying ArrayBuffer);
30
+ * for upload pipelines, prefer `processBlobBytes` which transfers the
31
+ * underlying buffer.
32
+ */
33
+ export declare function hashBlake3(data: Uint8Array): Promise<string>;
34
+ /**
35
+ * sha256 hash of an ArrayBuffer.
36
+ */
37
+ export declare function hashSha256(data: ArrayBuffer): Promise<string>;
38
+ /**
39
+ * base64-encode an ArrayBuffer.
40
+ *
41
+ * NOTE: the buffer is structured-cloned (copied) across the worker
42
+ * boundary so callers can safely reuse it afterwards. if you have a
43
+ * dedicated buffer that won't be touched again, you can transfer
44
+ * ownership manually for a small perf win.
45
+ */
46
+ export declare function base64Encode(buffer: ArrayBuffer): Promise<string>;
47
+ /**
48
+ * one-shot upload pipeline: hash + write to OPFS in the worker, return
49
+ * metadata. transfers the buffer.
50
+ */
51
+ export declare function processBlobBytes(buffer: ArrayBuffer, filename: string, mime: string): Promise<{
52
+ blob_id: string;
53
+ sha256: string;
54
+ blake3: string;
55
+ size: number;
56
+ mime: string;
57
+ filename: string;
58
+ }>;
59
+ /**
60
+ * write a blob to OPFS via the worker (uses `FileSystemSyncAccessHandle`
61
+ * for max throughput).
62
+ *
63
+ * NOTE: the buffer is structured-cloned (copied) across the worker
64
+ * boundary so callers can safely reuse it afterwards - important for
65
+ * code paths that read or return the buffer after kicking off an OPFS
66
+ * write (e.g. a snatch/download cache-back-fill). for the upload pipeline
67
+ * use `processBlobBytes` instead, which transfers.
68
+ */
69
+ export declare function writeBlobToOpfs(blobId: string, buffer: ArrayBuffer): Promise<void>;
70
+ /**
71
+ * stream a File into OPFS via the worker's chunked upload session:
72
+ * incremental blake3 + incremental sync-access-handle writes, so neither
73
+ * thread ever holds the whole payload. each chunk buffer is transferred
74
+ * (zero-copy) across the worker boundary.
75
+ *
76
+ * `onProgress` reports bytes pushed / file size (0..1) per chunk.
77
+ * `signal` cancels between chunks: the worker session is aborted (temp
78
+ * file cleaned up) and a DOMException AbortError is thrown.
79
+ *
80
+ * returns { blake3, size } - the file lands in OPFS under its blake3
81
+ * content address. throws when streaming isn't available (no worker, no
82
+ * OPFS sync handles, no midden module bundled); callers should fall back
83
+ * to the one-shot processBlobBytes path.
84
+ */
85
+ export declare function streamFileToOpfs(file: File, options?: {
86
+ onProgress?: (fraction: number) => void;
87
+ signal?: AbortSignal;
88
+ }): Promise<{
89
+ blake3: string;
90
+ size: number;
91
+ }>;
92
+ export interface ResizeImageOptions {
93
+ maxWidth?: number;
94
+ maxHeight?: number;
95
+ quality?: number;
96
+ cropSquare?: boolean;
97
+ mime?: string;
98
+ }
99
+ /**
100
+ * resize an image Blob to a (default WebP) data URL.
101
+ * prefers the blob worker (keeps the decode/encode work off the main
102
+ * thread); falls back to a main-thread `OffscreenCanvas` path if the
103
+ * worker isn't available. returns null on failure (non-image input,
104
+ * decode failure, etc.).
105
+ */
106
+ export declare function resizeImageToWebpDataUrl(blob: Blob, options?: ResizeImageOptions): Promise<string | null>;
107
+ /**
108
+ * generate a thumbnail data URL (default 200x200 WebP @ q=0.75) for an
109
+ * image Blob. delegates to the worker.
110
+ */
111
+ export declare function generateThumbnailDataUrl(blob: Blob, maxSize?: number): Promise<string | null>;
112
+ /**
113
+ * decode a base64 string into a Uint8Array via the worker. for large
114
+ * payloads (megabyte-scale snatch responses) this avoids blocking the
115
+ * main thread on a tight `String.charCodeAt` loop.
116
+ */
117
+ export declare function base64Decode(b64: string): Promise<Uint8Array>;
118
+ //# sourceMappingURL=blob-worker-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-worker-client.d.ts","sourceRoot":"","sources":["../../src/worker/blob-worker-client.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsBtD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAuDnF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAOzC;AAiCD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAInE;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAIvE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAeD;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQxF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAC1E,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAkC3C;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIxB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,SAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOhG;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQnE"}