@quereus/plugin-loader 4.6.0 → 4.8.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.
- package/README.md +38 -8
- package/dist/src/config-loader.d.ts +6 -0
- package/dist/src/config-loader.d.ts.map +1 -1
- package/dist/src/config-loader.js +2 -0
- package/dist/src/config-loader.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/node-remote.d.ts +32 -1
- package/dist/src/node-remote.d.ts.map +1 -1
- package/dist/src/node-remote.js +98 -18
- package/dist/src/node-remote.js.map +1 -1
- package/dist/src/plugin-loader.d.ts +16 -0
- package/dist/src/plugin-loader.d.ts.map +1 -1
- package/dist/src/plugin-loader.js +27 -1
- package/dist/src/plugin-loader.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -46,6 +46,9 @@ resolver from the `./node` subpath once at startup:
|
|
|
46
46
|
import { installNodeRemoteModuleResolver } from '@quereus/plugin-loader/node';
|
|
47
47
|
|
|
48
48
|
installNodeRemoteModuleResolver({
|
|
49
|
+
// The SHA-256 this URL must serve, or undefined to leave it unpinned.
|
|
50
|
+
// Consulted on every fetch; asked with the normalized URL.
|
|
51
|
+
expectedHash: url => myPluginRecords.get(url)?.sha256,
|
|
49
52
|
// Awaited after each fetch, before the module is imported.
|
|
50
53
|
onFetched: ({ url, sha256, bytes }) => console.log(`Fetched ${url} (${bytes} B, sha256 ${sha256})`),
|
|
51
54
|
maxBytes: 5 * 1024 * 1024, // default
|
|
@@ -53,14 +56,41 @@ installNodeRemoteModuleResolver({
|
|
|
53
56
|
```
|
|
54
57
|
|
|
55
58
|
The resolver fetches the module, refuses a redirect that leaves `https:`, enforces
|
|
56
|
-
the size cap, SHA-256s the bytes,
|
|
57
|
-
that file's `file:` URL. Temp files live for
|
|
58
|
-
stack traces resolve) and the directory is
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
the size cap, SHA-256s the bytes, checks them against `expectedHash`, writes them
|
|
60
|
+
to a temp file, and hands the loader that file's `file:` URL. Temp files live for
|
|
61
|
+
the life of the process (so plugin stack traces resolve) and the directory is
|
|
62
|
+
removed at exit.
|
|
63
|
+
|
|
64
|
+
**Verification is opt-in and Node-only.** With no `expectedHash`, or when it
|
|
65
|
+
returns `undefined`, the load proceeds exactly as before. When it returns a
|
|
66
|
+
digest that the fetched bytes do not match, the load fails with a
|
|
67
|
+
`PluginHashMismatchError` (exported from the package index) *before* anything is
|
|
68
|
+
written to disk, `onFetched` fires, or the module is imported — so the rejected
|
|
69
|
+
code never runs. An `expectedHash` that returns something other than 64 hex
|
|
70
|
+
characters is treated as a host bug and fails the load rather than being read as
|
|
71
|
+
"unpinned". Browsers and workers install no resolver at all — they
|
|
72
|
+
`import('https://…')` natively, with no hash check — so a host must not describe
|
|
73
|
+
pinning as a universal guarantee. Nor does it cover `file:` URLs, which never
|
|
74
|
+
reach the resolver.
|
|
75
|
+
|
|
76
|
+
`dynamicLoadModule` wraps loader failures, so callers test the wrapped error's
|
|
77
|
+
`cause`:
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { dynamicLoadModule, PluginHashMismatchError } from '@quereus/plugin-loader';
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
await dynamicLoadModule(url, db);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if ((error as Error).cause instanceof PluginHashMismatchError) { /* pin failed */ }
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
To find out what a URL serves *now* — to adopt a new version deliberately —
|
|
90
|
+
`hashRemoteModule` (also from `./node`) runs the same fetch, redirect check, and
|
|
91
|
+
size cap, but writes nothing and imports nothing. It is a separate fetch from the
|
|
92
|
+
load that follows it, so a change in between makes the pinned load fail; that
|
|
93
|
+
fails closed, which is the direction you want.
|
|
64
94
|
|
|
65
95
|
Nothing is cached on disk: each load re-downloads and re-executes the remote
|
|
66
96
|
module, so hosts should use `onFetched` to make that visible. See
|
|
@@ -9,6 +9,12 @@ import type { Database, SqlValue } from '@quereus/quereus';
|
|
|
9
9
|
export interface PluginConfig {
|
|
10
10
|
source: string;
|
|
11
11
|
config?: Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* SHA-256 (hex) the module at `source` must hash to. Enforced before the
|
|
14
|
+
* module is imported; a mismatch refuses the load. Only applies to `https:`
|
|
15
|
+
* sources fetched by the Node remote resolver.
|
|
16
|
+
*/
|
|
17
|
+
sha256?: string;
|
|
12
18
|
}
|
|
13
19
|
/**
|
|
14
20
|
* Quoomb configuration file format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM3D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM3D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACtD,KAAK,SAAS,GAAG,aAAa,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE5E;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,SAAS,CAqBhG;AAYD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAGzG;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAOvG;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CAC1C,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,GACjE,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,CAetE"}
|
|
@@ -134,6 +134,8 @@ function isValidPluginEntry(plugin) {
|
|
|
134
134
|
return false;
|
|
135
135
|
if (p.config !== undefined && p.config !== null && (typeof p.config !== 'object' || Array.isArray(p.config)))
|
|
136
136
|
return false;
|
|
137
|
+
if (p.sha256 !== undefined && typeof p.sha256 !== 'string')
|
|
138
|
+
return false;
|
|
137
139
|
return true;
|
|
138
140
|
}
|
|
139
141
|
//# sourceMappingURL=config-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,GAAG,GAAG,KAAK,CAAC,uBAAuB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* WARNING: This package uses dynamic import() which is NOT compatible with React Native.
|
|
7
7
|
* For React Native environments, use static imports and manual plugin registration instead.
|
|
8
8
|
*/
|
|
9
|
-
export { dynamicLoadModule, validatePluginUrl, loadPlugin, setRemoteModuleResolver } from './plugin-loader.js';
|
|
9
|
+
export { dynamicLoadModule, validatePluginUrl, loadPlugin, setRemoteModuleResolver, PluginHashMismatchError } from './plugin-loader.js';
|
|
10
10
|
export type { PluginModule, LoadPluginOptions, RemoteModuleFetch, RemoteModuleResolver } from './plugin-loader.js';
|
|
11
11
|
export type { PluginManifest, PluginRecord, PluginSetting, VTablePluginInfo, FunctionPluginInfo, CollationPluginInfo, TypePluginInfo, PluginRegistrations } from './manifest.js';
|
|
12
12
|
export { interpolateEnvVars, interpolateConfigEnvVars, loadPluginsFromConfig, validateConfig, toPluginSqlConfig } from './config-loader.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,MAAM,oBAAoB,CAAC;AAM5B,YAAY,EACX,cAAc,EACd,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACN,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* For React Native environments, use static imports and manual plugin registration instead.
|
|
8
8
|
*/
|
|
9
9
|
// Re-export plugin loader functions
|
|
10
|
-
export { dynamicLoadModule, validatePluginUrl, loadPlugin, setRemoteModuleResolver } from './plugin-loader.js';
|
|
10
|
+
export { dynamicLoadModule, validatePluginUrl, loadPlugin, setRemoteModuleResolver, PluginHashMismatchError } from './plugin-loader.js';
|
|
11
11
|
// Re-export config loader
|
|
12
12
|
export { interpolateEnvVars, interpolateConfigEnvVars, loadPluginsFromConfig, validateConfig, toPluginSqlConfig } from './config-loader.js';
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oCAAoC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oCAAoC;AACpC,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,MAAM,oBAAoB,CAAC;AAuB5B,0BAA0B;AAC1B,OAAO,EACN,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -12,10 +12,26 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import type { RemoteModuleFetch, RemoteModuleResolver } from './plugin-loader.js';
|
|
14
14
|
export interface NodeRemoteResolverOptions {
|
|
15
|
+
/**
|
|
16
|
+
* The SHA-256 (hex) this URL's module bytes must hash to, or undefined when
|
|
17
|
+
* the host does not pin this URL. Consulted on every fetch; a mismatch aborts
|
|
18
|
+
* the load before the module is written to disk or imported.
|
|
19
|
+
*
|
|
20
|
+
* Receives the *normalized* URL (what `new URL(x).href` produces), because
|
|
21
|
+
* that is what the loader hands the resolver — a host keyed by the raw
|
|
22
|
+
* user-typed string must normalize on its side.
|
|
23
|
+
*
|
|
24
|
+
* Pinning covers only `https:` loads: a `file:` URL never reaches the
|
|
25
|
+
* resolver, so a pin on one is inert.
|
|
26
|
+
*/
|
|
27
|
+
expectedHash?: (url: string) => string | undefined | Promise<string | undefined>;
|
|
15
28
|
/**
|
|
16
29
|
* Called after each successful fetch, before the module is imported. Hosts
|
|
17
30
|
* use it to tell the user what was downloaded and to record the hash.
|
|
18
31
|
* Awaited, so a host may persist from here.
|
|
32
|
+
*
|
|
33
|
+
* Not called when {@link NodeRemoteResolverOptions.expectedHash} rejects the
|
|
34
|
+
* bytes — a refused load reports nothing and writes nothing.
|
|
19
35
|
*/
|
|
20
36
|
onFetched?: (info: RemoteModuleFetch) => void | Promise<void>;
|
|
21
37
|
/** Reject modules larger than this. Defaults to 5 MiB. */
|
|
@@ -30,9 +46,24 @@ export interface NodeRemoteResolverOptions {
|
|
|
30
46
|
* Fetching happens on every load — there is no on-disk cache — so a plugin
|
|
31
47
|
* saved by URL re-downloads and re-executes remote code each time the host
|
|
32
48
|
* starts. That is why {@link NodeRemoteResolverOptions.onFetched} exists: the
|
|
33
|
-
* host is expected to make it visible rather than silent
|
|
49
|
+
* host is expected to make it visible rather than silent, and why
|
|
50
|
+
* {@link NodeRemoteResolverOptions.expectedHash} exists for hosts that want the
|
|
51
|
+
* fetch gated rather than merely reported.
|
|
34
52
|
*/
|
|
35
53
|
export declare function createNodeRemoteResolver(options?: NodeRemoteResolverOptions): RemoteModuleResolver;
|
|
36
54
|
/** Creates a resolver and installs it as the process-wide one. */
|
|
37
55
|
export declare function installNodeRemoteModuleResolver(options?: NodeRemoteResolverOptions): void;
|
|
56
|
+
/**
|
|
57
|
+
* Fetches a remote plugin module and returns its digest — same transport checks
|
|
58
|
+
* and size cap as the resolver, but nothing is written to disk and nothing is
|
|
59
|
+
* imported. Hosts use it to answer "what does this URL serve right now?" so a
|
|
60
|
+
* user can adopt a new version deliberately instead of running the new code to
|
|
61
|
+
* find out what it is.
|
|
62
|
+
*
|
|
63
|
+
* This is a *separate* fetch from any load that follows it: the bytes can change
|
|
64
|
+
* in between, and a pinned load then fails. That fails closed, which is the right
|
|
65
|
+
* direction, but a host must not present the digest as a promise about the next
|
|
66
|
+
* load.
|
|
67
|
+
*/
|
|
68
|
+
export declare function hashRemoteModule(url: URL, options?: Pick<NodeRemoteResolverOptions, 'maxBytes' | 'fetchImpl'>): Promise<RemoteModuleFetch>;
|
|
38
69
|
//# sourceMappingURL=node-remote.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-remote.d.ts","sourceRoot":"","sources":["../../src/node-remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-remote.d.ts","sourceRoot":"","sources":["../../src/node-remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAalF,MAAM,WAAW,yBAAyB;IACzC;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjF;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACzB;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,GAAG,oBAAoB,CActG;AAED,kEAAkE;AAClE,wBAAgB,+BAA+B,CAAC,OAAO,GAAE,yBAA8B,GAAG,IAAI,CAE7F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,GAAG,EACR,OAAO,GAAE,IAAI,CAAC,yBAAyB,EAAE,UAAU,GAAG,WAAW,CAAM,GACrE,OAAO,CAAC,iBAAiB,CAAC,CAG5B"}
|
package/dist/src/node-remote.js
CHANGED
|
@@ -16,12 +16,14 @@ import { tmpdir } from 'node:os';
|
|
|
16
16
|
import { join } from 'node:path';
|
|
17
17
|
import { pathToFileURL } from 'node:url';
|
|
18
18
|
import debug from 'debug';
|
|
19
|
-
import { setRemoteModuleResolver } from './plugin-loader.js';
|
|
19
|
+
import { PluginHashMismatchError, setRemoteModuleResolver } from './plugin-loader.js';
|
|
20
20
|
const log = debug('quereus:plugin-loader:node-remote');
|
|
21
21
|
/** Ceiling on a fetched plugin module, unless the host raises it. */
|
|
22
22
|
const DEFAULT_MAX_BYTES = 5 * 1024 * 1024;
|
|
23
23
|
/** Media types we expect a JavaScript module to be served as. */
|
|
24
24
|
const JS_MEDIA_TYPE = /(java|ecma)script/i;
|
|
25
|
+
/** A SHA-256 as the host must supply it: 64 hex characters. */
|
|
26
|
+
const SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
25
27
|
/**
|
|
26
28
|
* Builds a resolver that fetches an `https:` plugin module to a temp file and
|
|
27
29
|
* returns that file's `file:` URL.
|
|
@@ -29,26 +31,19 @@ const JS_MEDIA_TYPE = /(java|ecma)script/i;
|
|
|
29
31
|
* Fetching happens on every load — there is no on-disk cache — so a plugin
|
|
30
32
|
* saved by URL re-downloads and re-executes remote code each time the host
|
|
31
33
|
* starts. That is why {@link NodeRemoteResolverOptions.onFetched} exists: the
|
|
32
|
-
* host is expected to make it visible rather than silent
|
|
34
|
+
* host is expected to make it visible rather than silent, and why
|
|
35
|
+
* {@link NodeRemoteResolverOptions.expectedHash} exists for hosts that want the
|
|
36
|
+
* fetch gated rather than merely reported.
|
|
33
37
|
*/
|
|
34
38
|
export function createNodeRemoteResolver(options = {}) {
|
|
35
|
-
const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
36
39
|
return async (url) => {
|
|
37
|
-
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
assertSecureFinalUrl(response, url);
|
|
46
|
-
logUnexpectedMediaType(response, url);
|
|
47
|
-
const bytes = await readCappedBody(response, maxBytes, url.href);
|
|
48
|
-
const sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
49
|
-
const path = writeModuleFile(bytes, sha256);
|
|
50
|
-
await options.onFetched?.({ url: url.href, sha256, bytes: bytes.byteLength });
|
|
51
|
-
log('Fetched %s to %s (%d bytes, sha256 %s)', url.href, path, bytes.byteLength, sha256);
|
|
40
|
+
const { data, sha256 } = await fetchModuleBytes(url, options);
|
|
41
|
+
// Before anything touches disk or the module registry: bytes that fail the
|
|
42
|
+
// pin must never be written, reported, or imported.
|
|
43
|
+
await verifyExpectedHash(url, sha256, options.expectedHash);
|
|
44
|
+
const path = writeModuleFile(data, sha256);
|
|
45
|
+
await options.onFetched?.({ url: url.href, sha256, bytes: data.byteLength });
|
|
46
|
+
log('Fetched %s to %s (%d bytes, sha256 %s)', url.href, path, data.byteLength, sha256);
|
|
52
47
|
return pathToFileURL(path).href;
|
|
53
48
|
};
|
|
54
49
|
}
|
|
@@ -56,9 +51,87 @@ export function createNodeRemoteResolver(options = {}) {
|
|
|
56
51
|
export function installNodeRemoteModuleResolver(options = {}) {
|
|
57
52
|
setRemoteModuleResolver(createNodeRemoteResolver(options));
|
|
58
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Fetches a remote plugin module and returns its digest — same transport checks
|
|
56
|
+
* and size cap as the resolver, but nothing is written to disk and nothing is
|
|
57
|
+
* imported. Hosts use it to answer "what does this URL serve right now?" so a
|
|
58
|
+
* user can adopt a new version deliberately instead of running the new code to
|
|
59
|
+
* find out what it is.
|
|
60
|
+
*
|
|
61
|
+
* This is a *separate* fetch from any load that follows it: the bytes can change
|
|
62
|
+
* in between, and a pinned load then fails. That fails closed, which is the right
|
|
63
|
+
* direction, but a host must not present the digest as a promise about the next
|
|
64
|
+
* load.
|
|
65
|
+
*/
|
|
66
|
+
export async function hashRemoteModule(url, options = {}) {
|
|
67
|
+
const { data, sha256 } = await fetchModuleBytes(url, options);
|
|
68
|
+
return { url: url.href, sha256, bytes: data.byteLength };
|
|
69
|
+
}
|
|
59
70
|
// ---------------------------------------------------------------------------
|
|
60
71
|
// Internal helpers
|
|
61
72
|
// ---------------------------------------------------------------------------
|
|
73
|
+
/**
|
|
74
|
+
* The transport half both {@link createNodeRemoteResolver} and
|
|
75
|
+
* {@link hashRemoteModule} run: fetch, refuse a redirect off `https:`, cap the
|
|
76
|
+
* body, hash it. Neither writes anything — that is the caller's business.
|
|
77
|
+
*/
|
|
78
|
+
async function fetchModuleBytes(url, options) {
|
|
79
|
+
const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
80
|
+
// Resolved per call, not at construction: a host installs the resolver at
|
|
81
|
+
// startup, which may be before a `fetch` polyfill (or a test double) exists.
|
|
82
|
+
const fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
83
|
+
const response = await fetchImpl(url.toString());
|
|
84
|
+
try {
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
throw new Error(`Failed to fetch plugin module from ${url.href}: HTTP ${response.status}` +
|
|
87
|
+
(response.statusText ? ` ${response.statusText}` : ''));
|
|
88
|
+
}
|
|
89
|
+
assertSecureFinalUrl(response, url);
|
|
90
|
+
logUnexpectedMediaType(response, url);
|
|
91
|
+
const data = await readCappedBody(response, maxBytes, url.href);
|
|
92
|
+
return { data, sha256: createHash('sha256').update(data).digest('hex') };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
await discardBody(response);
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Releases the connection behind a response we are rejecting without reading.
|
|
101
|
+
* A body left unread keeps its socket occupied until the response is collected.
|
|
102
|
+
*/
|
|
103
|
+
async function discardBody(response) {
|
|
104
|
+
// Locked means a reader already owns (and has cancelled) the stream —
|
|
105
|
+
// cancelling it again throws.
|
|
106
|
+
if (!response.body || response.body.locked)
|
|
107
|
+
return;
|
|
108
|
+
await response.body.cancel().catch(error => log('Discarding a rejected body failed: %O', error));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Compares the fetched digest against what the host pinned for this URL, if
|
|
112
|
+
* anything.
|
|
113
|
+
*
|
|
114
|
+
* An expected value that is not 64 hex characters is a host bug and fails
|
|
115
|
+
* closed: silently reading it as "not pinned" would turn a typo into an
|
|
116
|
+
* unprotected load. Likewise, an `expectedHash` that throws propagates rather
|
|
117
|
+
* than degrading to "not pinned".
|
|
118
|
+
*/
|
|
119
|
+
async function verifyExpectedHash(url, sha256, expectedHash) {
|
|
120
|
+
if (!expectedHash)
|
|
121
|
+
return;
|
|
122
|
+
const expected = await expectedHash(url.href);
|
|
123
|
+
// Only "no pin at all" is a pass; an empty or malformed string is not.
|
|
124
|
+
if (expected === undefined || expected === null)
|
|
125
|
+
return;
|
|
126
|
+
const normalized = String(expected).trim().toLowerCase();
|
|
127
|
+
if (!SHA256_HEX.test(normalized)) {
|
|
128
|
+
throw new Error(`Expected SHA-256 for plugin module at ${url.href} is not 64 hex characters: ` +
|
|
129
|
+
`'${expected}'. Refusing to load it.`);
|
|
130
|
+
}
|
|
131
|
+
if (normalized !== sha256) {
|
|
132
|
+
throw new PluginHashMismatchError(url.href, normalized, sha256);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
62
135
|
/**
|
|
63
136
|
* `fetch` follows redirects across protocols, so an https → http hop would
|
|
64
137
|
* otherwise downgrade the transport silently. Re-check where the request
|
|
@@ -187,6 +260,13 @@ function ensureModuleDir() {
|
|
|
187
260
|
* NOTE: as with the `?t=` cache-buster, every reload leaves the prior module
|
|
188
261
|
* version in Node's registry. Fine for a CLI; a long-lived host that reloads
|
|
189
262
|
* plugins in a loop needs a real unload story.
|
|
263
|
+
*
|
|
264
|
+
* NOTE: `expectedHash` verifies the bytes in memory, but the import reads them
|
|
265
|
+
* back off disk — safe only because {@link ensureModuleDir} uses `mkdtemp`, so
|
|
266
|
+
* the directory is private to this user and this process. If fetched modules
|
|
267
|
+
* ever move to a shared or predictable location (a disk cache, say), the pin
|
|
268
|
+
* would be guaranteeing bytes that another writer could have replaced; verify
|
|
269
|
+
* again on read, or keep the path unguessable.
|
|
190
270
|
*/
|
|
191
271
|
function writeModuleFile(bytes, sha256) {
|
|
192
272
|
const path = join(ensureModuleDir(), `${sha256.slice(0, 16)}-${moduleCounter++}.mjs`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-remote.js","sourceRoot":"","sources":["../../src/node-remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-remote.js","sourceRoot":"","sources":["../../src/node-remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,22 @@ export interface RemoteModuleFetch {
|
|
|
16
16
|
/** Size of the fetched module, in bytes. */
|
|
17
17
|
bytes: number;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Fetched plugin bytes did not match the SHA-256 the host pinned for that URL.
|
|
21
|
+
*
|
|
22
|
+
* Lives here rather than in `node-remote.ts` so a host can `instanceof` it
|
|
23
|
+
* without importing the Node-only subpath: it is a plain `Error` subclass with
|
|
24
|
+
* no `node:` imports.
|
|
25
|
+
*/
|
|
26
|
+
export declare class PluginHashMismatchError extends Error {
|
|
27
|
+
/** The module URL that was requested, normalized (`new URL(x).href`). */
|
|
28
|
+
readonly url: string;
|
|
29
|
+
/** Lowercase hex the host required. */
|
|
30
|
+
readonly expected: string;
|
|
31
|
+
/** Lowercase hex of what was actually served. */
|
|
32
|
+
readonly actual: string;
|
|
33
|
+
constructor(url: string, expected: string, actual: string);
|
|
34
|
+
}
|
|
19
35
|
/**
|
|
20
36
|
* Turns an `https:` module URL into a specifier this runtime's `import()` can
|
|
21
37
|
* load — under Node, a `file:` URL for a locally fetched copy.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../src/plugin-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAazE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,wDAAwD;IACxD,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;CACjH;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IACjC,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAUjE,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAEnF;AA6DD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,QAAQ,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAM,GACnC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../src/plugin-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,29 @@ const log = debug('quereus:plugin-loader');
|
|
|
8
8
|
* re-used by {@link validatePluginUrl} for pre-flight UI validation.
|
|
9
9
|
*/
|
|
10
10
|
const ALLOWED_PLUGIN_PROTOCOLS = ['https:', 'file:'];
|
|
11
|
+
/**
|
|
12
|
+
* Fetched plugin bytes did not match the SHA-256 the host pinned for that URL.
|
|
13
|
+
*
|
|
14
|
+
* Lives here rather than in `node-remote.ts` so a host can `instanceof` it
|
|
15
|
+
* without importing the Node-only subpath: it is a plain `Error` subclass with
|
|
16
|
+
* no `node:` imports.
|
|
17
|
+
*/
|
|
18
|
+
export class PluginHashMismatchError extends Error {
|
|
19
|
+
/** The module URL that was requested, normalized (`new URL(x).href`). */
|
|
20
|
+
url;
|
|
21
|
+
/** Lowercase hex the host required. */
|
|
22
|
+
expected;
|
|
23
|
+
/** Lowercase hex of what was actually served. */
|
|
24
|
+
actual;
|
|
25
|
+
constructor(url, expected, actual) {
|
|
26
|
+
super(`Plugin module at ${url} does not match its pinned SHA-256. ` +
|
|
27
|
+
`Expected ${expected}, got ${actual}. Refusing to load it.`);
|
|
28
|
+
this.name = 'PluginHashMismatchError';
|
|
29
|
+
this.url = url;
|
|
30
|
+
this.expected = expected;
|
|
31
|
+
this.actual = actual;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
11
34
|
/**
|
|
12
35
|
* Module-level singleton rather than a `dynamicLoadModule` option: the loader
|
|
13
36
|
* has many call sites across the CLI and the web worker, and threading a
|
|
@@ -93,7 +116,10 @@ export async function dynamicLoadModule(url, db, config = {}) {
|
|
|
93
116
|
}
|
|
94
117
|
catch (error) {
|
|
95
118
|
const message = error instanceof Error ? error.message : String(error);
|
|
96
|
-
|
|
119
|
+
// `cause` keeps the original class reachable — without it every failure
|
|
120
|
+
// flattens to a bare Error and a caller cannot tell a hash mismatch
|
|
121
|
+
// (see {@link PluginHashMismatchError}) from a 404.
|
|
122
|
+
throw new Error(`Failed to load plugin from ${url}: ${message}`, { cause: error });
|
|
97
123
|
}
|
|
98
124
|
}
|
|
99
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/plugin-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,GAAG,GAAG,KAAK,CAAC,uBAAuB,CAAC,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/plugin-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quereus/plugin-loader",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.8.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Plugin loading system for Quereus - supports dynamic imports for Node.js and browsers",
|
|
6
6
|
"publisher": "Got Choices Foundation",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"test": "vitest run"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
|
-
"@quereus/quereus": "^4.
|
|
47
|
+
"@quereus/quereus": "^4.8.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/debug": "^4.1.13",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"vitest": "^4.0.17"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@quereus/quereus": "^4.
|
|
57
|
+
"@quereus/quereus": "^4.8.0",
|
|
58
58
|
"debug": "^4.4.3"
|
|
59
59
|
}
|
|
60
60
|
}
|