mediafuse 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { readFileSync, existsSync } from "node:fs";
4
+ import { resolve, dirname, join } from "node:path";
5
+ import { resolveManifest } from "./resolve.js";
6
+ import { startServer } from "./server.js";
7
+ const USAGE = `Usage: mediafuse [-p path ...] [--port N] [manifest.json]
8
+
9
+ Serve a MediaFuse manifest and its plugins locally.
10
+
11
+ If no manifest is given, looks for mediafuse.manifest in package.json.
12
+
13
+ Options:
14
+ -p, --plugin path Plugin search path (repeatable)
15
+ Can be a directory or a single file
16
+ --port N Port to listen on (default: 8000)
17
+ -h, --help Show this help`;
18
+ const { values, positionals } = parseArgs({
19
+ options: {
20
+ plugin: { type: "string", short: "p", multiple: true, default: [] },
21
+ port: { type: "string", default: "8000" },
22
+ help: { type: "boolean", short: "h", default: false },
23
+ },
24
+ allowPositionals: true,
25
+ });
26
+ if (values.help) {
27
+ console.log(USAGE);
28
+ process.exit(0);
29
+ }
30
+ if (positionals.length > 1) {
31
+ console.error(USAGE);
32
+ process.exit(1);
33
+ }
34
+ const manifestPath = positionals.length === 1
35
+ ? resolve(positionals[0])
36
+ : findManifestFromPackageJson();
37
+ if (!existsSync(manifestPath)) {
38
+ console.error(`Manifest not found: ${manifestPath}`);
39
+ process.exit(1);
40
+ }
41
+ const manifestDir = dirname(manifestPath);
42
+ const manifestData = JSON.parse(readFileSync(manifestPath, "utf-8"));
43
+ const port = parseInt(values.port, 10);
44
+ const searchPaths = values.plugin.map((p) => resolve(p));
45
+ const resolved = resolveManifest(manifestData, manifestDir, searchPaths, port);
46
+ startServer(resolved, port);
47
+ function findManifestFromPackageJson() {
48
+ const pkgPath = join(process.cwd(), "package.json");
49
+ if (!existsSync(pkgPath)) {
50
+ console.error("No manifest argument and no package.json in current directory");
51
+ process.exit(1);
52
+ }
53
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
54
+ const manifestRef = pkg.mediafuse?.manifest;
55
+ if (!manifestRef) {
56
+ console.error("No manifest argument and no mediafuse.manifest in package.json");
57
+ process.exit(1);
58
+ }
59
+ return resolve(process.cwd(), manifestRef);
60
+ }
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PluginEntry, PluginManifest } from "../types.js";
2
+ export interface ResolvedPlugin {
3
+ entry: PluginEntry;
4
+ localDir: string;
5
+ filename: string;
6
+ index: number;
7
+ }
8
+ export interface ResolvedManifest {
9
+ manifest: PluginManifest;
10
+ plugins: ResolvedPlugin[];
11
+ staticRoot: string;
12
+ }
13
+ export declare function resolveManifest(raw: PluginManifest, manifestDir: string, searchPaths: string[], port: number): ResolvedManifest;
14
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/cli/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,MAAM,GACX,gBAAgB,CAuBlB"}
@@ -0,0 +1,216 @@
1
+ import { readFileSync, existsSync, statSync, readdirSync } from "node:fs";
2
+ import { resolve, dirname, basename, join, relative, sep } from "node:path";
3
+ export function resolveManifest(raw, manifestDir, searchPaths, port) {
4
+ const baseUrl = `http://localhost:${port}`;
5
+ const discovered = discoverPlugins(searchPaths);
6
+ const entries = normalizeEntries(raw.plugins);
7
+ const plugins = entries.map((entry, i) => {
8
+ const filePath = resolvePluginSrc(entry, manifestDir, discovered);
9
+ const localDir = dirname(filePath);
10
+ const filename = basename(filePath);
11
+ const mergedEntry = mergeMetadata(entry, filePath, discovered);
12
+ mergedEntry.src = `${baseUrl}/p/${i}/${filename}`;
13
+ return { entry: mergedEntry, localDir, filename, index: i };
14
+ });
15
+ const config = rewriteConfigPaths(raw.config || {}, manifestDir, baseUrl);
16
+ return {
17
+ manifest: { ...raw, plugins: plugins.map((p) => p.entry), config },
18
+ plugins,
19
+ staticRoot: manifestDir,
20
+ };
21
+ }
22
+ const SKIP_DIRS = new Set([
23
+ "node_modules", ".git", ".hg", ".svn", "dist", "build", "coverage",
24
+ ]);
25
+ /**
26
+ * Walk search paths and discover plugins.
27
+ *
28
+ * For each -p path:
29
+ * - If it's a file, register it directly
30
+ * - If it's a directory with a package.json that has a mediafuse field, register it
31
+ * - Otherwise, scan subdirectories (skipping node_modules etc.) until
32
+ * package.jsons with mediafuse fields are found
33
+ */
34
+ function discoverPlugins(searchPaths) {
35
+ const found = new Map();
36
+ for (const searchPath of searchPaths) {
37
+ if (!existsSync(searchPath))
38
+ continue;
39
+ const stat = statSync(searchPath);
40
+ if (!stat.isDirectory()) {
41
+ const name = basename(searchPath).replace(/\.[^.]+$/, "");
42
+ found.set(name, { name, src: resolve(searchPath) });
43
+ continue;
44
+ }
45
+ for (const plugin of scanDir(searchPath)) {
46
+ found.set(plugin.name, plugin);
47
+ }
48
+ }
49
+ return found;
50
+ }
51
+ function scanDir(dir) {
52
+ const pkgPath = join(dir, "package.json");
53
+ if (existsSync(pkgPath)) {
54
+ const plugins = readPluginsFromPackage(dir, pkgPath);
55
+ if (plugins.length > 0)
56
+ return plugins;
57
+ }
58
+ const results = [];
59
+ let entries;
60
+ try {
61
+ entries = readdirSync(dir, { withFileTypes: true });
62
+ }
63
+ catch {
64
+ return results;
65
+ }
66
+ for (const entry of entries) {
67
+ if (!entry.isDirectory() || SKIP_DIRS.has(entry.name))
68
+ continue;
69
+ results.push(...scanDir(join(dir, entry.name)));
70
+ }
71
+ return results;
72
+ }
73
+ function readPluginsFromPackage(dir, pkgPath) {
74
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
75
+ const plugins = pkg.mediafuse?.plugins;
76
+ if (!plugins)
77
+ return [];
78
+ const pkgName = pkg.name || basename(dir);
79
+ // String shorthand: mediafuse.plugins: "./src/index.ts"
80
+ if (typeof plugins === "string") {
81
+ return [{ name: pkgName, src: resolve(dir, plugins) }];
82
+ }
83
+ // List: mediafuse.plugins: ["./src/index.ts", "./src/other.ts"]
84
+ if (Array.isArray(plugins)) {
85
+ return plugins.map((p, i) => ({
86
+ name: i === 0 ? pkgName : `${pkgName}/${basename(p, ".ts").replace(/\.js$/, "")}`,
87
+ src: resolve(dir, p),
88
+ }));
89
+ }
90
+ return [];
91
+ }
92
+ function normalizeEntries(plugins) {
93
+ return plugins.map((p) => (typeof p === "string" ? { src: p } : { ...p }));
94
+ }
95
+ function resolvePluginSrc(entry, manifestDir, discovered) {
96
+ const src = entry.src;
97
+ // Relative or absolute path
98
+ if (src.startsWith("./") || src.startsWith("../") || src.startsWith("/")) {
99
+ const resolved = resolve(manifestDir, src);
100
+ if (!existsSync(resolved)) {
101
+ throw new Error(`Plugin file not found: ${src} (resolved to ${resolved})`);
102
+ }
103
+ return resolved;
104
+ }
105
+ // Check discovered plugins from search paths
106
+ const match = findDiscovered(src, entry, discovered);
107
+ if (match)
108
+ return match.src;
109
+ // File in manifest dir
110
+ if (existsSync(resolve(manifestDir, src))) {
111
+ return resolve(manifestDir, src);
112
+ }
113
+ // node_modules
114
+ return resolveFromNodeModules(src, manifestDir);
115
+ }
116
+ function findDiscovered(src, entry, discovered) {
117
+ // Exact name match
118
+ if (entry.name && discovered.has(entry.name)) {
119
+ return discovered.get(entry.name);
120
+ }
121
+ // Package/subplugin reference: "mediafuse-plugins/p5" → look up "p5"
122
+ const slash = src.lastIndexOf("/");
123
+ if (slash >= 0) {
124
+ const subName = src.slice(slash + 1);
125
+ if (discovered.has(subName))
126
+ return discovered.get(subName);
127
+ }
128
+ // Full src as key
129
+ if (discovered.has(src))
130
+ return discovered.get(src);
131
+ // Package name match (e.g., "@mediafuse/p5")
132
+ for (const plugin of discovered.values()) {
133
+ if (plugin.name === src)
134
+ return plugin;
135
+ // Match scoped package short name: "@mediafuse/p5" matches "p5"
136
+ const scopedSlash = plugin.name.lastIndexOf("/");
137
+ if (scopedSlash >= 0) {
138
+ const shortName = plugin.name.slice(scopedSlash + 1);
139
+ const srcTail = slash >= 0 ? src.slice(slash + 1) : src;
140
+ if (shortName === srcTail)
141
+ return plugin;
142
+ }
143
+ }
144
+ return null;
145
+ }
146
+ function resolveFromNodeModules(ref, from) {
147
+ const parts = ref.split("/");
148
+ const pkgName = parts[0].startsWith("@")
149
+ ? parts.slice(0, 2).join("/")
150
+ : parts[0];
151
+ const subPlugin = parts.slice(pkgName.split("/").length).join("/") || null;
152
+ const pkgDir = findPackageDir(pkgName, from);
153
+ const pkg = JSON.parse(readFileSync(join(pkgDir, "package.json"), "utf-8"));
154
+ const mediafuse = pkg.mediafuse;
155
+ const plugins = mediafuse?.plugins;
156
+ if (plugins) {
157
+ if (typeof plugins === "string") {
158
+ return resolve(pkgDir, plugins);
159
+ }
160
+ if (Array.isArray(plugins) && plugins.length > 0) {
161
+ return resolve(pkgDir, plugins[0]);
162
+ }
163
+ }
164
+ const main = pkg.main || "index.js";
165
+ return resolve(pkgDir, main);
166
+ }
167
+ function findPackageDir(name, from) {
168
+ let dir = resolve(from);
169
+ const root = resolve("/");
170
+ while (dir !== root) {
171
+ const candidate = join(dir, "node_modules", name);
172
+ if (existsSync(join(candidate, "package.json")))
173
+ return candidate;
174
+ dir = dirname(dir);
175
+ }
176
+ throw new Error(`Package not found in node_modules: ${name}`);
177
+ }
178
+ function mergeMetadata(entry, _resolvedPath, discovered) {
179
+ const match = entry.name
180
+ ? discovered.get(entry.name)
181
+ : findDiscovered(entry.src, entry, discovered);
182
+ const merged = { ...entry };
183
+ if (match && !merged.name) {
184
+ merged.name = match.name;
185
+ }
186
+ return merged;
187
+ }
188
+ function rewriteConfigPaths(config, manifestDir, baseUrl) {
189
+ return walkValues(config, (value) => {
190
+ if (typeof value !== "string")
191
+ return value;
192
+ if (!value.startsWith("./") && !value.startsWith("../"))
193
+ return value;
194
+ const abs = resolve(manifestDir, value);
195
+ const rel = relative(manifestDir, abs).split(sep).join("/");
196
+ return `${baseUrl}/${rel}`;
197
+ });
198
+ }
199
+ function walkValues(obj, transform) {
200
+ const result = {};
201
+ for (const [key, value] of Object.entries(obj)) {
202
+ if (Array.isArray(value)) {
203
+ result[key] = value.map((item) => item && typeof item === "object" && !Array.isArray(item)
204
+ ? walkValues(item, transform)
205
+ : transform(item));
206
+ }
207
+ else if (value && typeof value === "object") {
208
+ result[key] = walkValues(value, transform);
209
+ }
210
+ else {
211
+ result[key] = transform(value);
212
+ }
213
+ }
214
+ return result;
215
+ }
216
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/cli/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ResolvedManifest } from "./resolve.js";
2
+ export declare function startServer(resolved: ResolvedManifest, port: number): void;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/cli/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AA4BrD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA2E1E"}
@@ -0,0 +1,144 @@
1
+ import { createServer } from "node:http";
2
+ import { readFileSync, createReadStream, existsSync } from "node:fs";
3
+ import { extname, resolve, sep } from "node:path";
4
+ import { transform } from "esbuild";
5
+ const MIME = {
6
+ ".js": "application/javascript",
7
+ ".mjs": "application/javascript",
8
+ ".ts": "application/javascript",
9
+ ".tsx": "application/javascript",
10
+ ".json": "application/json",
11
+ ".html": "text/html",
12
+ ".css": "text/css",
13
+ ".wasm": "application/wasm",
14
+ ".png": "image/png",
15
+ ".jpg": "image/jpeg",
16
+ ".jpeg": "image/jpeg",
17
+ ".svg": "image/svg+xml",
18
+ ".gif": "image/gif",
19
+ ".mp3": "audio/mpeg",
20
+ ".mp4": "video/mp4",
21
+ ".ogg": "audio/ogg",
22
+ ".webm": "video/webm",
23
+ ".woff2": "font/woff2",
24
+ ".woff": "font/woff",
25
+ ".ttf": "font/ttf",
26
+ ".txt": "text/plain",
27
+ };
28
+ const TS_EXTENSIONS = new Set([".ts", ".tsx"]);
29
+ export function startServer(resolved, port) {
30
+ const { manifest, plugins, staticRoot } = resolved;
31
+ const manifestJson = JSON.stringify(manifest, null, 2);
32
+ const server = createServer(async (req, res) => {
33
+ res.setHeader("Access-Control-Allow-Origin", "*");
34
+ res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
35
+ res.setHeader("Access-Control-Allow-Headers", "*");
36
+ if (req.method === "OPTIONS") {
37
+ res.writeHead(204);
38
+ res.end();
39
+ return;
40
+ }
41
+ if (req.method !== "GET") {
42
+ res.writeHead(405);
43
+ res.end("Method not allowed");
44
+ return;
45
+ }
46
+ res.setHeader("Cache-Control", "no-store");
47
+ const url = new URL(req.url || "/", `http://localhost:${port}`);
48
+ const pathname = decodeURIComponent(url.pathname);
49
+ if (pathname === "/manifest.json") {
50
+ res.setHeader("Content-Type", "application/json");
51
+ res.writeHead(200);
52
+ res.end(manifestJson);
53
+ return;
54
+ }
55
+ const pluginMatch = pathname.match(/^\/p\/(\d+)\/(.+)$/);
56
+ if (pluginMatch) {
57
+ const idx = parseInt(pluginMatch[1], 10);
58
+ const plugin = plugins[idx];
59
+ if (!plugin) {
60
+ res.writeHead(404);
61
+ res.end("Plugin not found");
62
+ return;
63
+ }
64
+ const filePath = safePath(plugin.localDir, pluginMatch[2]);
65
+ if (!filePath) {
66
+ res.writeHead(403);
67
+ res.end("Forbidden");
68
+ return;
69
+ }
70
+ await serveFile(filePath, res);
71
+ return;
72
+ }
73
+ if (pathname === "/") {
74
+ res.writeHead(404);
75
+ res.end("Not found");
76
+ return;
77
+ }
78
+ const filePath = safePath(staticRoot, pathname.slice(1));
79
+ if (!filePath) {
80
+ res.writeHead(403);
81
+ res.end("Forbidden");
82
+ return;
83
+ }
84
+ await serveFile(filePath, res);
85
+ });
86
+ server.listen(port, () => {
87
+ console.log(`mediafuse serving on http://localhost:${port}`);
88
+ console.log(`manifest: http://localhost:${port}/manifest.json`);
89
+ for (const plugin of plugins) {
90
+ const name = plugin.entry.name || `plugin-${plugin.index}`;
91
+ console.log(`${name}: ${plugin.entry.src}`);
92
+ }
93
+ });
94
+ }
95
+ function safePath(root, requested) {
96
+ const resolved = resolve(root, requested);
97
+ const normalizedRoot = resolve(root) + sep;
98
+ if (resolved !== resolve(root) && !resolved.startsWith(normalizedRoot)) {
99
+ return null;
100
+ }
101
+ return resolved;
102
+ }
103
+ async function serveFile(filePath, res) {
104
+ if (!existsSync(filePath)) {
105
+ res.writeHead(404);
106
+ res.end("Not found");
107
+ return;
108
+ }
109
+ const ext = extname(filePath);
110
+ if (TS_EXTENSIONS.has(ext)) {
111
+ await serveTranspiled(filePath, ext, res);
112
+ return;
113
+ }
114
+ const contentType = MIME[ext] || "application/octet-stream";
115
+ res.setHeader("Content-Type", contentType);
116
+ res.writeHead(200);
117
+ const stream = createReadStream(filePath);
118
+ stream.pipe(res);
119
+ stream.on("error", () => {
120
+ res.writeHead(500);
121
+ res.end("Read error");
122
+ });
123
+ }
124
+ async function serveTranspiled(filePath, ext, res) {
125
+ try {
126
+ const source = readFileSync(filePath, "utf-8");
127
+ const result = await transform(source, {
128
+ loader: ext === ".tsx" ? "tsx" : "ts",
129
+ format: "esm",
130
+ sourcemap: "inline",
131
+ sourcefile: filePath,
132
+ });
133
+ res.setHeader("Content-Type", "application/javascript");
134
+ res.writeHead(200);
135
+ res.end(result.code);
136
+ }
137
+ catch (err) {
138
+ const msg = err instanceof Error ? err.message : "Transform failed";
139
+ console.error(`esbuild transform error: ${filePath}\n${msg}`);
140
+ res.writeHead(500);
141
+ res.end(`// Transform error:\n// ${msg}`);
142
+ }
143
+ }
144
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/cli/server.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export type { DefinePluginFn, SetupFn } from "./define-plugin.js";
2
- export type { StoredMessage, MessageOf, PluginType, PluginEvent, PluginEventMap, CreateContext, PluginHandlers, PluginEntry, PluginManifest, RegisterFn, PluginContext, } from "./types.js";
2
+ export type { StoredMessage, MessageOf, PluginType, PluginEnvironment, PluginEvent, PluginEventMap, CreateContext, PluginHandlers, RegisterOptions, PluginEntry, PluginManifest, RegisterFn, PluginContext, } from "./types.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElE,YAAY,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElE,YAAY,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,cAAc,EACd,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { PluginType, PluginEvent, PluginEventMap, PluginHandlers, PluginManifest, CreateContext } from "./types.js";
2
+ import type { DefinePluginFn } from "./define-plugin.js";
3
+ export interface EmittedEvent<E extends PluginEvent = PluginEvent> {
4
+ event: E;
5
+ data: PluginEventMap[E];
6
+ }
7
+ export interface TestHarnessOptions {
8
+ type?: PluginType;
9
+ config?: Record<string, unknown>;
10
+ manifest?: Partial<PluginManifest>;
11
+ }
12
+ export interface TestHarness {
13
+ name: string;
14
+ type: PluginType;
15
+ registered: boolean;
16
+ handlers: PluginHandlers;
17
+ container: HTMLDivElement | null;
18
+ emitted: EmittedEvent[];
19
+ emit: CreateContext["emit"];
20
+ message: (msg: PluginEventMap["message"]) => void;
21
+ command: (cmd: PluginEventMap["command"]) => void;
22
+ tick: (dt: number) => void;
23
+ resize: (size: PluginEventMap["resize"]) => void;
24
+ config: (manifest: PluginManifest) => void;
25
+ destroy: () => void;
26
+ }
27
+ export declare function createTestHarness(plugin: {
28
+ default: (define: DefinePluginFn) => void;
29
+ } | ((define: DefinePluginFn) => void), options?: TestHarnessOptions): TestHarness;
30
+ export type { PluginType, PluginEvent, PluginEventMap, PluginHandlers, PluginManifest, CreateContext };
31
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,EACd,aAAa,EAEd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC/D,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAClD,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACjD,MAAM,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAYD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE;IAAE,OAAO,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;CAAE,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC,EAC1F,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CA2Eb;AAiCD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,104 @@
1
+ function defaultManifest(overrides) {
2
+ return {
3
+ v: 1,
4
+ plugins: [],
5
+ blocks: [],
6
+ config: {},
7
+ ...overrides,
8
+ };
9
+ }
10
+ export function createTestHarness(plugin, options = {}) {
11
+ const allowedType = options.type ?? "overlay";
12
+ const manifest = defaultManifest(options.manifest);
13
+ const pluginConfig = { ...manifest.config, ...options.config };
14
+ let capturedName = "";
15
+ let capturedType = null;
16
+ let capturedHandlers = {};
17
+ let didRegister = false;
18
+ const emitted = [];
19
+ const container = allowedType === "overlay"
20
+ ? createMockDiv()
21
+ : null;
22
+ const emitFn = allowedType === "data"
23
+ ? (event, data) => {
24
+ emitted.push({ event, data });
25
+ }
26
+ : null;
27
+ const register = (type, handlers, _options) => {
28
+ if (type !== allowedType)
29
+ return false;
30
+ capturedType = type;
31
+ capturedHandlers = handlers;
32
+ didRegister = true;
33
+ if (handlers.onCreate) {
34
+ handlers.onCreate({
35
+ container,
36
+ config: pluginConfig,
37
+ emit: emitFn,
38
+ messageActioned: () => { },
39
+ environment: allowedType === "dashboard" ? "dashboard" : "overlay",
40
+ dev: true,
41
+ });
42
+ }
43
+ return true;
44
+ };
45
+ const definePlugin = (name, setup) => {
46
+ capturedName = name;
47
+ setup({ register, manifest });
48
+ };
49
+ const pluginFn = typeof plugin === "function" ? plugin : plugin.default;
50
+ pluginFn(definePlugin);
51
+ const fire = (event, data) => {
52
+ const key = `on${event.charAt(0).toUpperCase()}${event.slice(1)}`;
53
+ const handler = capturedHandlers[key];
54
+ if (handler)
55
+ handler(data);
56
+ };
57
+ return {
58
+ get name() { return capturedName; },
59
+ get type() { return capturedType ?? allowedType; },
60
+ get registered() { return didRegister; },
61
+ get handlers() { return capturedHandlers; },
62
+ container,
63
+ emitted,
64
+ emit: emitFn,
65
+ message: (msg) => fire("message", msg),
66
+ command: (cmd) => fire("command", cmd),
67
+ tick: (dt) => fire("tick", dt),
68
+ resize: (size) => fire("resize", size),
69
+ config: (m) => fire("config", m),
70
+ destroy: () => capturedHandlers.onDestroy?.(),
71
+ };
72
+ }
73
+ function createMockDiv() {
74
+ const children = [];
75
+ return {
76
+ tagName: "DIV",
77
+ style: { cssText: "" },
78
+ children,
79
+ childNodes: children,
80
+ appendChild(child) { children.push(child); return child; },
81
+ removeChild(child) {
82
+ const i = children.indexOf(child);
83
+ if (i >= 0)
84
+ children.splice(i, 1);
85
+ return child;
86
+ },
87
+ remove() { },
88
+ innerHTML: "",
89
+ textContent: "",
90
+ querySelector() { return null; },
91
+ querySelectorAll() { return []; },
92
+ addEventListener() { },
93
+ removeEventListener() { },
94
+ setAttribute() { },
95
+ getAttribute() { return null; },
96
+ classList: {
97
+ add() { },
98
+ remove() { },
99
+ toggle() { },
100
+ contains() { return false; },
101
+ },
102
+ };
103
+ }
104
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -2,12 +2,13 @@ export interface StoredMessage<T = Record<string, unknown>> {
2
2
  type: string | null;
3
3
  data: T;
4
4
  timestamp: number;
5
- expiresAt: number | null;
5
+ durationMs: number | null;
6
6
  }
7
7
  export type MessageOf<T> = StoredMessage<T> & {
8
8
  type: string;
9
9
  };
10
- export type PluginType = "data" | "overlay";
10
+ export type PluginType = "data" | "overlay" | "dashboard";
11
+ export type PluginEnvironment = "overlay" | "dashboard";
11
12
  export type PluginEventMap = {
12
13
  message: StoredMessage | null;
13
14
  command: {
@@ -26,6 +27,9 @@ export interface CreateContext {
26
27
  container: HTMLDivElement | null;
27
28
  config: Record<string, unknown>;
28
29
  emit: (<E extends PluginEvent>(event: E, data: PluginEventMap[E]) => void) | null;
30
+ messageActioned: (durationMs: number | null) => void;
31
+ environment: PluginEnvironment;
32
+ dev: boolean;
29
33
  }
30
34
  export type PluginHandlers = {
31
35
  [E in PluginEvent as `on${Capitalize<E>}`]?: (data: PluginEventMap[E]) => void;
@@ -33,6 +37,10 @@ export type PluginHandlers = {
33
37
  onCreate?: (ctx: CreateContext) => void;
34
38
  onDestroy?: () => void;
35
39
  };
40
+ export interface RegisterOptions {
41
+ environment?: PluginEnvironment;
42
+ dev?: boolean;
43
+ }
36
44
  export interface PluginEntry {
37
45
  src: string;
38
46
  name?: string;
@@ -45,7 +53,7 @@ export interface PluginManifest {
45
53
  blocks: unknown[];
46
54
  config: Record<string, unknown>;
47
55
  }
48
- export type RegisterFn = (type: PluginType, handlers: PluginHandlers) => boolean;
56
+ export type RegisterFn = (type: PluginType, handlers: PluginHandlers, options?: RegisterOptions) => boolean;
49
57
  export interface PluginContext {
50
58
  register: RegisterFn;
51
59
  manifest: PluginManifest;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CACnF;AAED,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;CAC/E,GAAG;IACF,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,UAAU,GAAG,CACvB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,cAAc,KACrB,OAAO,CAAC;AAEb,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,WAAW,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAClF,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,iBAAiB,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;CAC/E,GAAG;IACF,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,UAAU,GAAG,CACvB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,eAAe,KACtB,OAAO,CAAC;AAEb,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;CAC1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediafuse",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Plugin SDK for MediaFuse stream overlays",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -9,8 +9,15 @@
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
+ },
13
+ "./testing": {
14
+ "types": "./dist/testing.d.ts",
15
+ "import": "./dist/testing.js"
12
16
  }
13
17
  },
18
+ "bin": {
19
+ "mediafuse": "./dist/cli/index.js"
20
+ },
14
21
  "files": [
15
22
  "dist"
16
23
  ],
@@ -21,6 +28,7 @@
21
28
  "prepublishOnly": "npm run build"
22
29
  },
23
30
  "devDependencies": {
31
+ "@types/node": "^22.0.0",
24
32
  "@vitest/coverage-v8": "^4.0.18",
25
33
  "typescript": "^5.7.0",
26
34
  "vitest": "^4.0.18"
@@ -29,5 +37,8 @@
29
37
  "repository": {
30
38
  "type": "git",
31
39
  "url": "https://github.com/monokrome/mediafuse-sdk"
40
+ },
41
+ "dependencies": {
42
+ "esbuild": "^0.27.3"
32
43
  }
33
44
  }