@discord-player/plugin-host 8.0.0-dev.0 → 8.0.0-dev.1

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/dist/index.d.ts CHANGED
@@ -14,3 +14,4 @@ export * from './host.js';
14
14
  export * from './protocol.js';
15
15
  export { cloneJSONValue } from './utils/serialization.js';
16
16
  export { SafeEventEmitter, type EventMap } from './utils/safe-event-emitter.js';
17
+ export type { MediaAccessPolicy } from './media.js';
@@ -0,0 +1,15 @@
1
+ /** Access limits for remote media materialization. Providers execute trusted code; this is not a plugin sandbox. */
2
+ export interface MediaAccessPolicy {
3
+ /** Permit private and loopback destinations, including redirects. Default false. */
4
+ allowPrivateNetworks?: boolean;
5
+ /** Optional exact hostname allowlist, also applied to redirects. */
6
+ allowedHosts?: readonly string[];
7
+ /** Authorized file roots. Default empty; roots and their parents must be administrator-owned. */
8
+ allowedFileRoots?: readonly string[];
9
+ /** Maximum encoded bytes per response. Default 512 MiB. */
10
+ maxBytes?: number;
11
+ /** Maximum simultaneous streams per host. Default 32. */
12
+ maxConcurrent?: number;
13
+ /** Whole-stream deadline in milliseconds, including DNS and connection. Default 30 minutes. */
14
+ timeoutMs?: number;
15
+ }
package/dist/media.js ADDED
@@ -0,0 +1,193 @@
1
+ import { lookup } from 'node:dns/promises';
2
+ import { request as httpRequest } from 'node:http';
3
+ import { request as httpsRequest } from 'node:https';
4
+ import { BlockList, isIP } from 'node:net';
5
+ import { open, realpath } from 'node:fs/promises';
6
+ import { relative, isAbsolute, sep } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { Readable, Transform, addAbortSignal, pipeline } from 'node:stream';
9
+ const active = new WeakMap();
10
+ const denied = new BlockList();
11
+ const deniedV6 = new BlockList();
12
+ deniedV6.addSubnet('2001::', 23, 'ipv6');
13
+ deniedV6.addSubnet('2001:db8::', 32, 'ipv6');
14
+ deniedV6.addSubnet('2002::', 16, 'ipv6');
15
+ deniedV6.addSubnet('3fff::', 20, 'ipv6');
16
+ for (const [address, prefix] of [
17
+ ['0.0.0.0', 8],
18
+ ['10.0.0.0', 8],
19
+ ['100.64.0.0', 10],
20
+ ['127.0.0.0', 8],
21
+ ['169.254.0.0', 16],
22
+ ['172.16.0.0', 12],
23
+ ['192.0.0.0', 24],
24
+ ['192.0.2.0', 24],
25
+ ['192.168.0.0', 16],
26
+ ['198.18.0.0', 15],
27
+ ['198.51.100.0', 24],
28
+ ['203.0.113.0', 24],
29
+ ['224.0.0.0', 3],
30
+ ])
31
+ denied.addSubnet(address, prefix);
32
+ function publicAddress(address) {
33
+ if (isIP(address) === 4)
34
+ return !denied.check(address, 'ipv4');
35
+ // Only global unicast IPv6; reject transition/mapped forms and documentation ranges.
36
+ return /^[23][0-9a-f]{3}:/i.test(address) && !deniedV6.check(address, 'ipv6');
37
+ }
38
+ function positive(value) {
39
+ if (!Number.isSafeInteger(value) || value < 1)
40
+ throw new RangeError('Invalid media resource limit');
41
+ return value;
42
+ }
43
+ /** Validate URL policy and resolve the exact address used for a connection.
44
+ * @internal
45
+ * @param url Provider URL.
46
+ * @param policy Host access policy.
47
+ * @param signal Caller lifetime.
48
+ * @returns Validated destination; callers opening sockets must pin this address.
49
+ */
50
+ export async function authorizeMediaURL(url, policy, signal) {
51
+ if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
52
+ throw new Error('Media requires an HTTP(S) URL without user credentials');
53
+ const hostname = url.hostname.replace(/^\[|\]$/g, '');
54
+ if (policy.allowedHosts && !policy.allowedHosts.includes(hostname))
55
+ throw new Error('Media hostname denied');
56
+ signal.throwIfAborted();
57
+ const addresses = await new Promise((resolve, reject) => {
58
+ const abort = () => reject(signal.reason);
59
+ signal.addEventListener('abort', abort, { once: true });
60
+ lookup(hostname, { all: true })
61
+ .then(resolve, reject)
62
+ .finally(() => signal.removeEventListener('abort', abort));
63
+ });
64
+ signal.throwIfAborted();
65
+ if (!addresses.length || (!policy.allowPrivateNetworks && addresses.some(({ address }) => !publicAddress(address))))
66
+ throw new Error('Media destination denied');
67
+ const selected = addresses[0];
68
+ return selected;
69
+ }
70
+ async function remote(url, policy, signal, redirects = 0) {
71
+ const selected = await authorizeMediaURL(url, policy, signal);
72
+ const response = await new Promise((resolve, reject) => {
73
+ const req = (url.protocol === 'https:' ? httpsRequest : httpRequest)(url, {
74
+ signal,
75
+ // Pin the checked address; keep the original Host and TLS server name. No second DNS lookup.
76
+ lookup: (_hostname, options, callback) => {
77
+ if (options.all)
78
+ callback(null, [selected]);
79
+ else
80
+ callback(null, selected.address, selected.family);
81
+ },
82
+ headers: { 'accept-encoding': 'identity' },
83
+ }, resolve);
84
+ req.once('error', reject);
85
+ req.setTimeout(30000, () => req.destroy(new Error('Media upstream idle timeout')));
86
+ req.end();
87
+ });
88
+ if ([301, 302, 303, 307, 308].includes(response.statusCode ?? 0)) {
89
+ const location = response.headers.location;
90
+ response.destroy();
91
+ if (!location || redirects >= 5)
92
+ throw new Error('Invalid media redirect');
93
+ const target = new URL(location, url);
94
+ if (url.protocol === 'https:' && target.protocol !== 'https:')
95
+ throw new Error('Media TLS downgrade denied');
96
+ return remote(target, policy, signal, redirects + 1);
97
+ }
98
+ if (response.statusCode !== 200) {
99
+ response.destroy();
100
+ throw new Error(`Media upstream returned ${response.statusCode}`);
101
+ }
102
+ return response;
103
+ }
104
+ /** Open bounded encoded media under a host policy. No whole-response buffering occurs.
105
+ * @internal
106
+ * @param source Trusted provider result, potentially containing an untrusted location.
107
+ * @param policy Host authorization and resource limits.
108
+ * @param signal Resolution/consumer lifetime.
109
+ * @returns Owned stream; close, abort, errors and deadlines release upstream resources.
110
+ */
111
+ export async function openMedia(source, policy, signal) {
112
+ const maxBytes = positive(policy.maxBytes ?? 512 * 1024 * 1024);
113
+ const maxConcurrent = positive(policy.maxConcurrent ?? 32);
114
+ const timeout = positive(policy.timeoutMs ?? 1800000);
115
+ const expiration = 'expiresAtMs' in source ? Number(source.expiresAtMs) : undefined;
116
+ if (expiration !== undefined && (!Number.isFinite(expiration) || expiration <= Date.now())) {
117
+ if ('stream' in source)
118
+ source.stream.destroy();
119
+ throw new Error('Media source credentials have expired; resolve the source again');
120
+ }
121
+ if ((active.get(policy) ?? 0) >= maxConcurrent) {
122
+ if ('stream' in source)
123
+ source.stream.destroy();
124
+ throw new Error('Media concurrency limit reached');
125
+ }
126
+ active.set(policy, (active.get(policy) ?? 0) + 1);
127
+ const controller = new AbortController();
128
+ const lifetime = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;
129
+ const timer = setTimeout(() => controller.abort(new Error('Media deadline exceeded')), timeout);
130
+ timer.unref();
131
+ let input;
132
+ let released = false;
133
+ const release = () => {
134
+ if (released)
135
+ return;
136
+ released = true;
137
+ clearTimeout(timer);
138
+ active.set(policy, (active.get(policy) ?? 1) - 1);
139
+ input?.destroy();
140
+ };
141
+ try {
142
+ lifetime.throwIfAborted();
143
+ if ('stream' in source)
144
+ input = source.stream;
145
+ else if ('buffer' in source)
146
+ input = Readable.from([source.buffer]);
147
+ else if ('file' in source) {
148
+ const path = await realpath(source.file.startsWith('file:') ? fileURLToPath(source.file) : source.file);
149
+ const roots = await Promise.all((policy.allowedFileRoots ?? []).map((root) => realpath(root)));
150
+ if (!roots.some((root) => {
151
+ const rel = relative(root, path);
152
+ return rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
153
+ }))
154
+ throw new Error('Media file outside allowed roots');
155
+ const file = await open(path, 'r');
156
+ try {
157
+ if (!(await file.stat()).isFile())
158
+ throw new Error('Media path is not a regular file');
159
+ input = file.createReadStream();
160
+ }
161
+ catch (error) {
162
+ await file.close();
163
+ throw error;
164
+ }
165
+ }
166
+ else if ('url' in source)
167
+ input = await remote(new URL(source.url), policy, lifetime);
168
+ else
169
+ throw new Error('A source host cannot materialize another operation source');
170
+ lifetime.throwIfAborted();
171
+ let bytes = 0;
172
+ const output = new Transform({
173
+ destroy(error, callback) {
174
+ release();
175
+ callback(error);
176
+ },
177
+ transform(chunk, _encoding, callback) {
178
+ bytes += chunk.length;
179
+ callback(bytes > maxBytes ? new Error('Media byte limit exceeded') : null, chunk);
180
+ },
181
+ });
182
+ output.once('close', release);
183
+ addAbortSignal(lifetime, output);
184
+ pipeline(input, output, () => { });
185
+ return { stream: output, ...(expiration === undefined ? {} : { expiresAtMs: expiration }) };
186
+ }
187
+ catch (error) {
188
+ controller.abort();
189
+ release();
190
+ throw error;
191
+ }
192
+ }
193
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,25 @@
1
1
  import { Readable } from 'node:stream';
2
2
  import { PluginError } from './plugin-error.js';
3
+ /** Select active, permitted handlers using the dispatcher's own routing rules.
4
+ * @internal
5
+ * @param operation Operation being inspected.
6
+ * @param input Routing input.
7
+ * @param options Provider targeting and block list.
8
+ * @param state Current registry state.
9
+ * @returns Ordered applicable subscriptions without invoking them.
10
+ */
11
+ export function selectHandlers(operation, input, options, state) {
12
+ return state.handlers
13
+ .filter((handler) => handler.operation === operation &&
14
+ handler.entry.active &&
15
+ (!options.pluginId || handler.entry.id === options.pluginId) &&
16
+ !options.blocked?.includes(handler.entry.id) &&
17
+ !state.blocked().includes(handler.entry.id) &&
18
+ (!input.protocol ||
19
+ !handler.protocols?.length ||
20
+ handler.protocols.includes(input.protocol)))
21
+ .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0) || a.order - b.order);
22
+ }
3
23
  /** Dispatch a typed operation against initialized host state.
4
24
  * @internal
5
25
  * @param operation Operation name.
@@ -14,16 +34,7 @@ export async function dispatchOperation(operation, input, options, state, handle
14
34
  if (!policy) {
15
35
  throw new Error(`Undefined operation: ${operation}`);
16
36
  }
17
- const handlers = state.handlers
18
- .filter((handler) => handler.operation === operation &&
19
- handler.entry.active &&
20
- (!options.pluginId || handler.entry.id === options.pluginId) &&
21
- !options.blocked?.includes(handler.entry.id) &&
22
- !state.blocked().includes(handler.entry.id) &&
23
- (!input.protocol ||
24
- !handler.protocols?.length ||
25
- handler.protocols.includes(input.protocol)))
26
- .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0) || a.order - b.order);
37
+ const handlers = selectHandlers(operation, input, options, state);
27
38
  const results = [];
28
39
  let value = input;
29
40
  for (const handler of handlers) {
@@ -1 +1 @@
1
- {"version":3,"file":"operation-dispatch.js","sourceRoot":"","sources":["../../src/plugins/operation-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operation-dispatch.js","sourceRoot":"","sources":["../../src/plugins/operation-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAwB,EACxB,KAAc,EACd,OAAuB,EACvB,KAAoB;IAEpB,OAAO,KAAK,CAAC,QAAQ;SAClB,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,SAAS,KAAK,SAAS;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM;QACpB,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC;QAC5D,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,CAAC,CAAE,KAA+B,CAAC,QAAQ;YACzC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;YAC1B,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,KAA8B,CAAC,QAAQ,CAAC,CAAC,CAC1E;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAY,EACZ,KAAwB,EACxB,OAAuB,EACvB,KAAoB,EACpB,OAAyB;IAEzB,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,IAAI,KAAK,GAAY,KAAK,CAAC;IAE3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;YAC3B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACpE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAEpC,MAAM,CAAC,cAAc,EAAE,CAAC;QAExB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1C,MAAM,CAAC,cAAc,EAAE,CAAC;YAExB,OAAO,OAAO,CAAC,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,MAAe,CAAC;QAEpB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC;YAEvB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;oBAC/B,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,CAAC;qBAAM,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,YAAY,QAAQ,EAAE,CAAC;oBAC3G,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,CAAC;gBAED,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,MAAM,CAAC,MAAM,CAAC;YACtB,CAAC;YAED,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,SAAS,KAAK,sBAAsB,IAAI,SAAS,KAAK,eAAe,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC/F,KAAK,MAAM,KAAK,IAAK,MAA8B,CAAC,MAAM,EAAE,CAAC;gBAC3D,KAAK,CAAC,eAAe,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;YACrF,CAAC;QACH,CAAC;QAED,IAAI,SAAS,KAAK,oBAAoB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1D,MAAM,GAAG,EAAE,GAAI,MAAiB,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACjE,CAAC;QAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAE1B,IACE,CAAC,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,cAAc,CAAC;gBAC9D,MAAM,KAAK,IAAI;gBACf,OAAO,MAAM,KAAK,QAAQ,EAC1B,CAAC;gBACD,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;gBAChD,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAE7C,OAAO,MAA4B,CAAC;QACtC,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,oBAAoB,EAAE,CAAC;QACvC,mEAAmE;QACnE,MAAM,QAAQ,GAAG,CAAC,EAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC;QAErG,OAAO,CAAC,IAAI,CACV,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CACjB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,CACrG,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAuB,CAAC;AACxG,CAAC"}
@@ -9,6 +9,7 @@ export type { ExecuteOptions, StreamResolutionOptions } from './execution-option
9
9
  export declare class PluginRegistry {
10
10
  readonly player: LegacyPlayerContext;
11
11
  private readonly blocked;
12
+ private readonly hostId?;
12
13
  private entries;
13
14
  private handlers;
14
15
  private order;
@@ -17,8 +18,9 @@ export declare class PluginRegistry {
17
18
  /** Create an independent host.
18
19
  * @param player Structural source context.
19
20
  * @param blocked Default disabled source IDs supplied by the owning Player.
21
+ * @param hostId Owning deployment, absent in ordinary embedded execution.
20
22
  */
21
- constructor(player: LegacyPlayerContext, blocked?: () => readonly string[]);
23
+ constructor(player: LegacyPlayerContext, blocked?: () => readonly string[], hostId?: string | undefined);
22
24
  private definitions;
23
25
  /** Define a declaration-merged operation before registering handlers.
24
26
  * @param name Operation name.
@@ -1,11 +1,12 @@
1
1
  import { PluginError } from './plugin-error.js';
2
- import { dispatchOperation } from './operation-dispatch.js';
2
+ import { dispatchOperation, selectHandlers } from './operation-dispatch.js';
3
3
  import { resolveTrackStream } from './stream-resolver.js';
4
4
  export { PluginError } from './plugin-error.js';
5
5
  /** Context-owned source execution registry. Removal aborts and drains calls before teardown. */
6
6
  export class PluginRegistry {
7
7
  player;
8
8
  blocked;
9
+ hostId;
9
10
  entries = new Map();
10
11
  handlers = [];
11
12
  order = 0;
@@ -14,10 +15,12 @@ export class PluginRegistry {
14
15
  /** Create an independent host.
15
16
  * @param player Structural source context.
16
17
  * @param blocked Default disabled source IDs supplied by the owning Player.
18
+ * @param hostId Owning deployment, absent in ordinary embedded execution.
17
19
  */
18
- constructor(player, blocked = () => []) {
20
+ constructor(player, blocked = () => [], hostId) {
19
21
  this.player = player;
20
22
  this.blocked = blocked;
23
+ this.hostId = hostId;
21
24
  }
22
25
  definitions = new Map([
23
26
  ['search.query.match', 'collect'],
@@ -208,22 +211,47 @@ export class PluginRegistry {
208
211
  return this.run(operation, input, options);
209
212
  }
210
213
  async run(operation, input, options, handled) {
214
+ const track = input && typeof input === 'object' && 'track' in input ? input.track : undefined;
215
+ if (track?.sourceReference?.hostId && track.sourceReference.hostId !== this.hostId) {
216
+ throw new Error(`Source host ${track.sourceReference.hostId} is unavailable in this runtime; execute this Track on its owning source host`);
217
+ }
211
218
  options.signal?.throwIfAborted();
212
219
  await this.ready();
213
220
  options.signal?.throwIfAborted();
214
- return dispatchOperation(operation, input, options, {
221
+ const result = await dispatchOperation(operation, input, options, {
215
222
  handlers: this.handlers,
216
223
  definitions: this.definitions,
217
224
  blocked: () => this.blocked(),
218
225
  resultOwners: this.resultOwners,
219
226
  }, handled);
227
+ if (this.hostId && result && (operation === 'search.query.resolve' || operation === 'track.related')) {
228
+ for (const item of result.tracks) {
229
+ if (item.sourceReference)
230
+ item.sourceReference.hostId = this.hostId;
231
+ }
232
+ }
233
+ return result;
234
+ }
235
+ /** Inspect byte transformations using the same selection rules as execution.
236
+ * @internal
237
+ * @param pluginId Actual stream owner; absent means unrestricted dispatch.
238
+ * @param options Additional provider blocking.
239
+ * @returns Whether a byte transformation would be invoked.
240
+ */
241
+ hasStreamTransforms(pluginId, options = {}) {
242
+ return (selectHandlers('stream.transform', {}, { ...options, pluginId }, {
243
+ handlers: this.handlers,
244
+ definitions: this.definitions,
245
+ blocked: () => this.blocked(),
246
+ resultOwners: this.resultOwners,
247
+ }).length > 0);
220
248
  }
221
249
  /** Resolve and normalize a track for the already selected Remedia node.
222
250
  * @param track Data model with a portable provider reference.
223
251
  * @param options Target node mode and cancellation.
224
252
  */
225
253
  async resolveStream(track, options = {}) {
226
- return resolveTrackStream(track, options, (operation, input, execution, handled) => this.run(operation, input, execution, handled));
254
+ return resolveTrackStream(track, options, (operation, input, execution, handled) => this.run(operation, input, execution, handled), (owner) => this.hasStreamTransforms(owner, options));
227
255
  }
228
256
  }
229
257
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,17 @@
1
1
  import { Readable } from 'node:stream';
2
2
  import { PluginError } from './plugin-error.js';
3
+ /** Transport must defer this resolution until its media grant is redeemed. @internal */
4
+ export class DeferredSourceRequired extends Error {
5
+ }
3
6
  /** Resolve, transform and own playable media for a selected Remedia node.
4
7
  * @internal
5
8
  * @param track Track metadata and source reference.
6
9
  * @param options Selected node mode and playback lifetime.
7
10
  * @param run Shared operation runner.
11
+ * @param hasTransforms Inspect applicable transformations for the resolved owner.
8
12
  * @returns Normalized playable media source.
9
13
  */
10
- export async function resolveTrackStream(track, options, run) {
14
+ export async function resolveTrackStream(track, options, run, hasTransforms) {
11
15
  const pluginId = track.sourceReference?.pluginId;
12
16
  let owner = pluginId;
13
17
  let lifetime;
@@ -17,6 +21,8 @@ export async function resolveTrackStream(track, options, run) {
17
21
  };
18
22
  let result = await run('track.stream', { track }, { ...options, pluginId }, handled);
19
23
  if (result === undefined) {
24
+ if (options.directUrlOnly)
25
+ throw new DeferredSourceRequired();
20
26
  result = await run('track.bridge', { track, sourcePluginId: pluginId }, options, handled);
21
27
  }
22
28
  if (result === undefined) {
@@ -29,6 +35,15 @@ export async function resolveTrackStream(track, options, run) {
29
35
  : result instanceof Readable
30
36
  ? { stream: result }
31
37
  : result;
38
+ if (options.directUrlOnly) {
39
+ if (!('url' in source)) {
40
+ if ('stream' in source)
41
+ source.stream.destroy();
42
+ throw new Error('A directUrlProviders entry must return only URLs; remove it to use lazy media grants');
43
+ }
44
+ if (hasTransforms(owner))
45
+ throw new DeferredSourceRequired();
46
+ }
32
47
  const signal = options.signal && lifetime ? AbortSignal.any([options.signal, lifetime]) : (options.signal ?? lifetime);
33
48
  if (options.prepareSource) {
34
49
  try {
@@ -51,13 +66,15 @@ export async function resolveTrackStream(track, options, run) {
51
66
  };
52
67
  try {
53
68
  signal?.throwIfAborted();
69
+ if (options.directUrlOnly && hasTransforms(owner))
70
+ throw new DeferredSourceRequired();
54
71
  if (options.remote && ('stream' in source || 'buffer' in source)) {
55
72
  throw new PluginError(owner ?? 'unknown', 'track.stream', new Error('Remote Remedia requires a server-accessible URL or file; client Readables and buffers are unsupported.'));
56
73
  }
57
74
  if ('stream' in source) {
58
75
  const transformed = await run('stream.transform', { track, stream: source.stream }, { ...options, pluginId: owner });
59
76
  if (transformed) {
60
- source = { stream: transformed.stream };
77
+ source = { ...source, stream: transformed.stream };
61
78
  streams.add(transformed.stream);
62
79
  }
63
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream-resolver.js","sourceRoot":"","sources":["../../src/plugins/stream-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream-resolver.js","sourceRoot":"","sources":["../../src/plugins/stream-resolver.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ import type { JSONValue } from '../utils/serialization.js';
7
7
  import type { LegacyPlayerContext } from '../legacy-player.js';
8
8
  /** Serializable provider identity; never put credentials or live objects in this payload. */
9
9
  export type SourceReference = {
10
+ /** Deployment identity, separate from the provider ID. Omit for ordinary embedded sources. */
11
+ hostId?: string;
10
12
  /** Registered source plugin ID. */
11
13
  pluginId: string;
12
14
  /** Provider-specific portable data, usually a public URL or identifier. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AA6NA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,UAA2C;IAE3C,OAAO,CAAC,CAAC,OAAO,GAAY,EAAa,EAAE,EAAE,CAAC,CAAC;QAC7C,UAAU;QACV,OAAO;KACR,CAAC,CAA2B,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAgOA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,UAA2C;IAE3C,OAAO,CAAC,CAAC,OAAO,GAAY,EAAa,EAAE,EAAE,CAAC,CAAC;QAC7C,UAAU;QACV,OAAO;KACR,CAAC,CAA2B,CAAC;AAChC,CAAC"}
@@ -1,8 +1,8 @@
1
- import { type SerializedTrack } from './structures/track.js';
1
+ import { Track, type SerializedTrack } from './structures/track.js';
2
2
  import { type SerializedPlaylist } from './structures/playlist.js';
3
3
  import { SearchResult } from './structures/search-result.js';
4
4
  /** Versioned metadata plus an optional, expiring host-owned process-state hint.
5
- * Keep this whole payload when requesting source.stream; the hint is never required for persistence.
5
+ * Use serializeSourceTrack() for operation requests; serialize() deliberately omits the hint.
6
6
  */
7
7
  export type PortableSourceTrack = SerializedTrack & {
8
8
  /** Opaque source-host state reference. Never identifies credentials or stream resources. */
@@ -16,8 +16,13 @@ export interface PortableSourceResult {
16
16
  playlist: SerializedPlaylist | null;
17
17
  }
18
18
  /** Reconstruct source-host metadata in a consumer process without restoring private extractor objects.
19
- * Keep the original portable tracks separately when requesting media, to retain ephemeral state hints.
19
+ * The normal Track retains the transient hint without requiring a second representation.
20
20
  * @param result HTTP result payload (after unwrapping Remedia's handled/result envelope).
21
21
  * @returns Shared model instances suitable for application metadata display and persistence.
22
22
  */
23
23
  export declare function deserializeSourceResult(result: PortableSourceResult): SearchResult;
24
+ /** Encode a queued Track for a host operation, retaining its transient state hint.
25
+ * @param track Normal model from search, queue, or history.
26
+ * @returns Portable metadata with an optional opaque state token. Persistence should use serialize().
27
+ */
28
+ export declare function serializeSourceTrack(track: Track): PortableSourceTrack;
package/dist/protocol.js CHANGED
@@ -3,7 +3,7 @@ import { Playlist } from './structures/playlist.js';
3
3
  import { SearchResult } from './structures/search-result.js';
4
4
  import { deserialize } from './utils/serde.js';
5
5
  /** Reconstruct source-host metadata in a consumer process without restoring private extractor objects.
6
- * Keep the original portable tracks separately when requesting media, to retain ephemeral state hints.
6
+ * The normal Track retains the transient hint without requiring a second representation.
7
7
  * @param result HTTP result payload (after unwrapping Remedia's handled/result envelope).
8
8
  * @returns Shared model instances suitable for application metadata display and persistence.
9
9
  */
@@ -12,6 +12,9 @@ export function deserializeSourceResult(result) {
12
12
  const track = deserialize(entity);
13
13
  if (!(track instanceof Track))
14
14
  throw new TypeError('Expected source Track metadata');
15
+ if (_state !== undefined && typeof _state !== 'string')
16
+ throw new TypeError('Invalid source state');
17
+ track.sourceState = _state;
15
18
  return track;
16
19
  });
17
20
  const playlist = result.playlist ? deserialize(result.playlist) : null;
@@ -24,4 +27,11 @@ export function deserializeSourceResult(result) {
24
27
  }
25
28
  return new SearchResult({ tracks, playlist });
26
29
  }
30
+ /** Encode a queued Track for a host operation, retaining its transient state hint.
31
+ * @param track Normal model from search, queue, or history.
32
+ * @returns Portable metadata with an optional opaque state token. Persistence should use serialize().
33
+ */
34
+ export function serializeSourceTrack(track) {
35
+ return { ...track.serialize(), ...(track.sourceState ? { sourceState: track.sourceState } : {}) };
36
+ }
27
37
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAwB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAA2B,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAkB/C;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA4B;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;QACtE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACrF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,YAAY,QAAQ,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACnH,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAwB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAA2B,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAkB/C;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA4B;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;QACtE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACrF,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACpG,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,YAAY,QAAQ,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACnH,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAY;IAC/C,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACpG,CAAC"}
package/dist/runtime.d.ts CHANGED
@@ -7,6 +7,8 @@ import type { LegacyPlayerContext, SourceRuntimeEvents } from './legacy-player.j
7
7
  import type { MediaResource, SearchOptions } from './types.js';
8
8
  /** Standalone source configuration; no playback services are created. */
9
9
  export interface SourcePluginRuntimeOptions {
10
+ /** Stable deployment identifier for standalone execution. */
11
+ hostId?: string;
10
12
  /** Actual Player context when embedded. */
11
13
  player?: LegacyPlayerContext;
12
14
  /** Disabled provider IDs. */
package/dist/runtime.js CHANGED
@@ -21,7 +21,7 @@ export class SourcePluginRuntime extends SafeEventEmitter {
21
21
  super();
22
22
  this.player = options.player ?? this;
23
23
  this.options = options.player?.options ?? options;
24
- this.plugins = new PluginRegistry(this.player, () => this.options.blockExtractors ?? []);
24
+ this.plugins = new PluginRegistry(this.player, () => this.options.blockExtractors ?? [], options.hostId);
25
25
  this.extractors = new ExtractorExecutionContext(this.player);
26
26
  }
27
27
  /** Queue orchestration requires an actual DiscordPlayer. */
@@ -83,9 +83,9 @@ export class SourcePluginRuntime extends SafeEventEmitter {
83
83
  protocol,
84
84
  options: {
85
85
  ...options,
86
- searchEngine: target
87
- ? undefined
88
- : (options.searchEngine ?? options.source ?? (/^https?:\/\//i.test(query) ? 'arbitrary' : 'auto')),
86
+ searchEngine: (options.searchEngine?.startsWith('ext:') ? undefined : options.searchEngine) ??
87
+ options.source ??
88
+ (/^https?:\/\//i.test(query) ? 'arbitrary' : 'auto'),
89
89
  },
90
90
  };
91
91
  const execution = { signal: options.signal, blocked, pluginId: target };