@deeprespond/im-tauri 0.0.0-stage → 1.0.0-alpha
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/LICENSE +21 -0
- package/README.md +70 -2
- package/dist/chunk-DMEEI2YZ.js +1161 -0
- package/dist/chunk-DMEEI2YZ.js.map +1 -0
- package/dist/engine.d.ts +21 -0
- package/dist/engine.js +536 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/types-CVlFmFSn.d.ts +277 -0
- package/package.json +52 -4
- package/src/templates/engine.html +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapter/files.ts","../src/adapter/channel.ts","../src/adapter/database.ts","../src/adapter/kv.ts","../src/adapter/locks.ts","../src/adapter/visibility.ts","../src/adapter/index.ts","../src/version.ts","../src/adapter/ipc.ts","../src/common.ts","../src/desktop/module.ts"],"names":["DRError"],"mappings":"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","file":"chunk-DMEEI2YZ.js","sourcesContent":["import type { FilesAdapter, PathFile, PathFileInfo, PathImageResult } from '@deeprespond/im-web/platform';\nimport type { Bridge } from './ipc';\n\n/** Blob 落盘时每次交给插件的块(以原始字节传输,不经 JSON,《4.实现与测试》第 3.6 节)。 */\nconst CHUNK = 4 * 1024 * 1024;\n\nlet taskSeq = 0;\nexport function newTask(prefix: string): string {\n taskSeq += 1;\n return `${prefix}-${Date.now().toString(36)}-${taskSeq}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** 本地文件的预览地址(drim-file 协议,《2.功能概述文档》第 9.2 节);Windows 的 WebView2 用 http://drim-file.localhost。 */\nexport function fileUrl(path: string, os: string | undefined): string {\n const encoded = encodeURIComponent(path);\n return os === 'windows' ? `http://drim-file.localhost/${encoded}` : `drim-file://localhost/${encoded}`;\n}\n\n/** 按 User-Agent 判断系统(hello 之前也要能用)。 */\nexport function osFromUserAgent(ua: string): 'windows' | 'macos' | 'linux' {\n if (/Windows/.test(ua)) return 'windows';\n if (/Mac OS X|Macintosh/.test(ua)) return 'macos';\n return 'linux';\n}\n\n/**\n * 路径文件(《2.功能概述文档》第 9 节):信息、类型、图片处理、分片上传都由插件按路径进行,内容不进入 JavaScript 的内存。\n */\nexport function pluginFiles(bridge: Bridge): FilesAdapter & { writeBlobTemp(blob: Blob, name?: string): Promise<PathFile & { size: number }> } {\n const os = () => bridge.info?.os ?? osFromUserAgent(typeof navigator !== 'undefined' ? navigator.userAgent : '');\n const writeBlob = async (blob: Blob, opts: { name?: string } = {}): Promise<PathFile & { size: number }> => {\n let handle = '';\n let result: { handle: string; path: string; size: number } | null = null;\n const name = opts.name ?? (blob as { name?: string }).name ?? '';\n for (let offset = 0; offset < blob.size || result === null; offset += CHUNK) {\n const end = Math.min(blob.size, offset + CHUNK);\n const bytes = new Uint8Array(await blob.slice(offset, end).arrayBuffer());\n const final = end >= blob.size;\n result = await bridge.callRaw<{ handle: string; path: string; size: number }>('files_write', bytes, {\n 'x-drim-handle': handle,\n 'x-drim-name': encodeURIComponent(name),\n 'x-drim-final': final ? '1' : '0',\n });\n handle = result.handle;\n if (final) break;\n }\n const out: PathFile & { size: number } = { path: result!.path, temp: true, size: result!.size };\n if (name) out.name = name;\n if (blob.type) out.type = blob.type;\n return out;\n };\n return {\n stat: (path) => bridge.call<PathFileInfo>('files_stat', { path }),\n read: async (path, offset, length) => new Uint8Array(await bridge.call<ArrayBuffer>('files_read', { path, offset, length })),\n writeBlob,\n writeBlobTemp: (blob, name) => writeBlob(blob, { name }),\n persist: (file, opts) => bridge.call('files_persist', { path: file.path, temp: file.temp === true, app_key: opts.appKey, username: opts.username, copy_max_bytes: opts.copyMaxBytes }),\n release: (path, owned) => bridge.call('files_release', { path, owned }),\n uploadPart: async (req) => {\n const task = newTask('up');\n const off = bridge.on('upload_progress', (event) => {\n if (event.task === task && typeof event.loaded === 'number') req.onProgress?.(event.loaded);\n });\n const onAbort = () => void bridge.call('files_cancel', { task }).catch(() => {});\n req.signal?.addEventListener('abort', onAbort, { once: true });\n try {\n const r = await bridge.call<{ status: number }>('files_upload_part', {\n task,\n path: req.path,\n offset: req.offset,\n length: req.length,\n url: req.url,\n method: req.method,\n headers: req.headers,\n expect: req.expect ?? null,\n patches: req.patches ?? null,\n });\n return r.status;\n } finally {\n off();\n req.signal?.removeEventListener('abort', onAbort);\n }\n },\n prepareImage: (path, opts) =>\n bridge.call<PathImageResult | { kind: 'file'; downgraded: 'image_too_large' | 'unsupported_type' }>('files_prepare_image', {\n path,\n original: opts.original,\n max_side: opts.maxSide,\n quality: opts.quality,\n max_bytes: opts.maxBytes,\n max_pixels: opts.maxPixels,\n }),\n prepareVideo: (path) => bridge.call('files_prepare_video', { path }),\n url: (path) => fileUrl(path, os()),\n };\n}\n\n/**\n * 转发调用之前处理参数(《4.实现与测试》第 2 节):插件的频道只能传 JSON,参数中的 Blob 先写入临时文件,换成 { path }。\n * 只遍历普通对象和数组。\n */\nexport async function blobsToPaths(value: unknown, write: (blob: Blob, name?: string) => Promise<PathFile & { size: number }>): Promise<unknown> {\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n const written = await write(value, (value as { name?: string }).name);\n const out: PathFile = { path: written.path, temp: true };\n if (written.name) out.name = written.name;\n if (value.type) out.type = value.type;\n return out;\n }\n if (Array.isArray(value)) return Promise.all(value.map((v) => blobsToPaths(v, write)));\n if (value && typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype) {\n const entries = await Promise.all(Object.entries(value).map(async ([k, v]) => [k, await blobsToPaths(v, write)] as const));\n return Object.fromEntries(entries);\n }\n return value;\n}\n","import { DRError } from '@deeprespond/im-web';\nimport type { ChannelLike } from '@deeprespond/im-web/platform';\nimport type { Bridge } from './ipc';\n\n/**\n * 插件的频道(代替 BroadcastChannel,《4.实现与测试》第 3.3 节):消息转发给全部持有同名频道的其他页面,不回发给自己。\n * 插件的频道只能传 JSON:DRError、Uint8Array 按约定编码后还原;Blob 不能传(转发调用前由 prepareForward 落盘)。\n * 同一页面的消息按顺序排队,一次交给插件一批,保证到达的顺序。\n */\nexport function pluginChannel(bridge: Bridge, name: string, onError: (err: unknown) => void): ChannelLike {\n let closed = false;\n let pending: string[] = [];\n let flushing = false;\n const joined = bridge.call('bus_join', { name }).catch(onError);\n const flush = async () => {\n if (flushing) return;\n flushing = true;\n try {\n await joined;\n while (pending.length > 0) {\n const msgs = pending;\n pending = [];\n await bridge.call('bus_post', { name, msgs }).catch(onError);\n }\n } finally {\n flushing = false;\n if (pending.length > 0 && !closed) void flush();\n }\n };\n let willSet = false;\n const wrapper: ChannelLike = {\n onmessage: null,\n postMessage: (msg) => {\n if (closed) return;\n pending.push(encode(msg));\n // 窗口被关闭、崩溃时页面来不及发 bye(Web SDK 的标签页协议,《sdk-web/4.实现与测试》第 5 节):\n // 从本页面发出的第一条消息得知标签页 ID,请插件在页面不在了时替它发出\n const m = msg as { v?: unknown; from?: unknown } | null;\n if (!willSet && m && typeof m === 'object' && typeof m.from === 'string' && typeof m.v === 'number') {\n willSet = true;\n void joined.then(() => bridge.call('bus_will', { name, msg: encode({ v: m.v, from: m.from, type: 'bye' }) })).catch(() => {});\n }\n void flush();\n },\n close: () => {\n if (closed) return;\n closed = true;\n off();\n void flush().then(() => bridge.call('bus_leave', { name })).catch(() => {});\n },\n };\n const off = bridge.on('bus', (event) => {\n if (closed || event.name !== name || typeof event.msg !== 'string') return;\n let decoded: unknown;\n try {\n decoded = decode(event.msg);\n } catch {\n return;\n }\n wrapper.onmessage?.(decoded);\n });\n return wrapper;\n}\n\n/** 编码为 JSON;不能表示的值(Blob、函数)抛出,与结构化克隆失败时一样由调用方处理。 */\nexport function encode(msg: unknown): string {\n return JSON.stringify(msg, function replacer(this: unknown, _key: string, value: unknown) {\n if (value instanceof DRError) return { $drerr: value.toData() };\n if (value instanceof Uint8Array) return { $u8: toBase64(value) };\n if (typeof Blob !== 'undefined' && value instanceof Blob) throw Object.assign(new Error('Blob 不能经插件的频道传递'), { name: 'DataCloneError' });\n if (typeof value === 'function') throw Object.assign(new Error('函数不能经插件的频道传递'), { name: 'DataCloneError' });\n if (value instanceof Error) return { $err: { name: value.name, message: value.message } };\n return value;\n });\n}\n\nexport function decode(text: string): unknown {\n return JSON.parse(text, (_key, value: unknown) => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if ('$drerr' in v) return DRError.fromData(v.$drerr as never);\n if ('$u8' in v && typeof v.$u8 === 'string') return fromBase64(v.$u8);\n if ('$err' in v) {\n const e = v.$err as { name?: string; message?: string };\n return Object.assign(new Error(e.message ?? ''), { name: e.name ?? 'Error' });\n }\n }\n return value;\n });\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n let s = '';\n for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]!);\n return btoa(s);\n}\n\nfunction fromBase64(text: string): Uint8Array {\n const s = atob(text);\n const out = new Uint8Array(s.length);\n for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i);\n return out;\n}\n","import { DRError } from '@deeprespond/im-web';\nimport { extractKey, isValidKey, type DatabaseLike, type IDBKeyLike, type KeyRangeLike, type StoreSchema, type TxLike, type UpgradeFn } from '@deeprespond/im-web/platform';\nimport type { Bridge } from './ipc';\n\ntype WriteOp = { op: 'put'; store: string; value: unknown } | { op: 'delete'; store: string; key?: IDBKeyLike; range?: KeyRangeLike } | { op: 'clear'; store: string };\n\n/** 一个页面中的事务排队:写事务一个接一个;只读事务等在它之前开始的写事务结束(与 IndexedDB 的顺序相同)。 */\nconst QUEUE_WAIT_MS = 10000;\n\nclass TxAbort extends Error {\n constructor(readonly reason: unknown) {\n super('aborted');\n }\n}\n\n/**\n * 跨进程边界的数据库(《1.本地存储》第 5 节):插件的 SQLite,Web SDK 的存储层照常以 transaction(stores, mode, fn) 使用。\n * - 开始事务得到事务 ID,之后的读写带上它;fn 正常结束时提交,抛出时回滚;\n * - 写入先在本页面缓存,下一次读取或提交时一起交给插件(减少跨进程的往返;插件在同一个连接上依次执行,读得到自己的写入);\n * - 遍历分批(每批最多 200 条),游标随事务结束失效。\n */\nexport class TauriDatabase implements DatabaseLike {\n readonly storeNames: readonly string[];\n readonly resetReason?: 'corrupted' | 'schema_downgrade' | 'encryption_changed';\n #schemas: Map<string, StoreSchema>;\n #writeChain: Promise<void> = Promise.resolve();\n #closed = false;\n #listeners = new Set<(newVersion: number | null) => void>();\n #off: () => void;\n\n constructor(\n private readonly bridge: Bridge,\n private readonly handle: number,\n schema: StoreSchema[],\n readonly appKey: string,\n readonly username: string,\n reset: TauriDatabase['resetReason'] | null,\n ) {\n this.storeNames = schema.map((s) => s.name);\n this.#schemas = new Map(schema.map((s) => [s.name, s]));\n if (reset) this.resetReason = reset;\n this.#off = bridge.on('db_deleted', (event) => {\n if (event.app_key !== appKey || String(event.username).toLowerCase() !== username) return;\n for (const listener of [...this.#listeners]) listener(null);\n });\n }\n\n static async open(bridge: Bridge, appKey: string, name: string, version: number, upgrade: UpgradeFn, encrypt: boolean): Promise<TauriDatabase> {\n const prefix = `im:${appKey}:`;\n if (!name.startsWith(prefix)) throw new DRError({ code: 'invalid_state', message: `数据库名不对:${name}`, details: { reason: 'database_name' }, source: 'local' });\n const username = name.slice(prefix.length).toLowerCase();\n const schema = upgrade(0, version);\n const r = await bridge.call<{ db: number; old_version: number; reset: TauriDatabase['resetReason'] | null }>('db_open', { app_key: appKey, username, version, schema, encrypt });\n return new TauriDatabase(bridge, r.db, schema, appKey, username, r.reset);\n }\n\n async transaction<T>(stores: string[], mode: 'readonly' | 'readwrite', fn: (tx: TxLike) => Promise<T>, opts?: { durability?: 'strict' | 'default' }): Promise<T> {\n if (this.#closed) throw new DRError({ code: 'storage_error', message: 'closed', details: { reason: 'closed' }, source: 'local' });\n for (const store of stores) if (!this.#schemas.has(store)) throw new DRError({ code: 'storage_error', message: `没有对象仓库 ${store}`, details: { reason: 'NotFoundError' }, source: 'local' });\n let release: () => void = () => {};\n if (mode === 'readwrite') {\n const previous = this.#writeChain;\n this.#writeChain = new Promise<void>((resolve) => (release = resolve));\n await waitFor(previous);\n } else {\n await waitFor(this.#writeChain);\n }\n try {\n const { tx } = await this.bridge.call<{ tx: number }>('tx_begin', { db: this.handle, stores, mode, durability: opts?.durability ?? 'default' });\n const txLike = new PluginTx(this.bridge, tx, this.#schemas, mode);\n let result: T;\n try {\n result = await fn(txLike);\n } catch (err) {\n await this.bridge.call('tx_abort', { tx }).catch(() => {});\n if (err instanceof TxAbort) throw err.reason;\n throw err;\n }\n if (txLike.aborted) {\n await this.bridge.call('tx_abort', { tx }).catch(() => {});\n throw txLike.aborted.reason;\n }\n await this.bridge.call('tx_commit', { tx, ops: txLike.takeWrites() });\n return result;\n } finally {\n release();\n }\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#off();\n void this.bridge.call('db_close', { db: this.handle }).catch(() => {});\n }\n\n onVersionChange(listener: (newVersion: number | null) => void): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n}\n\n/** 等前一个事务结束;超过 10 秒(页面中的代码在事务里等了别的事务)不再等,插件的空闲超时会回滚卡住的那个。 */\nfunction waitFor(p: Promise<void>): Promise<void> {\n return Promise.race([p, new Promise<void>((resolve) => setTimeout(resolve, QUEUE_WAIT_MS))]);\n}\n\nclass PluginTx implements TxLike {\n #writes: WriteOp[] = [];\n aborted: TxAbort | null = null;\n\n constructor(\n private readonly bridge: Bridge,\n private readonly tx: number,\n private readonly schemas: Map<string, StoreSchema>,\n private readonly mode: 'readonly' | 'readwrite',\n ) {}\n\n takeWrites(): WriteOp[] {\n const out = this.#writes;\n this.#writes = [];\n return out;\n }\n\n async #flush(): Promise<void> {\n if (this.#writes.length === 0) return;\n await this.bridge.call('tx_write', { tx: this.tx, ops: this.takeWrites() });\n }\n\n async #read<T>(args: Record<string, unknown>): Promise<T> {\n this.#check();\n await this.#flush();\n return this.bridge.call<T>('tx_read', { tx: this.tx, ...args });\n }\n\n #check(): void {\n if (this.aborted) throw this.aborted;\n }\n\n #requireWrite(store: string): StoreSchema {\n this.#check();\n if (this.mode !== 'readwrite') throw new DRError({ code: 'storage_error', message: 'ReadOnlyError', details: { reason: 'ReadOnlyError' }, source: 'local' });\n const schema = this.schemas.get(store);\n if (!schema) throw new DRError({ code: 'storage_error', message: `没有对象仓库 ${store}`, details: { reason: 'NotFoundError' }, source: 'local' });\n return schema;\n }\n\n async get(store: string, key: IDBKeyLike): Promise<unknown> {\n const value = await this.#read<unknown>({ op: 'get', store, key });\n return value ?? undefined;\n }\n\n async getAll(store: string, p: { index?: string; range?: KeyRangeLike; limit?: number } = {}): Promise<unknown[]> {\n return this.#read<unknown[]>({ op: 'get_all', store, index: p.index, range: p.range, limit: p.limit });\n }\n\n async count(store: string, p: { index?: string; range?: KeyRangeLike } = {}): Promise<number> {\n return this.#read<number>({ op: 'count', store, index: p.index, range: p.range });\n }\n\n async *iterate(store: string, p: { index?: string; range?: KeyRangeLike; direction?: 'next' | 'prev'; limit?: number }): AsyncIterable<unknown> {\n let remaining = p.limit;\n let cursor: string | null = null;\n for (;;) {\n const batch: { items: unknown[]; cursor: string | null } = await this.#read({ op: 'iterate', store, index: p.index, range: p.range, direction: p.direction ?? 'next', limit: remaining, cursor });\n for (const item of batch.items) yield item;\n if (remaining !== undefined) remaining -= batch.items.length;\n if (!batch.cursor || (remaining !== undefined && remaining <= 0)) return;\n cursor = batch.cursor;\n }\n }\n\n async put(store: string, value: unknown): Promise<void> {\n const schema = this.#requireWrite(store);\n // 主键不合法的与 IndexedDB 一样立即拒绝(DataError),不等到提交\n if (extractKey(value, schema.keyPath) === undefined) throw new DRError({ code: 'storage_error', message: `${store} 的记录没有合法的主键`, details: { reason: 'DataError' }, source: 'local' });\n this.#writes.push({ op: 'put', store, value });\n }\n\n async delete(store: string, key: IDBKeyLike | KeyRangeLike): Promise<void> {\n this.#requireWrite(store);\n if (isValidKey(key)) this.#writes.push({ op: 'delete', store, key });\n else this.#writes.push({ op: 'delete', store, range: key as KeyRangeLike });\n }\n\n async clear(store: string): Promise<void> {\n this.#requireWrite(store);\n this.#writes.push({ op: 'clear', store });\n }\n\n abort(reason: unknown): never {\n this.aborted = new TxAbort(reason);\n throw this.aborted;\n }\n}\n","import type { KeyValueLike } from '@deeprespond/im-web/platform';\nimport type { Bridge } from './ipc';\n\n/** Web SDK 的键(《sdk-web/1.本地存储》第 2 节)→ 插件中的位置(《1.本地存储》第 2.2 节)。 */\nconst DEVICE_ID_KEY = 'im:device_id';\n\nfunction parse(appKey: string, key: string): 'session' | 'pending_logout' | 'users' | null {\n const prefix = `im:${appKey}:`;\n if (!key.startsWith(prefix)) return null;\n switch (key.slice(prefix.length)) {\n case 'session':\n return 'session';\n case 'pending_logout':\n return 'pending_logout';\n case 'dbs':\n return 'users';\n default:\n return null;\n }\n}\n\n/** 界面窗口同步读取登录状态用的摘要(不含令牌):引擎写入 WebView 的 localStorage,以插件为准。 */\nexport function hintKey(appKey: string): string {\n return `drim:${appKey}:session_hint`;\n}\n\nfunction localStorageSafe(): Storage | null {\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * 引擎的键值存储:会话、待退出列表加密保存在插件中(secure.bin,主密钥在系统钥匙串),数据库列表在 users.json。\n * 只有引擎读写;启动时整体读入内存(load),写入先改内存,再按顺序交给插件。\n */\nexport class EngineKv implements KeyValueLike {\n #cache = new Map<string, string>();\n #queue: Promise<void> = Promise.resolve();\n\n constructor(\n private readonly bridge: Bridge,\n private readonly appKey: string,\n private readonly onError: (err: unknown) => void,\n ) {}\n\n async load(): Promise<void> {\n const r = await this.bridge.call<{ session: string | null; pending_logout: string | null; users: string | null; device_id: string }>('secure_load', { app_key: this.appKey });\n const set = (key: string, value: string | null) => (value === null ? this.#cache.delete(key) : this.#cache.set(key, value));\n set(`im:${this.appKey}:session`, r.session);\n set(`im:${this.appKey}:pending_logout`, r.pending_logout);\n set(`im:${this.appKey}:dbs`, r.users);\n this.#cache.set(DEVICE_ID_KEY, r.device_id);\n this.#writeHint(r.session);\n }\n\n get(key: string): string | null {\n return this.#cache.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n // 设备标识由插件生成和保存,不能改\n if (key === DEVICE_ID_KEY) return;\n const target = parse(this.appKey, key);\n let stored = value;\n if (target === 'session') stored = this.#withDevice(value);\n this.#cache.set(key, stored);\n if (target) this.#persist(target, stored);\n if (target === 'session') this.#writeHint(stored);\n }\n\n remove(key: string): void {\n if (key === DEVICE_ID_KEY) return;\n const target = parse(this.appKey, key);\n this.#cache.delete(key);\n if (target) this.#persist(target, null);\n if (target === 'session') this.#writeHint(null);\n }\n\n onChange(): () => void {\n // 只有引擎写入,不会有其他来源的变化\n return () => {};\n }\n\n /** 等全部写入交给插件(退出前)。 */\n flush(): Promise<void> {\n return this.#queue;\n }\n\n /** 会话中记下登录时的设备标识(《1.本地存储》第 2.3 节):重装、复制到另一台电脑后据此丢弃。 */\n #withDevice(value: string): string {\n const deviceId = this.#cache.get(DEVICE_ID_KEY);\n if (!deviceId) return value;\n try {\n const session = JSON.parse(value) as Record<string, unknown>;\n return JSON.stringify({ ...session, device_id: deviceId });\n } catch {\n return value;\n }\n }\n\n #persist(key: 'session' | 'pending_logout' | 'users', value: string | null): void {\n this.#queue = this.#queue.then(() => this.bridge.call<void>('secure_set', { app_key: this.appKey, key, value })).catch((err) => this.onError(err));\n }\n\n #writeHint(session: string | null): void {\n const storage = localStorageSafe();\n if (!storage) return;\n try {\n const parsed = session ? (JSON.parse(session) as { username?: unknown; session_id?: unknown }) : null;\n if (parsed && typeof parsed.username === 'string' && typeof parsed.session_id === 'string') {\n storage.setItem(hintKey(this.appKey), JSON.stringify({ username: parsed.username, session_id: parsed.session_id }));\n } else {\n storage.removeItem(hintKey(this.appKey));\n }\n } catch {\n // WebView 的存储不可用:界面窗口等插件的结果\n }\n }\n}\n\ninterface Hint {\n username: string;\n session_id: string;\n}\n\n/**\n * 界面窗口的键值存储:只读,只提供会话的用户名和会话 ID(《3.接口设计》第 4 节)。\n * 创建客户端时先用引擎写在 localStorage 中的摘要(同步,登录状态立即可用),随后以插件的结果为准,变化时经 onChange 通知。\n */\nexport class WindowKv implements KeyValueLike {\n #hint: Hint | null;\n #listeners = new Set<(key: string) => void>();\n readonly #sessionKey: string;\n\n constructor(\n private readonly bridge: Bridge,\n private readonly appKey: string,\n ) {\n this.#sessionKey = `im:${appKey}:session`;\n this.#hint = readHint(appKey);\n bridge.on('kv', (event) => {\n if (event.app_key !== this.appKey || event.key !== 'session') return;\n this.#update((event.hint as Hint | null) ?? null);\n });\n void this.refresh().catch(() => {});\n }\n\n get(key: string): string | null {\n if (key === DEVICE_ID_KEY) return this.bridge.info?.device_id ?? null;\n if (key !== this.#sessionKey || !this.#hint) return null;\n // Web SDK 的会话格式,令牌留空:界面窗口不持有令牌,服务端调用都转给引擎\n return JSON.stringify({ v: 1, username: this.#hint.username, session_id: this.#hint.session_id, access_token: '', access_expires_at: null, refresh_token: '', refresh_expires_at: null, login_method: 'password' });\n }\n\n set(): void {}\n\n remove(): void {}\n\n onChange(listener: (key: string) => void): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n async refresh(): Promise<void> {\n const hint = await this.bridge.call<Hint | null>('session_hint', { app_key: this.appKey });\n this.#update(hint);\n }\n\n #update(hint: Hint | null): void {\n const same = hint === null ? this.#hint === null : this.#hint !== null && this.#hint.username === hint.username && this.#hint.session_id === hint.session_id;\n if (same) return;\n this.#hint = hint ? { username: hint.username, session_id: hint.session_id } : null;\n for (const listener of [...this.#listeners]) listener(this.#sessionKey);\n }\n}\n\nfunction readHint(appKey: string): Hint | null {\n const storage = localStorageSafe();\n if (!storage) return null;\n try {\n const raw = storage.getItem(hintKey(appKey));\n if (!raw) return null;\n const hint = JSON.parse(raw) as Partial<Hint>;\n return typeof hint.username === 'string' && typeof hint.session_id === 'string' ? { username: hint.username, session_id: hint.session_id } : null;\n } catch {\n return null;\n }\n}\n\n/** 内存中的键值(sessionKv、两个角色都不需要持久化的键)。 */\nexport function memoryKv(): KeyValueLike {\n const data = new Map<string, string>();\n return {\n get: (key) => data.get(key) ?? null,\n set: (key, value) => void data.set(key, value),\n remove: (key) => void data.delete(key),\n onChange: () => () => {},\n };\n}\n","import type { LockRequestOptions, LocksLike } from '@deeprespond/im-web/platform';\nimport type { Bridge } from './ipc';\n\nfunction abortError(): Error {\n return Object.assign(new Error('aborted'), { name: 'AbortError' });\n}\n\n/**\n * 插件的锁(《4.实现与测试》第 3.3 节):语义与 Web Locks 相同,在全部窗口之间生效;\n * 持有者所在的页面关闭、崩溃、重新加载时由插件释放。被 steal 时,原来的 request 以 AbortError 拒绝(与 Web Locks 相同)。\n */\nexport class PluginLocks implements LocksLike {\n readonly native = true;\n #stolen = new Map<string, (err: Error) => void>();\n #seq = 0;\n\n constructor(private readonly bridge: Bridge) {\n bridge.on('lock_stolen', (event) => {\n const reject = this.#stolen.get(String(event.id));\n if (reject) {\n this.#stolen.delete(String(event.id));\n reject(abortError());\n }\n });\n }\n\n async request<T>(name: string, opts: LockRequestOptions, fn: (acquired: boolean) => Promise<T>): Promise<T> {\n if (opts.signal?.aborted) throw opts.signal.reason ?? abortError();\n const id = `${this.bridge.label}:${++this.#seq}:${Math.random().toString(36).slice(2)}`;\n const onAbort = () => void this.bridge.call('lock_cancel', { id }).catch(() => {});\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n let granted: boolean;\n try {\n granted = await this.bridge.call<boolean>('lock_request', { name, id, steal: opts.steal === true, if_available: opts.ifAvailable === true });\n } catch (err) {\n if (opts.signal?.aborted) throw opts.signal.reason ?? abortError();\n throw err;\n } finally {\n opts.signal?.removeEventListener('abort', onAbort);\n }\n if (!granted) return fn(false);\n let stolen = false;\n const stolenPromise = new Promise<never>((_, reject) => {\n this.#stolen.set(id, (err) => {\n stolen = true;\n reject(err);\n });\n });\n stolenPromise.catch(() => {});\n try {\n return await Promise.race([fn(true), stolenPromise]);\n } finally {\n this.#stolen.delete(id);\n if (!stolen) void this.bridge.call('lock_release', { id }).catch(() => {});\n }\n }\n}\n","import type { NetworkLike, VisibilityLike } from '@deeprespond/im-web/platform';\nimport type { Bridge } from './ipc';\n\ntype State = { visible: boolean; focused: boolean };\n\n/** 引擎窗口:永远不可见、不获得焦点(《4.实现与测试》第 2 节)。 */\nexport function engineVisibility(): VisibilityLike {\n return { visible: () => false, focused: () => false, onChange: () => () => {} };\n}\n\n/**\n * 界面窗口的可见性和焦点(《2.功能概述文档》第 5.3 节):来自插件的窗口事件(最小化、隐藏、锁屏都算不可见),\n * 页面的 visibilitychange、focus、blur 作为补充并触发重新查询。\n */\nexport function windowVisibility(bridge: Bridge): VisibilityLike {\n const doc = typeof document !== 'undefined' ? document : undefined;\n const pageVisible = () => (doc ? doc.visibilityState !== 'hidden' : true);\n const pageFocused = () => (doc && typeof doc.hasFocus === 'function' ? doc.hasFocus() : true);\n let plugin: State = { visible: pageVisible(), focused: pageFocused() };\n let last: State = current();\n const listeners = new Set<(state: State) => void>();\n\n function current(): State {\n const visible = pageVisible() && plugin.visible;\n return { visible, focused: visible && plugin.focused };\n }\n\n function fire(): void {\n const next = current();\n if (next.visible === last.visible && next.focused === last.focused) return;\n last = next;\n for (const listener of [...listeners]) listener(next);\n }\n\n function apply(state: { visible?: unknown; focused?: unknown } | null | undefined): void {\n if (!state) return;\n plugin = { visible: state.visible !== false, focused: state.focused === true };\n fire();\n }\n\n void bridge.ready.then((info) => apply(info.window), () => {});\n bridge.on('window', (event) => apply(event as { visible?: unknown; focused?: unknown }));\n bridge.on('screen_lock', () => void refresh());\n const refresh = async () => {\n try {\n apply(await bridge.call('window_state'));\n } catch {\n fire();\n }\n };\n if (doc && typeof window !== 'undefined') {\n // 页面自己的事件:先按页面的判断(焦点变化立即生效),再向插件确认最小化、锁屏\n const onFocus = () => {\n plugin = { ...plugin, focused: true, visible: true };\n fire();\n void refresh();\n };\n const onBlur = () => {\n plugin = { ...plugin, focused: false };\n fire();\n void refresh();\n };\n doc.addEventListener('visibilitychange', () => {\n fire();\n void refresh();\n });\n window.addEventListener('focus', onFocus);\n window.addEventListener('blur', onBlur);\n }\n return {\n visible: () => current().visible,\n focused: () => current().focused,\n onChange: (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\n/** 网络变化:插件监听网卡和默认路由(有线换无线、连上 VPN),WebView 的 online/offline 作为补充(《2.功能概述文档》第 7 节)。 */\nexport function pluginNetwork(bridge: Bridge): NetworkLike {\n let pluginOnline: boolean | null = null;\n const listeners = new Set<(online: boolean) => void>();\n const navOnline = () => (typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true);\n const online = () => pluginOnline ?? navOnline();\n const fire = (value: boolean) => {\n for (const listener of [...listeners]) listener(value);\n };\n bridge.on('network', (event) => {\n pluginOnline = event.online !== false;\n // 网卡变化时即使仍在线也通知:引擎据此立即检查连接\n fire(online());\n });\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => fire(true));\n window.addEventListener('offline', () => {\n if (pluginOnline !== true) fire(false);\n });\n }\n return {\n online,\n onChange: (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","import { DRError } from '@deeprespond/im-web';\nimport { WorkerTimers, type ClockLike, type LifecycleLike, type PlatformAdapter, type PlatformHost, type RandomLike, type WebSocketLike, type WorkerLike } from '@deeprespond/im-web/platform';\nimport { pluginChannel } from './channel';\nimport { TauriDatabase } from './database';\nimport { blobsToPaths, osFromUserAgent, pluginFiles } from './files';\nimport type { Bridge, EngineState } from './ipc';\nimport { EngineKv, WindowKv, memoryKv } from './kv';\nimport { PluginLocks } from './locks';\nimport { engineVisibility, pluginNetwork, windowVisibility } from './visibility';\n\nexport interface TauriPlatform {\n platform: PlatformAdapter;\n /** 引擎:安全存储的键值(ready 之前读入)。 */\n engineKv: EngineKv | null;\n windowKv: WindowKv | null;\n files: ReturnType<typeof pluginFiles>;\n /** 平台扩展取得的核心接口(创建客户端时由 extendClient 交来)。 */\n host(): PlatformHost;\n /** 当前的引擎状态(界面窗口转发调用失败时的原因)。 */\n setEngineState(state: EngineState): void;\n}\n\n/**\n * Tauri 的平台适配层(《4.实现与测试》第 2 节):引擎为 leader,界面窗口为 follower;\n * 本地存储、锁、频道、安全存储都经插件,网络请求和长连接用 WebView 自己的 fetch、WebSocket(只在引擎中)。\n */\nexport function createTauriPlatform(opts: {\n role: 'leader' | 'follower';\n appKey: string;\n bridge: Bridge;\n encrypt?: boolean;\n onWarn: (message: string, err?: unknown) => void;\n extend: (host: PlatformHost) => Record<string, PropertyDescriptor>;\n}): TauriPlatform {\n const { bridge, appKey, role } = opts;\n const engineKv = role === 'leader' ? new EngineKv(bridge, appKey, (err) => opts.onWarn('写入安全存储失败', err)) : null;\n const windowKv = role === 'follower' ? new WindowKv(bridge, appKey) : null;\n const files = pluginFiles(bridge);\n let workerTimers: WorkerTimers | null = null;\n const precise = () => {\n if (!workerTimers) workerTimers = new WorkerTimers((reason) => opts.onWarn(`计时器 Worker 不可用,改用页面的计时器:${reason}`));\n return workerTimers;\n };\n const g = globalThis as typeof globalThis;\n const clock: ClockLike = {\n now: () => Date.now(),\n monotonic: () => (typeof performance !== 'undefined' ? performance.now() : Date.now()),\n setTimeout: (fn, ms) => g.setTimeout(fn, ms) as unknown as number,\n clearTimeout: (id) => g.clearTimeout(id),\n // 存活信号、心跳、续期计划在专用 Worker 中计时,不受隐藏页面的节流(《2.功能概述文档》第 4.5 节)\n setPreciseTimeout: (fn, ms) => precise().setTimeout(fn, ms),\n clearPreciseTimeout: (id) => precise().clearTimeout(id),\n };\n let engineState: EngineState = bridge.info?.engine_state ?? 'starting';\n let host: PlatformHost | null = null;\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n const platform: PlatformAdapter = {\n fetch: (input, init) => g.fetch(input, init),\n createWebSocket: (url, protocols) => {\n if (role !== 'leader') throw new DRError({ code: 'invalid_state', message: '界面窗口不建立长连接', details: { reason: 'not_engine_window' }, source: 'local' });\n return wrapWebSocket(new WebSocket(url, protocols));\n },\n kv: engineKv ?? windowKv!,\n sessionKv: memoryKv(),\n openDatabase: (name, version, upgrade) => TauriDatabase.open(bridge, appKey, name, version, upgrade, opts.encrypt === true),\n deleteDatabase: async (name) => {\n if (role !== 'leader') return;\n const prefix = `im:${appKey}:`;\n if (!name.startsWith(prefix)) return;\n await bridge.call('db_delete', { app_key: appKey, username: name.slice(prefix.length) });\n },\n locks: new PluginLocks(bridge),\n channel: (name) => pluginChannel(bridge, name, (err) => opts.onWarn(`频道消息发送失败:${name}`, err)),\n clock,\n visibility: role === 'leader' ? engineVisibility() : windowVisibility(bridge),\n lifecycle: pageLifecycle(),\n network: pluginNetwork(bridge),\n random: cryptoRandom(),\n environment: {\n userAgent: ua,\n osVersion: async () => (await bridge.ready).os_version,\n secureContext: true,\n browser: true,\n missingCapabilities: () => {\n const missing: string[] = [];\n const any = globalThis as Record<string, unknown>;\n for (const name of ['WebSocket', 'fetch', 'TextEncoder', 'queueMicrotask', 'AbortController', 'Worker']) if (typeof any[name] === 'undefined') missing.push(name);\n if (typeof globalThis.crypto?.randomUUID !== 'function') missing.push('crypto.randomUUID');\n if (typeof any.OffscreenCanvas === 'undefined') missing.push('OffscreenCanvas');\n return missing;\n },\n deviceName: () => bridge.info?.computer_name || null,\n },\n createWorker: (source) => {\n const url = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));\n const worker = new Worker(url);\n const wrapper: WorkerLike = {\n postMessage: (msg, transfer) => worker.postMessage(msg, transfer ?? []),\n onmessage: null,\n terminate: () => {\n worker.terminate();\n URL.revokeObjectURL(url);\n },\n };\n worker.onmessage = (event) => wrapper.onmessage?.(event.data);\n return wrapper;\n },\n role,\n rtcChannelsSupported: () => role === 'follower' && typeof RTCPeerConnection === 'function',\n serverCallsInLeader: true,\n viewingRequiresFocus: true,\n files,\n leaderUnavailable: () =>\n bridge.info?.another_instance\n ? { code: 'invalid_state', details: { reason: 'another_instance' } }\n : { code: 'engine_unavailable', details: { reason: engineState === 'ready' ? 'starting' : engineState } },\n prepareForward: async (_method, args) => (await blobsToPaths(args, (blob, name) => files.writeBlobTemp(blob, name))) as unknown[],\n extendClient: (h) => {\n host = h;\n return opts.extend(h);\n },\n };\n return {\n platform,\n engineKv,\n windowKv,\n files,\n host: () => {\n if (!host) throw new Error('客户端还没有创建');\n return host;\n },\n setEngineState: (state) => {\n engineState = state;\n },\n };\n}\n\n/** 页面关闭对应 onPageHide;没有冻结和往返缓存(《4.实现与测试》第 2 节)。 */\nfunction pageLifecycle(): LifecycleLike {\n const win = typeof window !== 'undefined' ? window : undefined;\n return {\n onPageHide: (listener) => {\n if (!win) return () => {};\n const handler = () => listener(false);\n win.addEventListener('pagehide', handler);\n return () => win.removeEventListener('pagehide', handler);\n },\n onPageShow: () => () => {},\n onFreeze: () => () => {},\n onResume: () => () => {},\n };\n}\n\nfunction cryptoRandom(): RandomLike {\n const c = globalThis.crypto;\n return {\n uuid: () => c.randomUUID(),\n bytes: (n) => {\n const out = new Uint8Array(n);\n c.getRandomValues(out);\n return out;\n },\n float: () => Math.random(),\n };\n}\n\nfunction wrapWebSocket(ws: WebSocket): WebSocketLike {\n const wrapper: WebSocketLike = {\n get readyState() {\n return ws.readyState as 0 | 1 | 2 | 3;\n },\n send: (data) => ws.send(data),\n close: (code, reason) => ws.close(code, reason),\n onopen: null,\n onmessage: null,\n onclose: null,\n onerror: null,\n };\n ws.onopen = () => wrapper.onopen?.();\n ws.onmessage = (event) => {\n if (typeof event.data === 'string') wrapper.onmessage?.(event.data);\n };\n ws.onclose = (event) => wrapper.onclose?.(event.code, event.reason);\n ws.onerror = () => wrapper.onerror?.();\n return wrapper;\n}\n\nexport { osFromUserAgent };\n","declare const __TAURI_SDK_VERSION__: string;\n\n/** 本包的版本,必须与 Rust 插件 tauri-plugin-deeprespond-im 相同(《2.功能概述文档》第 13 节)。 */\nexport const TAURI_SDK_VERSION: string = typeof __TAURI_SDK_VERSION__ === 'string' ? __TAURI_SDK_VERSION__ : '1.0.0-alpha';\n\n/** 与插件之间的协议版本(插件的 PROTOCOL_VERSION)。 */\nexport const PROTOCOL_VERSION = 1;\n","import { Channel, invoke, isTauri } from '@tauri-apps/api/core';\nimport { DRError } from '@deeprespond/im-web';\nimport { PROTOCOL_VERSION, TAURI_SDK_VERSION } from '../version';\n\nexport const ENGINE_LABEL = 'deeprespond-im-engine';\nconst PLUGIN = 'plugin:deeprespond-im|';\n\n/** hello 的结果:本页面在插件中的身份、系统信息和引擎状态。 */\nexport interface HelloInfo {\n instance: number;\n label: string;\n engine: boolean;\n plugin_version: string;\n protocol: number;\n os: 'windows' | 'macos' | 'linux';\n os_version: string;\n arch: string;\n computer_name: string;\n webview_version: string;\n device_id: string;\n data_dir: string;\n temp_dir: string;\n another_instance: boolean;\n engine_state: EngineState;\n app_keys: string[];\n launch_click: Record<string, unknown> | null;\n main_window: string;\n log_file?: boolean;\n window: { visible: boolean; focused: boolean; minimized: boolean; screen_locked: boolean } | null;\n}\n\nexport type EngineState = 'starting' | 'ready' | 'restarting' | 'failed';\n\n/** 插件经 Channel 交来的事件(《4.实现与测试》第 4 节)。 */\nexport interface PluginEvent {\n t: string;\n [key: string]: unknown;\n}\n\ntype Listener = (event: PluginEvent) => void;\n\n/** 调用插件的方式(测试中换成假的插件)。 */\nexport interface Transport {\n invoke<T>(cmd: string, args?: unknown, options?: { headers: Record<string, string> }): Promise<T>;\n /** 建立事件通道:返回交给 hello 的参数值。 */\n channel(onEvent: (event: PluginEvent) => void): unknown;\n}\n\nconst tauriTransport: Transport = {\n invoke: (cmd, args, options) => invoke(cmd, args as Record<string, unknown>, options),\n channel: (onEvent) => {\n const channel = new Channel<PluginEvent>();\n channel.onmessage = onEvent;\n return channel;\n },\n};\n\ninterface TauriInternals {\n metadata?: { currentWebview?: { label?: string }; currentWindow?: { label?: string } };\n}\n\n/** 本页面的 WebView 标签;不在 Tauri 中时为 null。 */\nexport function currentLabel(): string | null {\n if (!isTauri()) return null;\n const internals = (globalThis as { __TAURI_INTERNALS__?: TauriInternals }).__TAURI_INTERNALS__;\n return internals?.metadata?.currentWebview?.label ?? internals?.metadata?.currentWindow?.label ?? null;\n}\n\n/** 插件命令的错误 → DRError(《3.接口设计》第 7 节);没有授予插件权限的窗口得到 capability_missing。 */\nexport function toError(err: unknown, command: string): DRError {\n if (err instanceof DRError) return err;\n if (err && typeof err === 'object' && typeof (err as { code?: unknown }).code === 'string') {\n const e = err as { code: string; reason?: string; message?: string };\n const details: Record<string, unknown> = {};\n if (e.reason) details.reason = e.reason;\n return new DRError({ code: e.code, message: e.message ?? e.code, details, source: 'local' });\n }\n const text = typeof err === 'string' ? err : err instanceof Error ? err.message : String(err);\n if (/not allowed|denied|ACL|capabilit/i.test(text)) {\n return new DRError({ code: 'permission_denied', message: text, details: { reason: 'capability_missing', command }, source: 'local' });\n }\n return new DRError({ code: 'invalid_state', message: text, details: { reason: 'plugin', command }, source: 'local' });\n}\n\n/**\n * 与插件的连接(每个页面一个):第一个命令 hello 交来 Channel,插件之后的事件都经它按顺序到达。\n * 版本检查:JavaScript 包与插件的版本、协议不同的以 unsupported(version_mismatch)拒绝(《2.功能概述文档》第 13 节)。\n */\nexport class Bridge {\n static #instance: Bridge | null = null;\n\n static get(): Bridge {\n if (!Bridge.#instance) Bridge.#instance = new Bridge(currentLabel() ?? '');\n return Bridge.#instance;\n }\n\n /** 测试用:指定本页面的连接(假的插件)。 */\n static use(bridge: Bridge | null): void {\n Bridge.#instance = bridge;\n }\n\n readonly label: string;\n readonly isEngine: boolean;\n readonly ready: Promise<HelloInfo>;\n #info: HelloInfo | null = null;\n #listeners = new Map<string, Set<Listener>>();\n\n readonly #transport: Transport;\n\n constructor(label: string, transport: Transport = tauriTransport) {\n this.label = label;\n this.isEngine = label === ENGINE_LABEL;\n this.#transport = transport;\n const channel = transport.channel((event) => this.#dispatch(event));\n this.ready = (async () => {\n let info: HelloInfo;\n try {\n info = await transport.invoke<HelloInfo>(`${PLUGIN}hello`, { js_version: TAURI_SDK_VERSION, protocol: PROTOCOL_VERSION, channel });\n } catch (err) {\n throw toError(err, 'hello');\n }\n if (info.plugin_version !== TAURI_SDK_VERSION || info.protocol !== PROTOCOL_VERSION) {\n throw new DRError({\n code: 'unsupported',\n message: `@deeprespond/im-tauri ${TAURI_SDK_VERSION} 与 tauri-plugin-deeprespond-im ${info.plugin_version} 的版本不同`,\n details: { reason: 'version_mismatch', js_version: TAURI_SDK_VERSION, plugin_version: info.plugin_version },\n source: 'local',\n });\n }\n this.#info = info;\n return info;\n })();\n this.ready.catch(() => {});\n }\n\n /** hello 之后的信息;之前为 null。 */\n get info(): HelloInfo | null {\n return this.#info;\n }\n\n /** 调用插件命令(等 hello 完成)。 */\n async call<T>(command: string, args?: Record<string, unknown>): Promise<T> {\n await this.ready;\n try {\n return await this.#transport.invoke<T>(`${PLUGIN}${command}`, args);\n } catch (err) {\n throw toError(err, command);\n }\n }\n\n /** 原始字节的请求体(Blob 落盘),参数放在请求头中。 */\n async callRaw<T>(command: string, body: Uint8Array, headers: Record<string, string>): Promise<T> {\n await this.ready;\n try {\n return await this.#transport.invoke<T>(`${PLUGIN}${command}`, body, { headers });\n } catch (err) {\n throw toError(err, command);\n }\n }\n\n on(type: string, listener: Listener): () => void {\n let set = this.#listeners.get(type);\n if (!set) {\n set = new Set();\n this.#listeners.set(type, set);\n }\n set.add(listener);\n return () => set?.delete(listener);\n }\n\n #dispatch(event: PluginEvent): void {\n if (!event || typeof event.t !== 'string') return;\n for (const listener of [...(this.#listeners.get(event.t) ?? [])]) {\n try {\n listener(event);\n } catch (err) {\n console.warn(`[im] 处理插件事件出错:${event.t}`, err);\n }\n }\n for (const listener of [...(this.#listeners.get('*') ?? [])]) listener(event);\n }\n}\n","import { DRError, type LogEntry, type LogLevel } from '@deeprespond/im-web';\nimport type { Bridge, PluginEvent } from './adapter/ipc';\nimport type { NotificationClickEvent } from './types';\n\ntype LoggerOption = { level?: LogLevel; sink?: (entry: LogEntry) => void } | undefined;\n\n/**\n * 日志:交给 App 的 sink(没有时打印到控制台),开启日志文件时同时写入插件的日志文件(每秒一批,《2.功能概述文档》第 12 节)。\n */\nexport function makeLogger(bridge: Bridge, option: LoggerOption): { level?: LogLevel; sink: (entry: LogEntry) => void } {\n const pending: LogEntry[] = [];\n let timer: ReturnType<typeof setTimeout> | null = null;\n const flush = () => {\n timer = null;\n const entries = pending.splice(0);\n if (entries.length > 0) void bridge.call('log_write', { entries }).catch(() => {});\n };\n return {\n level: option?.level,\n sink: (entry) => {\n if (option?.sink) {\n try {\n option.sink(entry);\n } catch {\n // App 的日志函数出错不影响 SDK\n }\n } else if (entry.level === 'error' || entry.level === 'warn') {\n const print = entry.level === 'error' ? console.error : console.warn;\n print(`[im] ${entry.module}: ${entry.message}`, entry.code ?? '', entry.reason ?? '');\n }\n if (!bridge.info?.log_file) return;\n pending.push(entry);\n if (pending.length > 500) pending.splice(0, pending.length - 500);\n if (timer === null) timer = setTimeout(flush, 1000);\n },\n };\n}\n\n/** 插件的通知点击事件 → desktop.notificationClicked 的载荷(带 claim)。 */\nexport function clickEvent(bridge: Bridge, event: PluginEvent): NotificationClickEvent {\n const clickId = String(event.click_id ?? '');\n let claimed = false;\n const out: NotificationClickEvent = {\n id: String(event.id ?? ''),\n kind: (event.kind as NotificationClickEvent['kind']) ?? 'custom',\n launched: event.launched === true,\n claim: () => {\n if (claimed || !clickId) return;\n claimed = true;\n void bridge.call('notify_claim', { click_id: clickId }).catch(() => {});\n },\n };\n if (typeof event.conversation_id === 'string') out.conversation_id = event.conversation_id;\n if (typeof event.seq === 'number') out.seq = event.seq;\n if (typeof event.action === 'string') out.action = event.action;\n if (event.data && typeof event.data === 'object') out.data = event.data as Record<string, string>;\n return Object.freeze(out);\n}\n\nexport function unsupported(reason: string, message: string): DRError {\n return new DRError({ code: 'unsupported', message, details: { reason }, source: 'local' });\n}\n\nexport function invalidState(reason: string): DRError {\n return new DRError({ code: 'invalid_state', message: reason, details: { reason }, source: 'local' });\n}\n","import { DRError, type DRClient, type MessageView } from '@deeprespond/im-web';\nimport { fileUrl, newTask, osFromUserAgent } from '../adapter/files';\nimport type { Bridge } from '../adapter/ipc';\nimport { TAURI_SDK_VERSION } from '../version';\nimport type { DesktopInfo, DesktopModule, DesktopNotification, DownloadParams, DownloadTask } from '../types';\n\n/** 插件中通知的参数(SDK 自动显示的通知另外带 kind)。 */\nexport interface PluginNotification extends DesktopNotification {\n id: string;\n kind: 'message' | 'notice' | 'call' | 'session' | 'custom';\n group?: string;\n}\n\nfunction validation(reason: string, field: string): DRError {\n return new DRError({ code: 'local_validation', message: reason, details: { reason, field }, source: 'local' });\n}\n\n/**\n * 桌面模块(《3.接口设计》第 5 节):通知、角标、文件对话框、预览地址、下载与打开、诊断包。\n * 界面窗口和引擎调用都需要相应的插件权限(《2.功能概述文档》第 11 节)。\n */\nexport class Desktop implements DesktopModule {\n #client: () => DRClient;\n #seq = 0;\n\n constructor(\n private readonly bridge: Bridge,\n client: () => DRClient,\n ) {\n this.#client = client;\n Object.preventExtensions(this);\n }\n\n async notify(n: DesktopNotification): Promise<void> {\n if (!n || typeof n.title !== 'string' || typeof n.body !== 'string') throw validation('required', 'title');\n if (n.id !== undefined && (typeof n.id !== 'string' || n.id.startsWith('dr:'))) throw validation('reserved_id', 'id');\n if (n.data !== undefined) {\n if (typeof n.data !== 'object' || Object.values(n.data).some((v) => typeof v !== 'string')) throw validation('invalid_type', 'data');\n if (new TextEncoder().encode(JSON.stringify(n.data)).length > 1024) throw validation('too_large', 'data');\n }\n if (n.actions && (n.actions.length > 2 || n.actions.some((a) => typeof a?.id !== 'string' || typeof a.title !== 'string'))) throw validation('invalid_value', 'actions');\n await this.show({ ...n, id: n.id ?? `app:${Date.now().toString(36)}:${++this.#seq}`, kind: 'custom' });\n }\n\n /** SDK 自己显示的通知(id 以 dr: 开头)。 */\n async show(n: PluginNotification): Promise<void> {\n await this.bridge.call('notify_show', {\n id: n.id,\n title: n.title,\n body: n.body,\n kind: n.kind,\n conversation_id: n.conversation_id ?? null,\n seq: n.seq ?? null,\n data: n.data ?? null,\n sound: n.sound !== false,\n actions: n.actions ?? null,\n group: n.group ?? n.conversation_id ?? null,\n });\n }\n\n async clearNotifications(p: { conversation_id?: string } = {}): Promise<void> {\n await this.bridge.call('notify_clear', p.conversation_id ? { conversation_id: p.conversation_id } : { all: true });\n }\n\n /** 清除一条(来电被处理后)。 */\n async clear(id: string): Promise<void> {\n await this.bridge.call('notify_clear', { id });\n }\n\n notificationPermission(): Promise<'granted' | 'denied' | 'default'> {\n return this.bridge.call('notify_permission');\n }\n\n requestNotificationPermission(): Promise<'granted' | 'denied'> {\n return this.bridge.call('notify_request_permission');\n }\n\n async setBadge(count: number | null): Promise<void> {\n if (count !== null && (!Number.isInteger(count) || count < 0)) throw validation('invalid_value', 'count');\n await this.bridge.call('badge_set', { count });\n }\n\n async requestAttention(p: { critical?: boolean } = {}): Promise<void> {\n await this.bridge.call('attention_request', { critical: p.critical === true, label: this.bridge.isEngine ? null : this.bridge.label });\n }\n\n async trayBlink(p: { trayId: string; icons: [string, string]; intervalMs?: number } | null): Promise<void> {\n if (p === null) {\n await this.bridge.call('tray_blink', { blink: null });\n return;\n }\n if (typeof p.trayId !== 'string' || !Array.isArray(p.icons) || p.icons.length !== 2) throw validation('invalid_value', 'icons');\n await this.bridge.call('tray_blink', { blink: { tray_id: p.trayId, icons: p.icons, interval_ms: p.intervalMs ?? 500 } });\n }\n\n pickFiles(p: { multiple?: boolean; filters?: Array<{ name: string; extensions: string[] }> } = {}): Promise<string[]> {\n return this.bridge.call('files_pick', { multiple: p.multiple === true, filters: p.filters ?? null });\n }\n\n pickSavePath(p: { defaultName?: string } = {}): Promise<string | null> {\n return this.bridge.call('files_pick_save', { default_name: p.defaultName ?? null });\n }\n\n fileUrl(path: string): string {\n if (typeof path !== 'string' || path === '') throw validation('required', 'path');\n return fileUrl(path, this.info.os);\n }\n\n /**\n * 由 Rust 下载到磁盘(《2.功能概述文档》第 9.4 节):文件地址先换取下载地址(界面窗口中经引擎);\n * 地址过期(403)时重新换取后续传。\n */\n download(source: string | { message: MessageView }, p: DownloadParams = {}): DownloadTask {\n const task = newTask('down');\n const controller = new AbortController();\n if (p.signal) {\n if (p.signal.aborted) controller.abort();\n else p.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n const run = async (): Promise<{ path: string; size: number }> => {\n let url: string;\n let name: string | undefined;\n if (typeof source === 'string') {\n url = source;\n } else {\n const body = (source?.message?.body ?? {}) as { url?: unknown; name?: unknown };\n if (typeof body.url !== 'string' || body.url === '') throw validation('required', 'message.body.url');\n url = body.url;\n if (typeof body.name === 'string') name = body.name;\n }\n const client = this.#client();\n const isFile = client.files.isFileUrl(url);\n const resolve = async () => (isFile ? (await client.files.resolveUrl(url)).download_url : url);\n const off = this.bridge.on('download_progress', (event) => {\n if (event.task === task && typeof event.loaded === 'number') p.onProgress?.(event.loaded, typeof event.total === 'number' ? event.total : null);\n });\n const onAbort = () => void this.bridge.call('files_cancel', { task }).catch(() => {});\n controller.signal.addEventListener('abort', onAbort, { once: true });\n try {\n let target = await resolve();\n for (let attempt = 0; ; attempt++) {\n if (controller.signal.aborted) throw new DRError({ code: 'aborted', message: 'aborted', source: 'local' });\n try {\n return await this.bridge.call<{ path: string; size: number }>('files_download', { task, url: target, dest: p.saveTo ?? null, conflict: p.conflict ?? 'rename', name: name ?? null });\n } catch (err) {\n // 签名地址过期:重新换取后从已下载的部分继续\n if (err instanceof DRError && err.code === 'url_expired' && isFile && attempt < 2) {\n target = await resolve();\n continue;\n }\n throw err;\n }\n }\n } finally {\n off();\n controller.signal.removeEventListener('abort', onAbort);\n }\n };\n const promise = run() as DownloadTask;\n promise.cancel = () => controller.abort();\n return promise;\n }\n\n async openPath(path: string): Promise<void> {\n await this.bridge.call('files_open', { path });\n }\n\n async revealPath(path: string): Promise<void> {\n await this.bridge.call('files_reveal', { path });\n }\n\n async exportDiagnostics(p: { saveTo?: string } = {}): Promise<string> {\n const client = this.#client();\n let diagnostics: unknown = null;\n try {\n diagnostics = client.connection.getDiagnostics();\n } catch {\n // 客户端已关闭\n }\n return this.bridge.call('diagnostics_export', { save_to: p.saveTo ?? null, info: { label: this.bridge.label, sdk_version: TAURI_SDK_VERSION, desktop: this.info, diagnostics } });\n }\n\n get info(): DesktopInfo {\n const info = this.bridge.info;\n let calls = false;\n try {\n calls = this.#client().calls.supported;\n } catch {\n calls = false;\n }\n return Object.freeze({\n os: info?.os ?? osFromUserAgent(typeof navigator !== 'undefined' ? navigator.userAgent : ''),\n os_version: info?.os_version ?? '',\n webview_version: info?.webview_version ?? '',\n sdk_version: TAURI_SDK_VERSION,\n calls_supported: calls,\n });\n }\n}\n"]}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as _deeprespond_im_web_platform from '@deeprespond/im-web/platform';
|
|
2
|
+
import { PlatformHost } from '@deeprespond/im-web/platform';
|
|
3
|
+
import { B as Bridge, D as DRTauriEngineOptions, a as DREngine } from './types-CVlFmFSn.js';
|
|
4
|
+
export { b as DRTauriEngineClient, c as DesktopEvents, d as DesktopModule, E as EngineAlert } from './types-CVlFmFSn.js';
|
|
5
|
+
import '@deeprespond/im-web';
|
|
6
|
+
|
|
7
|
+
/** 测试用:指定页面的插件连接(不对 App 公开)。 */
|
|
8
|
+
interface PageEnv {
|
|
9
|
+
bridge: Bridge;
|
|
10
|
+
/** 替换平台的部分成员(测试中的假服务端)。 */
|
|
11
|
+
overrides?: Partial<_deeprespond_im_web_platform.PlatformAdapter>;
|
|
12
|
+
/** 取得核心接口(测试中模拟事件)。 */
|
|
13
|
+
onHost?: (host: PlatformHost) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 创建引擎客户端(引擎页中调用,《3.接口设计》第 3 节):Web SDK 的核心作为固定的“主标签页”,持有长连接和令牌、写本地存储、
|
|
17
|
+
* 处理界面窗口转来的调用;没有界面窗口时负责提醒和来电。
|
|
18
|
+
*/
|
|
19
|
+
declare function createDRTauriEngine(options: DRTauriEngineOptions, env?: PageEnv): DREngine;
|
|
20
|
+
|
|
21
|
+
export { DREngine, DRTauriEngineOptions, type PageEnv, createDRTauriEngine };
|