@parity/product-sdk-terminal 0.2.1 → 0.3.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/node-storage.ts"],"sourcesContent":["/**\n * File-based StorageAdapter for Node.js environments.\n *\n * Implements the @novasamatech/storage-adapter interface using JSON files\n * in ~/.polkadot-apps/. Node.js doesn't have localStorage, so this\n * provides persistent storage for the SDK's session and secret data.\n */\nimport type { StorageAdapter } from \"@novasamatech/storage-adapter\";\nimport { createLogger } from \"@parity/product-sdk-logger\";\nimport { fromPromise } from \"neverthrow\";\nimport { join } from \"node:path\";\nimport { readFile, writeFile, mkdir, unlink } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\n\nconst log = createLogger(\"terminal\");\nconst DEFAULT_STORAGE_DIR = join(homedir(), \".polkadot-apps\");\n\n/**\n * Compute the storage filename for a given appId+key pair.\n *\n * Exposed (rather than kept private) so the test-session helper in\n * `./testing.ts` can target the same file the live adapter reads from\n * without having to duplicate the sanitization rule.\n */\nexport function sanitizeKey(appId: string, key: string): string {\n return `${appId}_${key}`.replace(/[^a-zA-Z0-9_.-]/g, \"_\");\n}\n\nfunction toError(e: unknown): Error {\n return e instanceof Error ? e : new Error(String(e));\n}\n\n/**\n * Create a file-based StorageAdapter for use with the host-papp SDK in Node.js.\n *\n * Data is stored as individual JSON files in the given directory\n * (defaults to `~/.polkadot-apps/`).\n */\nexport function createNodeStorageAdapter(appId: string, storageDir?: string): StorageAdapter {\n const dir = storageDir ?? DEFAULT_STORAGE_DIR;\n let dirCreated = false;\n const subscribers = new Map<string, Set<(value: string | null) => unknown>>();\n\n function fp(key: string): string {\n return join(dir, `${sanitizeKey(appId, key)}.json`);\n }\n\n async function ensureDir(): Promise<void> {\n if (dirCreated) return;\n await mkdir(dir, { recursive: true });\n dirCreated = true;\n }\n\n function notifySubscribers(key: string, value: string | null) {\n const subs = subscribers.get(key);\n if (subs) {\n for (const cb of subs) {\n try {\n cb(value);\n } catch (e) {\n log.warn(\"storage subscriber callback threw\", { key, error: e });\n }\n }\n }\n }\n\n return {\n read(key: string) {\n return fromPromise(\n readFile(fp(key), \"utf-8\").catch((e) => {\n // Missing files are expected (a missing key reads as null);\n // log at debug so consumers can opt in to seeing reads when\n // diagnosing \"why isn't my session loading\".\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") {\n log.warn(\"storage read failed\", { key, error: e });\n } else {\n log.debug(\"storage read miss\", { key });\n }\n return null;\n }),\n toError,\n );\n },\n\n write(key: string, value: string) {\n return fromPromise(\n ensureDir()\n .then(() => writeFile(fp(key), value, \"utf-8\"))\n .then(() => {\n notifySubscribers(key, value);\n }),\n toError,\n ).map(() => undefined as undefined);\n },\n\n clear(key: string) {\n return fromPromise(\n unlink(fp(key))\n .catch(() => {})\n .then(() => {\n notifySubscribers(key, null);\n }),\n toError,\n ).map(() => undefined as undefined);\n },\n\n subscribe(key: string, callback: (value: string | null) => unknown) {\n if (!subscribers.has(key)) {\n subscribers.set(key, new Set());\n }\n subscribers.get(key)!.add(callback);\n return () => {\n subscribers.get(key)?.delete(callback);\n };\n },\n };\n}\n\nif (import.meta.vitest) {\n const { describe, test, expect, beforeEach, afterAll } = import.meta.vitest;\n const { mkdtemp, rm } = await import(\"node:fs/promises\");\n const { tmpdir } = await import(\"node:os\");\n const { configure } = await import(\"@parity/product-sdk-logger\");\n\n let testDir: string;\n\n beforeEach(async () => {\n // Silence the logger so tests that exercise the warn paths don't\n // pollute stderr with expected log output.\n configure({ handler: () => {} });\n testDir = await mkdtemp(join(tmpdir(), \"terminal-storage-test-\"));\n });\n\n afterAll(async () => {\n // Clean up any remaining test dirs\n try {\n await rm(testDir, { recursive: true });\n } catch {\n /* ignore */\n }\n });\n\n describe(\"createNodeStorageAdapter\", () => {\n test(\"read returns null for missing key\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n const result = await store.read(\"nonexistent\");\n expect(result.isOk()).toBe(true);\n expect(result._unsafeUnwrap()).toBeNull();\n });\n\n test(\"write and read round-trip\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n await store.write(\"key1\", \"hello\");\n const result = await store.read(\"key1\");\n expect(result._unsafeUnwrap()).toBe(\"hello\");\n });\n\n test(\"write overwrites existing value\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n await store.write(\"key1\", \"first\");\n await store.write(\"key1\", \"second\");\n const result = await store.read(\"key1\");\n expect(result._unsafeUnwrap()).toBe(\"second\");\n });\n\n test(\"clear removes key\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n await store.write(\"key1\", \"value\");\n await store.clear(\"key1\");\n const result = await store.read(\"key1\");\n expect(result._unsafeUnwrap()).toBeNull();\n });\n\n test(\"clear is safe for missing key\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n const result = await store.clear(\"nonexistent\");\n expect(result.isOk()).toBe(true);\n });\n\n test(\"different appIds are isolated\", async () => {\n const storeA = createNodeStorageAdapter(\"app-a\", testDir);\n const storeB = createNodeStorageAdapter(\"app-b\", testDir);\n await storeA.write(\"key\", \"from-a\");\n await storeB.write(\"key\", \"from-b\");\n expect((await storeA.read(\"key\"))._unsafeUnwrap()).toBe(\"from-a\");\n expect((await storeB.read(\"key\"))._unsafeUnwrap()).toBe(\"from-b\");\n });\n\n test(\"subscribe notifies on write\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n const values: (string | null)[] = [];\n store.subscribe(\"key1\", (v) => values.push(v));\n\n await store.write(\"key1\", \"hello\");\n expect(values).toEqual([\"hello\"]);\n });\n\n test(\"subscribe notifies on clear\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n const values: (string | null)[] = [];\n await store.write(\"key1\", \"hello\");\n store.subscribe(\"key1\", (v) => values.push(v));\n\n await store.clear(\"key1\");\n expect(values).toEqual([null]);\n });\n\n test(\"unsubscribe stops notifications\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n const values: (string | null)[] = [];\n const unsub = store.subscribe(\"key1\", (v) => values.push(v));\n\n await store.write(\"key1\", \"first\");\n unsub();\n await store.write(\"key1\", \"second\");\n\n expect(values).toEqual([\"first\"]);\n });\n\n test(\"subscriber errors do not break other subscribers\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n const values: string[] = [];\n store.subscribe(\"key1\", () => {\n throw new Error(\"boom\");\n });\n store.subscribe(\"key1\", (v) => {\n if (v) values.push(v);\n });\n\n await store.write(\"key1\", \"hello\");\n expect(values).toEqual([\"hello\"]);\n });\n\n test(\"sanitizes special characters in keys\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n await store.write(\"key/with:special chars!\", \"value\");\n const result = await store.read(\"key/with:special chars!\");\n expect(result._unsafeUnwrap()).toBe(\"value\");\n });\n\n test(\"handles JSON values\", async () => {\n const store = createNodeStorageAdapter(\"test\", testDir);\n const obj = { name: \"test\", count: 42, nested: { ok: true } };\n await store.write(\"json\", JSON.stringify(obj));\n const raw = (await store.read(\"json\"))._unsafeUnwrap();\n expect(JSON.parse(raw!)).toEqual(obj);\n });\n });\n\n describe(\"toError\", () => {\n test(\"returns Error instances unchanged\", () => {\n const original = new TypeError(\"boom\");\n expect(toError(original)).toBe(original);\n });\n\n test(\"wraps non-Error string values\", () => {\n const result = toError(\"primitive failure\");\n expect(result).toBeInstanceOf(Error);\n expect(result.message).toBe(\"primitive failure\");\n });\n\n test(\"wraps non-Error nullish values\", () => {\n const result = toError(null);\n expect(result).toBeInstanceOf(Error);\n expect(result.message).toBe(\"null\");\n });\n });\n}\n"],"mappings":"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","names":[]}
package/dist/loader.mjs DELETED
@@ -1,76 +0,0 @@
1
- /**
2
- * Node.js ESM loader hook that redirects `verifiablejs/bundler` imports
3
- * to the nodejs WASM build (which loads .wasm from disk instead of inline).
4
- *
5
- * The host-papp SDK imports `verifiablejs/bundler` which inlines .wasm —
6
- * this doesn't work in Node.js. The nodejs build loads .wasm from the
7
- * filesystem instead.
8
- */
9
- import { createRequire } from "node:module";
10
- import { dirname, join } from "node:path";
11
- import { existsSync } from "node:fs";
12
-
13
- // Find verifiablejs/pkg-nodejs by walking node_modules from host-papp
14
- let nodejsEntry = null;
15
- let hostPappFound = false;
16
- try {
17
- const require = createRequire(join(process.cwd(), "_"));
18
- const hostPappPath = dirname(require.resolve("@novasamatech/host-papp"));
19
- hostPappFound = true;
20
-
21
- let dir = hostPappPath;
22
- for (let i = 0; i < 10; i++) {
23
- const candidate = join(dir, "node_modules", "verifiablejs", "pkg-nodejs", "verifiablejs.js");
24
- if (existsSync(candidate)) {
25
- nodejsEntry = candidate;
26
- break;
27
- }
28
- const parent = dirname(dir);
29
- if (parent === dir) break;
30
- dir = parent;
31
- }
32
- } catch {
33
- // host-papp not installed — loader is a no-op (legitimate during smoke tests).
34
- }
35
-
36
- if (hostPappFound && !nodejsEntry) {
37
- // Found host-papp but couldn't locate verifiablejs/pkg-nodejs after the walk-up.
38
- // Subsequent imports of `verifiablejs/bundler` will resolve to the inline-WASM
39
- // build and fail at import time with a cryptic loader error. Warn early.
40
- //
41
- // Uses raw console.warn (rather than @parity/product-sdk-logger) because this
42
- // loader runs before any user code has had a chance to call `configure()` on
43
- // the logger — routing through the logger would emit via the *default*
44
- // handler (console.warn) anyway, with extra import overhead for nothing.
45
- console.warn(
46
- "[@parity/product-sdk-terminal/register] Found @novasamatech/host-papp but could not locate verifiablejs/pkg-nodejs/verifiablejs.js after walking 10 directories. The Node.js WASM patch will not be applied — host-papp imports may fail. Check that verifiablejs is hoisted into a node_modules dir near host-papp.",
47
- );
48
- }
49
-
50
- export async function resolve(specifier, context, nextResolve) {
51
- if (specifier === "verifiablejs/bundler" && nodejsEntry) {
52
- return { shortCircuit: true, url: "verifiablejs-node://shim" };
53
- }
54
- return nextResolve(specifier, context);
55
- }
56
-
57
- export async function load(url, context, nextLoad) {
58
- if (url === "verifiablejs-node://shim") {
59
- // The shim runs in the main thread. It loads the CJS module via
60
- // createRequire with the path we resolved in the loader thread.
61
- const source = `
62
- import { createRequire } from "node:module";
63
- const _require = createRequire(${JSON.stringify(nodejsEntry)});
64
- const _mod = _require(${JSON.stringify(nodejsEntry)});
65
- export const sign = _mod.sign;
66
- export const member_from_entropy = _mod.member_from_entropy;
67
- export const members_intermediate = _mod.members_intermediate;
68
- export const verify_signature = _mod.verify_signature;
69
- export const members_root = _mod.members_root;
70
- export const validate = _mod.validate;
71
- export default _mod;
72
- `;
73
- return { shortCircuit: true, format: "module", source };
74
- }
75
- return nextLoad(url, context);
76
- }
@@ -1,2 +0,0 @@
1
-
2
- export { }
package/dist/register.js DELETED
@@ -1,9 +0,0 @@
1
- // src/register.ts
2
- import { register } from "module";
3
- import { pathToFileURL } from "url";
4
- import { dirname, join } from "path";
5
- import { fileURLToPath } from "url";
6
- var __dirname = dirname(fileURLToPath(import.meta.url));
7
- var loaderPath = join(__dirname, "loader.mjs");
8
- register(pathToFileURL(loaderPath).href, { parentURL: import.meta.url });
9
- //# sourceMappingURL=register.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/register.ts"],"sourcesContent":["/**\n * Register the verifiablejs Node.js loader hook.\n *\n * Must be loaded BEFORE the application entry point so the loader\n * intercepts `verifiablejs/bundler` imports from the host-papp SDK.\n *\n * @example\n * ```bash\n * node --import @parity/product-sdk-terminal/register app.js\n * tsx --import @parity/product-sdk-terminal/register app.ts\n * ```\n */\nimport { register } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst loaderPath = join(__dirname, \"loader.mjs\");\n\nregister(pathToFileURL(loaderPath).href, { parentURL: import.meta.url });\n"],"mappings":";AAYA,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,aAAa,KAAK,WAAW,YAAY;AAE/C,SAAS,cAAc,UAAU,EAAE,MAAM,EAAE,WAAW,YAAY,IAAI,CAAC;","names":[]}
@@ -1,27 +0,0 @@
1
- #!/bin/bash
2
- # Patch verifiablejs/bundler to load WASM via base64 embed instead of inline import.
3
- # Required for bun runtime. Node.js/tsx users should use the ESM loader hook instead:
4
- # --import @polkadot-apps/terminal/register
5
-
6
- BUNDLER_JS=$(find node_modules -path "*/verifiablejs/pkg-bundler/verifiablejs.js" 2>/dev/null | head -1)
7
- [ -z "$BUNDLER_JS" ] && exit 0
8
-
9
- # Skip if already patched
10
- head -1 "$BUNDLER_JS" | grep -q "__wbg_set_wasm" && exit 0
11
-
12
- BUNDLER_DIR=$(dirname "$BUNDLER_JS")
13
- # -w 0 disables line wrapping on Linux; -i is macOS flag
14
- WASM_B64=$(base64 -w 0 "$BUNDLER_DIR/verifiablejs_bg.wasm" 2>/dev/null || base64 -i "$BUNDLER_DIR/verifiablejs_bg.wasm" 2>/dev/null || base64 "$BUNDLER_DIR/verifiablejs_bg.wasm")
15
-
16
- cat > "$BUNDLER_JS" << SHIM
17
- import { __wbg_set_wasm } from "./verifiablejs_bg.js";
18
- import * as bg from "./verifiablejs_bg.js";
19
-
20
- const wasmBytes = Uint8Array.from(atob("$WASM_B64"), c => c.charCodeAt(0));
21
- const wasmModule = new WebAssembly.Module(wasmBytes);
22
- const wasmInstance = new WebAssembly.Instance(wasmModule, { "./verifiablejs_bg.js": bg });
23
- __wbg_set_wasm(wasmInstance.exports);
24
- wasmInstance.exports.__wbindgen_start();
25
-
26
- export * from "./verifiablejs_bg.js";
27
- SHIM