{"_id":"@composy/sse-vue","name":"@composy/sse-vue","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"@composy/sse-vue","version":"0.0.1","description":"Vue 3 composables for @composy/sse-core","keywords":["sse","server-sent-events","vue","vue3","ldesign"],"author":{"name":"LDesign Team"},"license":"MIT","type":"module","sideEffects":false,"exports":{".":{"types":"./es/index.d.ts","import":"./es/index.js","require":"./lib/index.cjs","default":"./es/index.js"},"./composables":{"types":"./es/composables/index.d.ts","import":"./es/composables/index.js","require":"./lib/composables/index.cjs","default":"./es/composables/index.js"},"./composables/*":{"types":"./es/composables/*.d.ts","import":"./es/composables/*.js","require":"./lib/composables/*.cjs","default":"./es/composables/*.js"},"./context":{"types":"./es/context/index.d.ts","import":"./es/context/index.js","require":"./lib/context/index.cjs","default":"./es/context/index.js"},"./context/*":{"types":"./es/context/*.d.ts","import":"./es/context/*.js","require":"./lib/context/*.cjs","default":"./es/context/*.js"},"./plugin":{"types":"./es/plugin/index.d.ts","import":"./es/plugin/index.js","require":"./lib/plugin/index.cjs","default":"./es/plugin/index.js"},"./plugin/*":{"types":"./es/plugin/*.d.ts","import":"./es/plugin/*.js","require":"./lib/plugin/*.cjs","default":"./es/plugin/*.js"},"./plugins":{"types":"./es/plugins/index.d.ts","import":"./es/plugins/index.js","require":"./lib/plugins/index.cjs","default":"./es/plugins/index.js"},"./plugins/*":{"types":"./es/plugins/*.d.ts","import":"./es/plugins/*.js","require":"./lib/plugins/*.cjs","default":"./es/plugins/*.js"},"./package.json":"./package.json"},"main":"./lib/index.cjs","module":"./es/index.js","types":"./es/index.d.ts","unpkg":"./dist/index.min.js","jsdelivr":"./dist/index.min.js","scripts":{"build":"ldesign-builder build","clean":"rimraf es esm lib dist","dev":"ldesign-builder build --watch","lint":"eslint \"eslint.config.js\" \"src/**/*.ts\" --cache","lint:check":"eslint \"eslint.config.js\" \"src/**/*.ts\" --cache --max-warnings 0","lint:fix":"eslint \"eslint.config.js\" \"src/**/*.ts\" --cache --fix","type-check":"tsc --noEmit -p tsconfig.typecheck.json","test":"ltesting run:unit","test:run":"ltesting run:unit","test:watch":"ltesting run:unit --watch","test:coverage":"ltesting run:unit --coverage","test:changed":"ltesting run:unit --changed","test:failed":"ltesting run:unit --failed","test:ui":"ltesting dashboard"},"dependencies":{"@composy/sse-core":"^0.0.1"},"peerDependencies":{"@composy/sse-core":"^0.0.1","vue":"^3.5.32"},"devDependencies":{"@antfu/eslint-config":"9.1.0","@composy/builder":"^0.0.1","@composy/testing":"^0.0.1","eslint":"10.7.0","rimraf":"^6.1.3","typescript":"5.9.3","vue":"3.5.39"},"typings":"./es/index.d.ts","browser":"./dist/index.js","_id":"@composy/sse-vue@0.0.1","_nodeVersion":"23.11.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-akMcxUU+J0+VjqRHHpEs3mJoad7NYp12sPh/BwZ6Jyzf3JRA8yeyWzcYjMTHcUTfBORigTS65ot/gmf7pGZTrw==","shasum":"c98475413871b6925812e1382120ba5e43da48fa","tarball":"https://registry.npmjs.org/@composy/sse-vue/-/sse-vue-0.0.1.tgz","fileCount":171,"unpackedSize":316341,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDtxqefJNjZs0c5uFMDjKub8BKSMmNv5pjjAfnpoxUuDAiAVJS3icPPm27Yf6KWzwumejmyReEq+szaADVOBaHK9Rw=="}]},"_npmUser":{"name":"swimly","email":"979741120@qq.com"},"directories":{},"maintainers":[{"name":"swimly","email":"979741120@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sse-vue_0.0.1_1786948910434_0.37391337610642994"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-17T06:41:49.751Z","0.0.1":"2026-08-17T06:41:50.631Z","modified":"2026-08-17T06:41:51.129Z"},"maintainers":[{"name":"swimly","email":"979741120@qq.com"}],"description":"Vue 3 composables for @composy/sse-core","keywords":["sse","server-sent-events","vue","vue3","ldesign"],"author":{"name":"LDesign Team"},"license":"MIT","readme":"# @composy/sse-vue\n\n`@composy/sse-vue` 是 `@composy/sse-core` 的 Vue\n3 适配层。它不实现 SSE 协议细节，只负责 Vue 生命周期、响应式状态、App 注入和 Vue Engine 运行时绑定。\n\n## 模块职责\n\n```text\nsrc/\n  composables/\n    useSSE.ts          # 单连接响应式封装\n    useSSEManager.ts   # 多连接管理器响应式封装\n  context/\n    injection-keys.ts  # SSEManager 注入 key\n  plugin/\n    create-sse-runtime.ts\n    install-sse-app.ts\n    native-plugin.ts\n    types.ts\n  plugins/\n    engine-plugin.ts   # Vue Engine 薄适配，复用 core engine plugin\n```\n\n## useSSE\n\n`useSSE(url, options)` 会创建一个 `SSEClient`，并把最新事件、数据、错误和状态暴露为 Vue ref。\n\n```ts\nimport { useSSE } from '@composy/sse-vue'\n\nconst { data, event, status, errorContext, on, close, reconnect } = useSSE('/api/events', {\n  heartbeatTimeout: 30000,\n  reconnect: true,\n})\n\non('notice', nextEvent => {\n  console.log(nextEvent.data)\n})\n```\n\n行为说明：\n\n- `url` 可以是 ref、getter 或普通字符串。\n- URL 变化时会重建底层 `SSEClient`。\n- 用户通过 `on()` 注册的处理器会在重建后重新绑定，并在 `off()` 或组件卸载时解除。\n- `autoConnect` 默认为 `true`，需要手动连接时可设置为 `false`。\n\n## useSSEManager\n\n`useSSEManager()` 默认优先注入 Vue plugin 已安装的全局\n`SSEManager`。没有全局 manager 时会创建本地 manager，并在组件卸载时按配置清理。\n\n```ts\nimport { useSSEManager } from '@composy/sse-vue'\n\nconst { connect, connectionDetails, statusSummary, disconnectAll } = useSSEManager()\n\nconnect('notifications', '/api/notifications')\n```\n\n## Vue Plugin\n\n```ts\nimport { createApp } from 'vue'\nimport { createSSEPlugin } from '@composy/sse-vue'\n\nconst app = createApp(App)\n\napp.use(\n  createSSEPlugin({\n    defaults: {\n      reconnect: true,\n    },\n  })\n)\n```\n\n安装后会：\n\n- `provide(SSE_MANAGER_KEY, manager)`。\n- 默认提供 `'sseManager'` 和 `'sse'` 两个字符串别名。\n- 默认挂载 `app.config.globalProperties.$sse`。\n- App 卸载时清理由插件创建的 manager。\n\n## Vue Engine Plugin\n\n```ts\nimport { createSSEEnginePlugin } from '@composy/sse-vue'\n\nengine.use(createSSEEnginePlugin())\n```\n\nVue Engine 插件只做两件事：\n\n- 复用或安装 Vue App 上的 `SSERuntime`。\n- 把 runtime 中的 `SSEManager` 交给 `@composy/sse-core` 的 `createSSEEnginePlugin()`\n  处理 state、events 和 api。\n\n这样可以保证 Vue 适配层不复制 core 的 Engine 同步逻辑。\n\n## 维护约束\n\n- 新增协议能力、重连策略、错误类型、快照字段时，优先修改 `@composy/sse-core`。\n- Vue 包只能新增生命周期、响应式包装、注入或 App 安装相关逻辑。\n- Vue type-check 使用 sibling source alias 指向\n  `../core/src`，确保未构建状态下也能检查 core-first 边界。\n","readmeFilename":"README.md","_rev":"1-2d94e03054573a1a70d328e6c33f44ff"}