{"_id":"@doufuge/vuplex-renderer","_rev":"3-d27eeaec5dfc5b72a530ecd376923da6","name":"@doufuge/vuplex-renderer","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.1":{"name":"@doufuge/vuplex-renderer","version":"0.1.1","_id":"@doufuge/vuplex-renderer@0.1.1","maintainers":[{"name":"doufuge","email":"matengfei.ko@gmail.com"}],"dist":{"shasum":"2d3814ae01cdd8d1928d03e89a29c89aa7d1c12f","tarball":"https://registry.npmjs.org/@doufuge/vuplex-renderer/-/vuplex-renderer-0.1.1.tgz","fileCount":2,"integrity":"sha512-R+Oi6UOzf4D1KDrv1hz2F0nMW+OkIfWnyf0MxD4aMfV6kPd9957rJ1S89D2SiuiG4ylP9/xJC8Vsu89igO326A==","signatures":[{"sig":"MEUCIQDuS+5yR/rs1kePAtK3VELatGSevmc/2OlX7bI58tz6lAIgZ4Z6dr7gGMqmbbBRFPzI37YCmafUOMo1CdrQhLR4jU0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5486},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./global":{"types":"./dist/global.d.ts"}},"gitHead":"806acef689c739f5c191274ab978b1ca4cb41dff","scripts":{"dev":"tsc -p tsconfig.json --watch","build":"tsc -p tsconfig.json && cp src/global.d.ts dist/global.d.ts"},"_npmUser":{"name":"doufuge","email":"matengfei.ko@gmail.com"},"_npmVersion":"11.13.0","description":"Web ↔ Vuplex IPC communication layer for renderer (WebView) side","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"~6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vuplex-renderer_0.1.1_1781365548078_0.9631594179794336","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@doufuge/vuplex-renderer","version":"0.1.2","_id":"@doufuge/vuplex-renderer@0.1.2","maintainers":[{"name":"doufuge","email":"matengfei.ko@gmail.com"}],"dist":{"shasum":"d80675eab418061854ae42b0f5a3eeb16655bb97","tarball":"https://registry.npmjs.org/@doufuge/vuplex-renderer/-/vuplex-renderer-0.1.2.tgz","fileCount":11,"integrity":"sha512-nGd2FgB3gMtYD/6UeuCzOSUwhYAvciquw/S+tb2sU1jinJWVHwMQ8rbGsLWkUlF9O/ESHrnhsAAsmpOrtp6zUA==","signatures":[{"sig":"MEYCIQD5oHHVj5q3H8brfYSLBxu+UpqplnOWHMZwPj792SmebQIhAM8pIA1cXj3WoLF6DqgF2tY+pHIDwyQIBzs23W5RLdoL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24085},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./global":{"types":"./dist/global.d.ts"}},"gitHead":"806acef689c739f5c191274ab978b1ca4cb41dff","scripts":{"dev":"tsc -p tsconfig.json --watch","build":"tsc -p tsconfig.json && cp src/global.d.ts dist/global.d.ts"},"_npmUser":{"name":"doufuge","email":"matengfei.ko@gmail.com"},"_npmVersion":"11.13.0","description":"Web ↔ Vuplex IPC communication layer for renderer (WebView) side","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"~6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vuplex-renderer_0.1.2_1781366894146_0.9687519774496145","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@doufuge/vuplex-renderer","version":"0.1.3","description":"Web ↔ Vuplex IPC communication layer for renderer (WebView) side","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./global":{"types":"./dist/global.d.ts"}},"scripts":{"build":"tsc -p tsconfig.json && cp src/global.d.ts dist/global.d.ts","dev":"tsc -p tsconfig.json --watch"},"devDependencies":{"typescript":"~6.0.0"},"engines":{"node":"^20.19.0 || >=22.12.0"},"gitHead":"9255dbb464113087a53b3ebd75863111d505ef2f","_id":"@doufuge/vuplex-renderer@0.1.3","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-N1Lpus0ZJd7j9hIRTAnGd/+nOrQccZdr3i+X7be7EC+Ui3s3UM+f9ypqUrW6xbLehLQvpYy/QVzDSWQb1warRQ==","shasum":"7b32f981b259f20fa40230d3fe123a2207b9a72e","tarball":"https://registry.npmjs.org/@doufuge/vuplex-renderer/-/vuplex-renderer-0.1.3.tgz","fileCount":11,"unpackedSize":23972,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCFNhvGi9SdnmVs4gSGCkoQwaWwBqqABTUtYbfqrr780QIgZBIQURh5B3wYP2NgkW7ZZsZNmcU2qPuYyDyR4ONzErA="}]},"_npmUser":{"name":"doufuge","email":"matengfei.ko@gmail.com"},"directories":{},"maintainers":[{"name":"doufuge","email":"matengfei.ko@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vuplex-renderer_0.1.3_1781367331984_0.5208172066725278"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-13T15:45:47.890Z","modified":"2026-06-13T16:15:32.226Z","0.1.1":"2026-06-13T15:45:48.197Z","0.1.2":"2026-06-13T16:08:14.290Z","0.1.3":"2026-06-13T16:15:32.121Z"},"description":"Web ↔ Vuplex IPC communication layer for renderer (WebView) side","maintainers":[{"name":"doufuge","email":"matengfei.ko@gmail.com"}],"readme":"# @doufuge/vuplex-renderer\n\nWeb ↔ Vuplex IPC 通信库，面向 WebView（Renderer）侧。\n\n基于 Vuplex 提供的 `window.vuplex.postMessage` 与 `message` 事件，封装 **request-response** 与 **event** 两种通信模式，并提供 TypeScript 类型支持。\n\n## 安装\n\n```bash\nyarn add @doufuge/vuplex-renderer\n# 或\nnpm install @doufuge/vuplex-renderer\n```\n\n## TypeScript 配置\n\n在项目的类型声明文件（如 `env.d.ts`）中引入 Vuplex 全局类型：\n\n```typescript\n/// <reference types=\"@doufuge/vuplex-renderer/global\" />\n```\n\n这将为 `window.vuplex` 提供完整的类型定义。\n\n## 快速开始\n\n```typescript\nimport { ipc } from '@doufuge/vuplex-renderer'\n\n// Web → Vuplex：请求-响应（默认 30s 超时）\nconst version = await ipc.invoke<string>('app:getVersion')\n\n// 自定义超时 5s\nconst config = await ipc.invoke('app:getConfig', undefined, 5_000)\n\n// Vuplex → Web：监听单向事件\nipc.on('scene:loaded', (data) => {\n  console.log('scene loaded', data)\n})\n\n// Vuplex → Web：注册请求处理器\nipc.handle('web:getState', () => ({ ready: true }))\n\n// Web → Vuplex：单向发送（不等待响应）\nipc.send('ui:ready')\n```\n\n## 通信模型\n\n```\n┌─────────────┐                      ┌─────────────┐\n│  Web (本库)  │                      │   Vuplex    │\n│  RendererIPC │                      │   (Unity)   │\n└──────┬──────┘                      └──────┬──────┘\n       │                                    │\n       │  invoke / send  ────────────────►  │  Web 主动\n       │  ◄────────────────  response/event │\n       │                                    │\n       │  ◄──────────────  request          │  Vuplex 主动\n       │  response  ────────────────────►  │  (handle 处理)\n       │                                    │\n       │  ◄──────────────  event            │  Vuplex 推送\n       │                                    │  (on / once 监听)\n```\n\n### 消息格式\n\n所有消息通过 JSON 字符串传输，结构如下：\n\n```typescript\ninterface IPCMessage<T = any> {\n  id?: string                              // request / response 配对标识\n  type: 'request' | 'response' | 'event'   // 消息类型\n  channel: string                          // 通信频道\n  data?: T                                 // 业务数据\n  success?: boolean                        // response 专用\n  error?: string                           // response 专用，失败时的错误信息\n}\n```\n\n| type | 方向 | 说明 |\n|------|------|------|\n| `request` | 双向 | 发起请求，需配对 `response` |\n| `response` | 双向 | 请求响应，`success: true` 时携带 `data`，否则携带 `error` |\n| `event` | 单向 | 事件推送，无需响应 |\n\n## API\n\n### 单例\n\n```typescript\nimport { ipc } from '@doufuge/vuplex-renderer'\n```\n\n默认导出全局单例，适用于大多数场景。\n\n### 类\n\n```typescript\nimport { RendererIPC } from '@doufuge/vuplex-renderer'\n\nconst customIpc = new RendererIPC()\n// 使用完毕后释放资源\ncustomIpc.destroy()\n```\n\n### 方法\n\n| 方法 | 说明 |\n|------|------|\n| `invoke<T>(channel, data?, timeout?)` | 向 Vuplex 发起请求并等待响应，默认超时 30s |\n| `send(channel, data?)` | 向 Vuplex 单向发送事件 |\n| `on(channel, listener)` | 监听 Vuplex 推送或本地 `emit` 的事件 |\n| `once(channel, listener)` | 监听一次，触发后自动移除 |\n| `off(channel, listener)` | 移除指定监听器 |\n| `removeAllListeners(channel)` | 移除 channel 下全部监听器 |\n| `handle(channel, handler)` | 注册 Web 侧请求处理器，供 Vuplex 调用 |\n| `emit(channel, data?)` | 本地触发事件，不经过 Vuplex |\n| `destroy()` | 移除消息监听并清理内部状态 |\n\n### 常量\n\n```typescript\nimport { DEFAULT_INVOKE_TIMEOUT } from '@doufuge/vuplex-renderer'\n\nconsole.log(DEFAULT_INVOKE_TIMEOUT) // 30000\n```\n\n### 类型\n\n```typescript\nimport type {\n  IPCMessage,\n  Listener,\n  RequestHandler,\n} from '@doufuge/vuplex-renderer'\n```\n\n## 错误处理\n\n`invoke` 在以下情况会 `reject`：\n\n- Vuplex 返回 `success: false`\n- 超过指定超时时间\n\n```typescript\ntry {\n  const result = await ipc.invoke('app:getVersion')\n} catch (err) {\n  // Error: IPC invoke timeout: channel=\"app:getVersion\" (30000ms)\n  // 或 Vuplex 返回的错误信息\n  console.error(err)\n}\n```\n","readmeFilename":"README.md"}