@lokvis/runtime 0.1.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/dist/asset-store.d.ts +72 -0
- package/dist/asset-store.d.ts.map +1 -0
- package/dist/asset-store.js +167 -0
- package/dist/asset-store.js.map +1 -0
- package/dist/capability-registry.d.ts +38 -0
- package/dist/capability-registry.d.ts.map +1 -0
- package/dist/capability-registry.js +100 -0
- package/dist/capability-registry.js.map +1 -0
- package/dist/event-bus.d.ts +9 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +33 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/executor.d.ts +42 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +237 -0
- package/dist/executor.js.map +1 -0
- package/dist/history.d.ts +92 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +171 -0
- package/dist/history.js.map +1 -0
- package/dist/idb-asset-store.d.ts +46 -0
- package/dist/idb-asset-store.d.ts.map +1 -0
- package/dist/idb-asset-store.js +76 -0
- package/dist/idb-asset-store.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/opfs-asset-store.d.ts +38 -0
- package/dist/opfs-asset-store.d.ts.map +1 -0
- package/dist/opfs-asset-store.js +122 -0
- package/dist/opfs-asset-store.js.map +1 -0
- package/dist/runtime.d.ts +87 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +475 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/worker-host.d.ts +154 -0
- package/dist/worker-host.d.ts.map +1 -0
- package/dist/worker-host.js +394 -0
- package/dist/worker-host.js.map +1 -0
- package/dist/worker-protocol.d.ts +103 -0
- package/dist/worker-protocol.d.ts.map +1 -0
- package/dist/worker-protocol.js +87 -0
- package/dist/worker-protocol.js.map +1 -0
- package/package.json +49 -0
- package/src/asset-store.ts +222 -0
- package/src/capability-registry.ts +135 -0
- package/src/event-bus.ts +41 -0
- package/src/executor.ts +303 -0
- package/src/history.ts +229 -0
- package/src/idb-asset-store.ts +121 -0
- package/src/index.ts +20 -0
- package/src/opfs-asset-store.ts +167 -0
- package/src/runtime.ts +564 -0
- package/src/types.ts +121 -0
- package/src/worker-host.ts +531 -0
- package/src/worker-protocol.ts +187 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lokvis Asset Store
|
|
3
|
+
*
|
|
4
|
+
* 资产存储管理。元数据存 IndexedDB,大文件存 OPFS。
|
|
5
|
+
* Runtime 只操作 AssetId,不直接持有 File 或 Blob。
|
|
6
|
+
*
|
|
7
|
+
* 降级链(createAssetStore 工厂,W2.8):
|
|
8
|
+
* preferOpfs → OPFS → IndexedDB(Dexie) → Memory(始终可用,不持久化)
|
|
9
|
+
*/
|
|
10
|
+
import type { Asset, AssetId, AssetMetadata, AssetSource, BlobHandle } from '@lokvis/schema';
|
|
11
|
+
/** Asset 存储接口 */
|
|
12
|
+
export interface AssetStore {
|
|
13
|
+
/** 导入资产(从 File / Blob / URL) */
|
|
14
|
+
import(source: AssetSource): Promise<Asset>;
|
|
15
|
+
/** 获取资产元数据 */
|
|
16
|
+
get(id: AssetId): Promise<Asset | undefined>;
|
|
17
|
+
/** 获取资产的 Blob 数据 */
|
|
18
|
+
getBlob(handle: BlobHandle): Promise<Blob>;
|
|
19
|
+
/** 删除资产 */
|
|
20
|
+
remove(id: AssetId): Promise<void>;
|
|
21
|
+
/** 列出所有资产 */
|
|
22
|
+
list(): Promise<Asset[]>;
|
|
23
|
+
/** 创建新 Asset(内部用,由 Capability 产出) */
|
|
24
|
+
create(blob: Blob, metadata: AssetMetadata, type: Asset['type']): Promise<Asset>;
|
|
25
|
+
}
|
|
26
|
+
/** 生成唯一 ID */
|
|
27
|
+
export declare function generateId(): string;
|
|
28
|
+
/** 从 MIME 类型推断 Asset 类型 */
|
|
29
|
+
export declare function inferAssetType(mimeType: string): Asset['type'];
|
|
30
|
+
/** 从 MIME 类型获取格式扩展名 */
|
|
31
|
+
export declare function getFormatFromMime(mimeType: string): string;
|
|
32
|
+
/** 从 AssetSource 提取 Blob 与 MIME(支持 file/blob,其余抛 not supported) */
|
|
33
|
+
export declare function extractBlobFromSource(source: AssetSource): {
|
|
34
|
+
blob: Blob;
|
|
35
|
+
mimeType: string;
|
|
36
|
+
};
|
|
37
|
+
/** prepareImport 返回值:统一构造的导入数据(供三个 store 复用) */
|
|
38
|
+
export interface PreparedImport {
|
|
39
|
+
id: AssetId;
|
|
40
|
+
blob: Blob;
|
|
41
|
+
metadata: AssetMetadata;
|
|
42
|
+
type: Asset['type'];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 从 AssetSource 准备导入数据(共享逻辑,供 Memory/OPFS/IDB store 复用):
|
|
46
|
+
* 提取 blob + MIME、生成 id、推断 type、构造 metadata。
|
|
47
|
+
* 各 store 只需负责"写入 blob + 存元数据"。
|
|
48
|
+
*/
|
|
49
|
+
export declare function prepareImport(source: AssetSource): PreparedImport;
|
|
50
|
+
/** 从 BlobHandle.path 解析出 AssetId(共享,各 store 按 prefix 调用) */
|
|
51
|
+
export declare function parseBlobPath(path: string, prefix: string): AssetId;
|
|
52
|
+
/** 构造完整 Asset 元数据 + 默认字段(共享工厂) */
|
|
53
|
+
export declare function buildAsset(id: AssetId, blob: Blob, metadata: AssetMetadata, type: Asset['type'], pathPrefix: string): Asset;
|
|
54
|
+
/** 创建内存版 AssetStore(降级方案,不持久化) */
|
|
55
|
+
export declare function createMemoryAssetStore(): AssetStore;
|
|
56
|
+
/** 工厂配置(W2.8) */
|
|
57
|
+
export interface CreateAssetStoreOptions {
|
|
58
|
+
/** 是否优先使用 OPFS(默认 true);为 false 时跳过 OPFS */
|
|
59
|
+
preferOpfs?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* AssetStore 工厂:自动探测环境,按降级链创建存储(W2.8)。
|
|
63
|
+
*
|
|
64
|
+
* 顺序:
|
|
65
|
+
* 1. preferOpfs(默认 true)且 OPFS 可用 → OpfsAssetStore
|
|
66
|
+
* 2. IndexedDB 可用 → IdbAssetStore(Dexie)
|
|
67
|
+
* 3. 兜底 → MemoryAssetStore(始终可用,不持久化)
|
|
68
|
+
*
|
|
69
|
+
* 任一阶段抛错均自动降级,最终必定返回一个可用 store。
|
|
70
|
+
*/
|
|
71
|
+
export declare function createAssetStore(options?: CreateAssetStoreOptions): Promise<AssetStore>;
|
|
72
|
+
//# sourceMappingURL=asset-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-store.d.ts","sourceRoot":"","sources":["../src/asset-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI7F,iBAAiB;AACjB,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,cAAc;IACd,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC7C,oBAAoB;IACpB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW;IACX,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,aAAa;IACb,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzB,qCAAqC;IACrC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAClF;AAED,cAAc;AACd,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAS9D;AAED,uBAAuB;AACvB,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG;IAC1D,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAUA;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAWjE;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAMnE;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CACxB,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,UAAU,EAAE,MAAM,GACjB,KAAK,CAgBP;AAKD,kCAAkC;AAClC,wBAAgB,sBAAsB,IAAI,UAAU,CAyCnD;AAED,iBAAiB;AACjB,MAAM,WAAW,uBAAuB;IACtC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lokvis Asset Store
|
|
3
|
+
*
|
|
4
|
+
* 资产存储管理。元数据存 IndexedDB,大文件存 OPFS。
|
|
5
|
+
* Runtime 只操作 AssetId,不直接持有 File 或 Blob。
|
|
6
|
+
*
|
|
7
|
+
* 降级链(createAssetStore 工厂,W2.8):
|
|
8
|
+
* preferOpfs → OPFS → IndexedDB(Dexie) → Memory(始终可用,不持久化)
|
|
9
|
+
*/
|
|
10
|
+
import { createOpfsAssetStore, isOpfsSupported } from './opfs-asset-store.js';
|
|
11
|
+
import { createIdbAssetStore, isIdbSupported } from './idb-asset-store.js';
|
|
12
|
+
/** 生成唯一 ID */
|
|
13
|
+
export function generateId() {
|
|
14
|
+
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
15
|
+
return crypto.randomUUID();
|
|
16
|
+
}
|
|
17
|
+
return `asset_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
|
18
|
+
}
|
|
19
|
+
/** 从 MIME 类型推断 Asset 类型 */
|
|
20
|
+
export function inferAssetType(mimeType) {
|
|
21
|
+
if (mimeType.startsWith('image/'))
|
|
22
|
+
return 'image';
|
|
23
|
+
if (mimeType.startsWith('video/'))
|
|
24
|
+
return 'video';
|
|
25
|
+
if (mimeType.startsWith('audio/'))
|
|
26
|
+
return 'audio';
|
|
27
|
+
if (mimeType === 'application/pdf')
|
|
28
|
+
return 'pdf';
|
|
29
|
+
if (mimeType.startsWith('text/'))
|
|
30
|
+
return 'text';
|
|
31
|
+
if (mimeType === 'application/json' || mimeType.startsWith('application/'))
|
|
32
|
+
return 'data';
|
|
33
|
+
return 'unknown';
|
|
34
|
+
}
|
|
35
|
+
/** 从 MIME 类型获取格式扩展名 */
|
|
36
|
+
export function getFormatFromMime(mimeType) {
|
|
37
|
+
const parts = mimeType.split('/');
|
|
38
|
+
return parts[1] ?? 'bin';
|
|
39
|
+
}
|
|
40
|
+
/** 从 AssetSource 提取 Blob 与 MIME(支持 file/blob,其余抛 not supported) */
|
|
41
|
+
export function extractBlobFromSource(source) {
|
|
42
|
+
if (source.kind === 'file') {
|
|
43
|
+
return { blob: source.file, mimeType: source.file.type };
|
|
44
|
+
}
|
|
45
|
+
if (source.kind === 'blob') {
|
|
46
|
+
return { blob: source.blob, mimeType: source.blob.type };
|
|
47
|
+
}
|
|
48
|
+
throw new Error(`Asset source kind "${source.kind}" not supported by this store`);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 从 AssetSource 准备导入数据(共享逻辑,供 Memory/OPFS/IDB store 复用):
|
|
52
|
+
* 提取 blob + MIME、生成 id、推断 type、构造 metadata。
|
|
53
|
+
* 各 store 只需负责"写入 blob + 存元数据"。
|
|
54
|
+
*/
|
|
55
|
+
export function prepareImport(source) {
|
|
56
|
+
const { blob, mimeType: rawMime } = extractBlobFromSource(source);
|
|
57
|
+
const id = generateId();
|
|
58
|
+
const mimeType = rawMime || 'application/octet-stream';
|
|
59
|
+
const type = inferAssetType(mimeType);
|
|
60
|
+
const metadata = {
|
|
61
|
+
mimeType,
|
|
62
|
+
size: blob.size,
|
|
63
|
+
format: getFormatFromMime(mimeType),
|
|
64
|
+
};
|
|
65
|
+
return { id, blob, metadata, type };
|
|
66
|
+
}
|
|
67
|
+
/** 从 BlobHandle.path 解析出 AssetId(共享,各 store 按 prefix 调用) */
|
|
68
|
+
export function parseBlobPath(path, prefix) {
|
|
69
|
+
const fullPrefix = `${prefix}://`;
|
|
70
|
+
if (path.startsWith(fullPrefix)) {
|
|
71
|
+
return path.slice(fullPrefix.length);
|
|
72
|
+
}
|
|
73
|
+
return path;
|
|
74
|
+
}
|
|
75
|
+
/** 构造完整 Asset 元数据 + 默认字段(共享工厂) */
|
|
76
|
+
export function buildAsset(id, blob, metadata, type, pathPrefix) {
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
return {
|
|
79
|
+
id,
|
|
80
|
+
type,
|
|
81
|
+
metadata,
|
|
82
|
+
blob: {
|
|
83
|
+
path: `${pathPrefix}://${id}`,
|
|
84
|
+
size: blob.size,
|
|
85
|
+
mimeType: metadata.mimeType,
|
|
86
|
+
},
|
|
87
|
+
history: [],
|
|
88
|
+
tags: [],
|
|
89
|
+
createdAt: now,
|
|
90
|
+
updatedAt: now,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Memory store 的 BlobHandle.path 前缀 */
|
|
94
|
+
const MEMORY_PATH_PREFIX = 'memory';
|
|
95
|
+
/** 创建内存版 AssetStore(降级方案,不持久化) */
|
|
96
|
+
export function createMemoryAssetStore() {
|
|
97
|
+
const assets = new Map();
|
|
98
|
+
const blobs = new Map();
|
|
99
|
+
return {
|
|
100
|
+
async import(source) {
|
|
101
|
+
const { id, blob, metadata, type } = prepareImport(source);
|
|
102
|
+
blobs.set(id, blob);
|
|
103
|
+
const asset = buildAsset(id, blob, metadata, type, MEMORY_PATH_PREFIX);
|
|
104
|
+
assets.set(id, asset);
|
|
105
|
+
return asset;
|
|
106
|
+
},
|
|
107
|
+
async get(id) {
|
|
108
|
+
return assets.get(id);
|
|
109
|
+
},
|
|
110
|
+
async getBlob(handle) {
|
|
111
|
+
const id = parseBlobPath(handle.path, MEMORY_PATH_PREFIX);
|
|
112
|
+
const blob = blobs.get(id);
|
|
113
|
+
if (!blob)
|
|
114
|
+
throw new Error(`Blob not found for path: ${handle.path}`);
|
|
115
|
+
return blob;
|
|
116
|
+
},
|
|
117
|
+
async remove(id) {
|
|
118
|
+
assets.delete(id);
|
|
119
|
+
blobs.delete(id);
|
|
120
|
+
},
|
|
121
|
+
async list() {
|
|
122
|
+
return Array.from(assets.values());
|
|
123
|
+
},
|
|
124
|
+
async create(blob, metadata, type) {
|
|
125
|
+
const id = generateId();
|
|
126
|
+
blobs.set(id, blob);
|
|
127
|
+
const asset = buildAsset(id, blob, metadata, type, MEMORY_PATH_PREFIX);
|
|
128
|
+
assets.set(id, asset);
|
|
129
|
+
return asset;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* AssetStore 工厂:自动探测环境,按降级链创建存储(W2.8)。
|
|
135
|
+
*
|
|
136
|
+
* 顺序:
|
|
137
|
+
* 1. preferOpfs(默认 true)且 OPFS 可用 → OpfsAssetStore
|
|
138
|
+
* 2. IndexedDB 可用 → IdbAssetStore(Dexie)
|
|
139
|
+
* 3. 兜底 → MemoryAssetStore(始终可用,不持久化)
|
|
140
|
+
*
|
|
141
|
+
* 任一阶段抛错均自动降级,最终必定返回一个可用 store。
|
|
142
|
+
*/
|
|
143
|
+
export async function createAssetStore(options = {}) {
|
|
144
|
+
const preferOpfs = options.preferOpfs ?? true;
|
|
145
|
+
// 1. OPFS
|
|
146
|
+
if (preferOpfs && isOpfsSupported()) {
|
|
147
|
+
try {
|
|
148
|
+
return await createOpfsAssetStore();
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// OPFS 初始化失败,降级到 IndexedDB
|
|
152
|
+
console.warn('[lokvis] OPFS unavailable, falling back to IndexedDB:', err);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// 2. IndexedDB
|
|
156
|
+
if (isIdbSupported()) {
|
|
157
|
+
try {
|
|
158
|
+
return await createIdbAssetStore();
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
console.warn('[lokvis] IndexedDB unavailable, falling back to memory:', err);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// 3. Memory(兜底,始终可用)
|
|
165
|
+
return createMemoryAssetStore();
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=asset-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-store.js","sourceRoot":"","sources":["../src/asset-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lokvis Capability Registry
|
|
3
|
+
*
|
|
4
|
+
* 能力注册中心。Runtime 永远不知道 FFmpeg,只知道 Capability。
|
|
5
|
+
* Capability 由 Plugin 注册,由 Engine 实现。
|
|
6
|
+
*/
|
|
7
|
+
import type { Capability, CapabilityImplementation, CapabilityName, EngineSelectionStrategy } from '@lokvis/schema';
|
|
8
|
+
/** 能力注册中心 */
|
|
9
|
+
export declare class CapabilityRegistry {
|
|
10
|
+
private registry;
|
|
11
|
+
private readonly defaultStrategy;
|
|
12
|
+
constructor(defaultStrategy?: EngineSelectionStrategy);
|
|
13
|
+
/** 注册一个能力声明 */
|
|
14
|
+
registerCapability(capability: Capability): void;
|
|
15
|
+
/** 注册能力实现 */
|
|
16
|
+
registerImplementation(impl: CapabilityImplementation): void;
|
|
17
|
+
/** 列出所有能力声明 */
|
|
18
|
+
list(): Capability[];
|
|
19
|
+
/** 检查能力是否存在 */
|
|
20
|
+
has(name: CapabilityName): boolean;
|
|
21
|
+
/** 获取能力声明 */
|
|
22
|
+
get(name: CapabilityName): Capability | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* 解析能力实现。
|
|
25
|
+
* - 若指定 preferredEngine 且存在匹配实现,直接返回;
|
|
26
|
+
* - 否则按构造时设定的 defaultStrategy 选择('first'/'fastest'/'balanced')。
|
|
27
|
+
*/
|
|
28
|
+
resolve(name: CapabilityName, preferredEngine?: string): CapabilityImplementation | undefined;
|
|
29
|
+
/** 按默认策略从实现列表中选择一个 */
|
|
30
|
+
private selectByStrategy;
|
|
31
|
+
/** 取性能等级最优的实现(同档按注册顺序,稳定排序) */
|
|
32
|
+
private fastest;
|
|
33
|
+
/** 实现的性能等级:优先用实现自身声明,缺省回退到能力声明 */
|
|
34
|
+
private perfOf;
|
|
35
|
+
/** 清除所有注册 */
|
|
36
|
+
clear(): void;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=capability-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../src/capability-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EAExB,MAAM,gBAAgB,CAAC;AAiBxB,aAAa;AACb,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;gBAE9C,eAAe,GAAE,uBAAiC;IAI9D,eAAe;IACf,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAQhD,aAAa;IACb,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI;IAU5D,eAAe;IACf,IAAI,IAAI,UAAU,EAAE;IAIpB,eAAe;IACf,GAAG,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAIlC,aAAa;IACb,GAAG,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS;IAIjD;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAY7F,sBAAsB;IACtB,OAAO,CAAC,gBAAgB;IAoBxB,+BAA+B;IAC/B,OAAO,CAAC,OAAO;IAYf,kCAAkC;IAClC,OAAO,CAAC,MAAM;IAId,aAAa;IACb,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lokvis Capability Registry
|
|
3
|
+
*
|
|
4
|
+
* 能力注册中心。Runtime 永远不知道 FFmpeg,只知道 Capability。
|
|
5
|
+
* Capability 由 Plugin 注册,由 Engine 实现。
|
|
6
|
+
*/
|
|
7
|
+
/** 性能等级排序权重(数值越小越快) */
|
|
8
|
+
const PERFORMANCE_RANK = {
|
|
9
|
+
fast: 0,
|
|
10
|
+
medium: 1,
|
|
11
|
+
slow: 2,
|
|
12
|
+
};
|
|
13
|
+
/** 能力注册中心 */
|
|
14
|
+
export class CapabilityRegistry {
|
|
15
|
+
registry = new Map();
|
|
16
|
+
defaultStrategy;
|
|
17
|
+
constructor(defaultStrategy = 'first') {
|
|
18
|
+
this.defaultStrategy = defaultStrategy;
|
|
19
|
+
}
|
|
20
|
+
/** 注册一个能力声明 */
|
|
21
|
+
registerCapability(capability) {
|
|
22
|
+
const existing = this.registry.get(capability.name);
|
|
23
|
+
if (existing) {
|
|
24
|
+
throw new Error(`Capability "${capability.name}" is already registered`);
|
|
25
|
+
}
|
|
26
|
+
this.registry.set(capability.name, { capability, implementations: [] });
|
|
27
|
+
}
|
|
28
|
+
/** 注册能力实现 */
|
|
29
|
+
registerImplementation(impl) {
|
|
30
|
+
const entry = this.registry.get(impl.capability);
|
|
31
|
+
if (!entry) {
|
|
32
|
+
throw new Error(`Cannot register implementation for unknown capability "${impl.capability}". Register the capability first.`);
|
|
33
|
+
}
|
|
34
|
+
entry.implementations.push(impl);
|
|
35
|
+
}
|
|
36
|
+
/** 列出所有能力声明 */
|
|
37
|
+
list() {
|
|
38
|
+
return Array.from(this.registry.values()).map((e) => e.capability);
|
|
39
|
+
}
|
|
40
|
+
/** 检查能力是否存在 */
|
|
41
|
+
has(name) {
|
|
42
|
+
return this.registry.has(name);
|
|
43
|
+
}
|
|
44
|
+
/** 获取能力声明 */
|
|
45
|
+
get(name) {
|
|
46
|
+
return this.registry.get(name)?.capability;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 解析能力实现。
|
|
50
|
+
* - 若指定 preferredEngine 且存在匹配实现,直接返回;
|
|
51
|
+
* - 否则按构造时设定的 defaultStrategy 选择('first'/'fastest'/'balanced')。
|
|
52
|
+
*/
|
|
53
|
+
resolve(name, preferredEngine) {
|
|
54
|
+
const entry = this.registry.get(name);
|
|
55
|
+
if (!entry || entry.implementations.length === 0)
|
|
56
|
+
return undefined;
|
|
57
|
+
if (preferredEngine) {
|
|
58
|
+
const impl = entry.implementations.find((i) => i.engine === preferredEngine);
|
|
59
|
+
if (impl)
|
|
60
|
+
return impl;
|
|
61
|
+
}
|
|
62
|
+
return this.selectByStrategy(entry.implementations, entry.capability);
|
|
63
|
+
}
|
|
64
|
+
/** 按默认策略从实现列表中选择一个 */
|
|
65
|
+
selectByStrategy(impls, capability) {
|
|
66
|
+
switch (this.defaultStrategy) {
|
|
67
|
+
case 'first':
|
|
68
|
+
return impls[0];
|
|
69
|
+
case 'fastest':
|
|
70
|
+
return this.fastest(impls, capability);
|
|
71
|
+
case 'balanced': {
|
|
72
|
+
// 优先取与能力声明 performance 匹配的实现(同档按注册顺序)
|
|
73
|
+
const target = capability.performance;
|
|
74
|
+
const matching = impls.filter((i) => this.perfOf(i, capability) === target);
|
|
75
|
+
if (matching.length > 0)
|
|
76
|
+
return matching[0];
|
|
77
|
+
// 无匹配则退化为最快
|
|
78
|
+
return this.fastest(impls, capability);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** 取性能等级最优的实现(同档按注册顺序,稳定排序) */
|
|
83
|
+
fastest(impls, capability) {
|
|
84
|
+
return impls.reduce((best, cur) => {
|
|
85
|
+
const a = PERFORMANCE_RANK[this.perfOf(best, capability)];
|
|
86
|
+
const b = PERFORMANCE_RANK[this.perfOf(cur, capability)];
|
|
87
|
+
// 仅当严格更优时替换,保证同档保留先注册的(稳定性)
|
|
88
|
+
return b < a ? cur : best;
|
|
89
|
+
}, impls[0]);
|
|
90
|
+
}
|
|
91
|
+
/** 实现的性能等级:优先用实现自身声明,缺省回退到能力声明 */
|
|
92
|
+
perfOf(impl, capability) {
|
|
93
|
+
return impl.performance ?? capability.performance;
|
|
94
|
+
}
|
|
95
|
+
/** 清除所有注册 */
|
|
96
|
+
clear() {
|
|
97
|
+
this.registry.clear();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=capability-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../src/capability-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lokvis Event Bus Implementation
|
|
3
|
+
*
|
|
4
|
+
* 基于 mitt 的轻量事件总线实现。
|
|
5
|
+
* 所有操作发出标准事件,Analytics/Undo/AI/Plugin 都监听事件。
|
|
6
|
+
*/
|
|
7
|
+
import type { EventBus } from '@lokvis/schema';
|
|
8
|
+
export declare function createEventBus(): EventBus;
|
|
9
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAI5D,wBAAgB,cAAc,IAAI,QAAQ,CA4BzC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lokvis Event Bus Implementation
|
|
3
|
+
*
|
|
4
|
+
* 基于 mitt 的轻量事件总线实现。
|
|
5
|
+
* 所有操作发出标准事件,Analytics/Undo/AI/Plugin 都监听事件。
|
|
6
|
+
*/
|
|
7
|
+
import mitt from 'mitt';
|
|
8
|
+
export function createEventBus() {
|
|
9
|
+
const emitter = mitt();
|
|
10
|
+
const anyHandlers = new Set();
|
|
11
|
+
return {
|
|
12
|
+
on(type, handler) {
|
|
13
|
+
const wrapped = (e) => handler(e);
|
|
14
|
+
emitter.on(type, wrapped);
|
|
15
|
+
return () => emitter.off(type, wrapped);
|
|
16
|
+
},
|
|
17
|
+
onAny(handler) {
|
|
18
|
+
anyHandlers.add(handler);
|
|
19
|
+
return () => anyHandlers.delete(handler);
|
|
20
|
+
},
|
|
21
|
+
emit(event) {
|
|
22
|
+
emitter.emit(event.type, event);
|
|
23
|
+
for (const handler of anyHandlers) {
|
|
24
|
+
handler(event);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
clear() {
|
|
28
|
+
emitter.all.clear();
|
|
29
|
+
anyHandlers.clear();
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,IAAI,EAAU,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE5D,OAAO;QACL,EAAE,CAAC,IAAI,EAAE,OAAO;YACd,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,CAAU,CAAC,CAAC;YACpD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1B,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,CAAC,OAAO;YACX,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,KAAK;YACR,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAChC,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,KAAK;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACpB,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lokvis Workflow Executor
|
|
3
|
+
*
|
|
4
|
+
* 第一年只支持 Linear Workflow(线性链)。
|
|
5
|
+
* 不支持:Branch / Loop / Condition / Parallel。
|
|
6
|
+
*/
|
|
7
|
+
import type { Asset, AssetId, Workflow, WorkflowResult } from '@lokvis/schema';
|
|
8
|
+
import type { EventBus } from '@lokvis/schema';
|
|
9
|
+
import type { AssetStore } from './asset-store.js';
|
|
10
|
+
import type { CapabilityRegistry } from './capability-registry.js';
|
|
11
|
+
/** Workflow 执行器配置 */
|
|
12
|
+
export interface ExecutorConfig {
|
|
13
|
+
assetStore: AssetStore;
|
|
14
|
+
capabilityRegistry: CapabilityRegistry;
|
|
15
|
+
eventBus: EventBus;
|
|
16
|
+
enableLog: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Workflow 执行器 */
|
|
19
|
+
export declare class WorkflowExecutor {
|
|
20
|
+
private config;
|
|
21
|
+
private running;
|
|
22
|
+
/** 暂停时挂起的 resolve:resume/cancel 唤醒之,避免轮询 */
|
|
23
|
+
private resumeResolvers;
|
|
24
|
+
constructor(config: ExecutorConfig);
|
|
25
|
+
/** 执行工作流 */
|
|
26
|
+
execute(workflow: Workflow, inputs: AssetId[] | Asset[]): Promise<WorkflowResult>;
|
|
27
|
+
/** 取消执行 */
|
|
28
|
+
cancel(workflowId: string): Promise<void>;
|
|
29
|
+
/** 暂停执行 */
|
|
30
|
+
pause(workflowId: string): Promise<void>;
|
|
31
|
+
/** 恢复执行 */
|
|
32
|
+
resume(workflowId: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* 挂起当前执行直到 resume/cancel 唤醒(Promise resolver 模式)。
|
|
35
|
+
* 相比轮询(setTimeout)无延迟、无 CPU 占用;resume/cancel 通过
|
|
36
|
+
* resolveResume 触发 resolver。
|
|
37
|
+
*/
|
|
38
|
+
private waitForResume;
|
|
39
|
+
/** 唤醒挂起的 waitForResume(若存在) */
|
|
40
|
+
private resolveResume;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EAEP,QAAQ,EAGR,cAAc,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAWnE,qBAAqB;AACrB,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAkED,mBAAmB;AACnB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAsC;IACrD,4CAA4C;IAC5C,OAAO,CAAC,eAAe,CAAiC;gBAE5C,MAAM,EAAE,cAAc;IAIlC,YAAY;IACN,OAAO,CACX,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAC1B,OAAO,CAAC,cAAc,CAAC;IA0I1B,WAAW;IACL,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C,WAAW;IACL,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,WAAW;IACL,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAMrB,+BAA+B;IAC/B,OAAO,CAAC,aAAa;CAOtB"}
|