sx-peerjs-http-util 1.0.2 → 1.0.3
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +5 -3
- package/dist/index.esm.js.map +2 -2
- package/dist/index.umd.js +5 -3
- package/dist/index.umd.js.map +2 -2
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAUhE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AASD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAqB;IAEzC;;OAEG;IACH,OAAO,CAAC,WAAW,CAA6B;IAEhD;;OAEG;IACH,OAAO,CAAC,eAAe,CAOnB;IAEJ;;OAEG;IACH,OAAO,CAAC,cAAc,CAAoC;IAE1D;;OAEG;IACH,OAAO,CAAC,cAAc,CAA8C;IAEpE;;OAEG;IACH,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAU;IAEzB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY;IAOrE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB;;;OAGG;IACH,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAuFpE;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAqDtC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAI3D;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAUhE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AASD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAqB;IAEzC;;OAEG;IACH,OAAO,CAAC,WAAW,CAA6B;IAEhD;;OAEG;IACH,OAAO,CAAC,eAAe,CAOnB;IAEJ;;OAEG;IACH,OAAO,CAAC,cAAc,CAAoC;IAE1D;;OAEG;IACH,OAAO,CAAC,cAAc,CAA8C;IAEpE;;OAEG;IACH,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAU;IAEzB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY;IAOrE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB;;;OAGG;IACH,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAuFpE;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAqDtC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAI3D;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;OAIG;YACW,aAAa;IAe3B;;OAEG;IACH,OAAO,IAAI,IAAI;CA0BhB;AAGD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/index.esm.js
CHANGED
|
@@ -260,7 +260,7 @@ var PeerJsWrapper = class {
|
|
|
260
260
|
const message = data;
|
|
261
261
|
if (message.type === "request" && message.request) {
|
|
262
262
|
try {
|
|
263
|
-
const response = await this.handleRequest(message.request);
|
|
263
|
+
const response = await this.handleRequest(conn.peer, message.request);
|
|
264
264
|
const responseMessage = {
|
|
265
265
|
type: "response",
|
|
266
266
|
id: message.id,
|
|
@@ -307,11 +307,13 @@ var PeerJsWrapper = class {
|
|
|
307
307
|
}
|
|
308
308
|
/**
|
|
309
309
|
* 内部请求处理方法
|
|
310
|
+
* @param from 发送者的 Peer ID
|
|
311
|
+
* @param request 请求数据
|
|
310
312
|
*/
|
|
311
|
-
async handleRequest(request) {
|
|
313
|
+
async handleRequest(from, request) {
|
|
312
314
|
const simpleHandler = this.simpleHandlers.get(request.path);
|
|
313
315
|
if (simpleHandler) {
|
|
314
|
-
const data = await simpleHandler(request.data);
|
|
316
|
+
const data = await simpleHandler(from, request.data);
|
|
315
317
|
return { status: 200, data };
|
|
316
318
|
}
|
|
317
319
|
return {
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { Peer, DataConnection } from 'peerjs';\nimport type { Request, Response, SimpleHandler } from './types';\n\n// \u5185\u90E8\u6D88\u606F\u683C\u5F0F\ninterface InternalMessage {\n type: 'request' | 'response';\n id: string;\n request?: Request;\n response?: Response;\n}\n\n/**\n * \u670D\u52A1\u5668\u914D\u7F6E\uFF08PeerJS \u4FE1\u4EE4\u670D\u52A1\u5668\uFF09\n */\nexport interface ServerConfig {\n host?: string;\n port?: number;\n path?: string;\n secure?: boolean;\n}\n\n/**\n * \u751F\u6210 UUID v4\n */\nfunction generateUUID(): string {\n return crypto.randomUUID();\n}\n\n/**\n * PeerJsWrapper - \u5C01\u88C5 PeerJS \u4E3A\u7C7B\u4F3C HTTP \u7684 API\n *\n * @example\n * ```js\n * const wrapper = new PeerJsWrapper();\n * const data = await wrapper.send(peerId, '/api/hello', { name: 'world' });\n * console.log(data); // \u76F4\u63A5\u8F93\u51FA\u54CD\u5E94\u6570\u636E\n *\n * // \u670D\u52A1\u7AEF\u6CE8\u518C\u5904\u7406\u5668\n * wrapper.registerHandler('/api/hello', (data) => {\n * return { message: 'hello' }; // \u76F4\u63A5\u8FD4\u56DE\u6570\u636E\n * });\n * ```\n */\nexport class PeerJsWrapper {\n /**\n * \u672C\u5730 Peer ID\uFF0C\u6784\u9020\u65F6\u786E\u5B9A\uFF08\u4F20\u5165\u6216\u81EA\u52A8\u751F\u6210\uFF09\n */\n private myPeerId: string;\n\n /**\n * PeerJS \u5B9E\u4F8B\n */\n private peerInstance: Peer | null = null;\n\n /**\n * \u5F53\u524D\u6D3B\u8DC3\u7684\u4F20\u5165\u8FDE\u63A5\u96C6\u5408\n */\n private connections = new Set<DataConnection>();\n\n /**\n * \u5F85\u5904\u7406\u7684\u8BF7\u6C42\u6620\u5C04\u8868\uFF08\u7528\u4E8E\u8BF7\u6C42-\u54CD\u5E94\u5339\u914D\uFF09\n */\n private pendingRequests = new Map<\n string,\n {\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n /**\n * \u8DEF\u5F84\u5904\u7406\u5668\u6620\u5C04\u8868\n */\n private simpleHandlers = new Map<string, SimpleHandler>();\n\n /**\n * \u91CD\u8FDE\u5B9A\u65F6\u5668\n */\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * \u662F\u5426\u5DF2\u9500\u6BC1\n */\n private isDestroyed = false;\n\n /**\n * \u662F\u5426\u5F00\u542F\u8C03\u8BD5\u6A21\u5F0F\n */\n private isDebug: boolean;\n\n /**\n * \u670D\u52A1\u5668\u914D\u7F6E\n */\n private serverConfig?: ServerConfig;\n\n /**\n * \u521B\u5EFA PeerJsWrapper \u5B9E\u4F8B\n * @param peerId \u53EF\u9009\u7684 Peer ID\uFF0C\u5982\u679C\u4E0D\u63D0\u4F9B\u5219\u81EA\u52A8\u751F\u6210 UUID\n * @param isDebug \u662F\u5426\u5F00\u542F\u8C03\u8BD5\u6A21\u5F0F\uFF0C\u5F00\u542F\u540E\u4F1A\u6253\u5370\u4E8B\u4EF6\u65E5\u5FD7\n * @param server \u53EF\u9009\u7684\u4FE1\u4EE4\u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u4E0D\u63D0\u4F9B\u5219\u4F7F\u7528 PeerJS \u516C\u5171\u670D\u52A1\u5668\n */\n constructor(peerId?: string, isDebug?: boolean, server?: ServerConfig) {\n this.myPeerId = peerId || generateUUID();\n this.isDebug = isDebug ?? false;\n this.serverConfig = server;\n this.connect();\n }\n\n /**\n * \u8C03\u8BD5\u65E5\u5FD7\u8F93\u51FA\n * @param obj \u5BF9\u8C61\u540D\n * @param event \u4E8B\u4EF6\u540D\n * @param data \u4E8B\u4EF6\u6570\u636E\n */\n private debugLog(obj: string, event: string, data?: unknown): void {\n if (this.isDebug) {\n const dataStr = data !== undefined ? (typeof data === 'object' ? JSON.stringify(data) : String(data)) : '';\n console.log(`${obj} ${event} ${dataStr}`);\n }\n }\n\n /**\n * \u8FDE\u63A5\u5230 PeerJS \u670D\u52A1\u5668\n */\n private connect(): void {\n if (this.isDestroyed) return;\n\n this.peerInstance = this.serverConfig\n ? new Peer(this.myPeerId, { ...this.serverConfig })\n : new Peer(this.myPeerId);\n\n this.setupPeerEventHandlers();\n }\n\n /**\n * \u8BBE\u7F6E Peer \u5B9E\u4F8B\u7684\u4E8B\u4EF6\u5904\u7406\u5668\n */\n private setupPeerEventHandlers(): void {\n if (!this.peerInstance) return;\n\n this.peerInstance.on('open', (id) => {\n this.debugLog('Peer', 'open', id);\n // \u6E05\u9664\u91CD\u8FDE\u5B9A\u65F6\u5668\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n });\n\n this.peerInstance.on('disconnected', () => {\n this.debugLog('Peer', 'disconnected');\n this.scheduleReconnect();\n });\n\n this.peerInstance.on('error', (err) => {\n this.debugLog('Peer', 'error', { type: err.type, message: err.message });\n // \u7F51\u7EDC\u76F8\u5173\u9519\u8BEF\u65F6\u5C1D\u8BD5\u91CD\u8FDE\n if (\n err.type === 'network' ||\n err.type === 'server-error' ||\n err.type === 'socket-error' ||\n err.type === 'socket-closed'\n ) {\n this.scheduleReconnect();\n }\n });\n\n this.peerInstance.on('close', () => {\n this.debugLog('Peer', 'close');\n });\n\n // \u8BBE\u7F6E\u4F20\u5165\u8FDE\u63A5\u5904\u7406\u5668\n this.setupIncomingConnectionHandler();\n }\n\n /**\n * \u5B89\u6392\u91CD\u8FDE\n */\n private scheduleReconnect(): void {\n if (this.isDestroyed) return;\n if (this.reconnectTimer) return; // \u5DF2\u6709\u91CD\u8FDE\u4EFB\u52A1\u5728\u7B49\u5F85\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.reconnect();\n }, 1000);\n }\n\n /**\n * \u6267\u884C\u91CD\u8FDE\n */\n private reconnect(): void {\n if (this.isDestroyed) return;\n\n this.debugLog('PeerJsWrapper', 'reconnect');\n\n // \u9500\u6BC1\u65E7\u5B9E\u4F8B\n if (this.peerInstance) {\n try {\n this.peerInstance.destroy();\n } catch {\n // \u5FFD\u7565\u9500\u6BC1\u65F6\u7684\u9519\u8BEF\n }\n this.peerInstance = null;\n }\n\n // \u91CD\u65B0\u8FDE\u63A5\n this.connect();\n }\n\n /**\n * \u83B7\u53D6\u5F53\u524D Peer ID\n * @returns string \u5F53\u524D Peer ID\n */\n getPeerId(): string {\n return this.myPeerId;\n }\n\n /**\n * \u7B49\u5F85 Peer \u8FDE\u63A5\u5C31\u7EEA\uFF08\u8FDE\u63A5\u5230\u4FE1\u4EE4\u670D\u52A1\u5668\uFF09\n * @returns Promise<void> \u5F53\u8FDE\u63A5\u6210\u529F\u65F6 resolve\n */\n whenReady(): Promise<void> {\n return this.waitForReady();\n }\n\n /**\n * \u7B49\u5F85 Peer \u8FDE\u63A5\u5C31\u7EEA\n */\n private waitForReady(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.peerInstance) {\n reject(new Error('Peer instance not initialized'));\n return;\n }\n\n if (this.peerInstance.open) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n this.peerInstance?.off('open', onOpen);\n this.peerInstance?.off('error', onError);\n resolve();\n };\n\n const onError = (err: Error) => {\n this.peerInstance?.off('open', onOpen);\n this.peerInstance?.off('error', onError);\n reject(err);\n };\n\n this.peerInstance.on('open', onOpen);\n this.peerInstance.on('error', onError);\n });\n }\n\n /**\n * \u53D1\u9001\u8BF7\u6C42\u5230\u6307\u5B9A Peer\n * @param peerId \u5BF9\u7AEF\u8BBE\u5907 ID\n * @param path \u8BF7\u6C42\u8DEF\u5F84\n * @param data \u8BF7\u6C42\u6570\u636E\n * @returns Promise<unknown> \u8FD4\u56DE\u54CD\u5E94\u6570\u636E\uFF08\u81EA\u52A8\u62C6\u7BB1\uFF0C\u53EA\u8FD4\u56DE data \u90E8\u5206\uFF09\n */\n send(peerId: string, path: string, data?: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n this.debugLog('PeerJsWrapper', 'send', { peerId, path, data });\n\n // \u7B49\u5F85 peer \u5B9E\u4F8B\u51C6\u5907\u597D\n this.waitForReady()\n .then(() => {\n if (!this.peerInstance) {\n reject(new Error('Peer instance not available'));\n return;\n }\n\n // \u6BCF\u6B21\u53D1\u9001\u6D88\u606F\u65F6\uFF0C\u90FD\u8FDE\u63A5\u4E00\u4E2A\u65B0\u7684 conn\n const conn = this.peerInstance.connect(peerId, {\n reliable: true,\n });\n\n const timeout = setTimeout(() => {\n conn.close();\n this.pendingRequests.delete(requestId);\n reject(new Error(`Request timeout: ${peerId}${path}`));\n }, 30000);\n\n const requestId = `${this.myPeerId}-${Date.now()}-${Math.random()}`;\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n conn.on('open', () => {\n this.debugLog('Conn', 'open', peerId);\n const request: Request = { path, data };\n const message: InternalMessage = {\n type: 'request',\n id: requestId,\n request,\n };\n conn.send(message);\n });\n\n conn.on('data', (responseData: unknown) => {\n this.debugLog('Conn', 'data', { peer: peerId, data: responseData });\n const message = responseData as InternalMessage;\n if (message.type === 'response' && message.id === requestId) {\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n\n const response = message.response!;\n // \u6821\u9A8C\u72B6\u6001\u7801\uFF0C\u975E 2xx \u5219 reject\n if (response.status < 200 || response.status >= 300) {\n pending.reject(\n new Error(`Request failed: ${response.status} ${JSON.stringify(response.data)}`)\n );\n } else {\n // \u81EA\u52A8\u62C6\u7BB1\uFF1A\u53EA\u8FD4\u56DE data \u90E8\u5206\n pending.resolve(response.data);\n }\n }\n conn.close();\n }\n });\n\n conn.on('error', (err) => {\n this.debugLog('Conn', 'error', { peer: peerId, error: err });\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.reject(err as Error);\n }\n });\n\n conn.on('close', () => {\n this.debugLog('Conn', 'close', peerId);\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.reject(new Error('Connection closed'));\n }\n });\n })\n .catch((err) => {\n reject(err);\n });\n });\n }\n\n /**\n * \u8BBE\u7F6E\u4F20\u5165\u8FDE\u63A5\u5904\u7406\u5668\n */\n private setupIncomingConnectionHandler(): void {\n if (!this.peerInstance) return;\n\n this.peerInstance.on('connection', (conn: DataConnection) => {\n this.debugLog('Peer', 'connection', conn.peer);\n this.connections.add(conn);\n\n conn.on('open', () => {\n this.debugLog('Conn', 'open', conn.peer);\n });\n\n conn.on('data', async (data: unknown) => {\n this.debugLog('Conn', 'data', { peer: conn.peer, data });\n const message = data as InternalMessage;\n\n if (message.type === 'request' && message.request) {\n try {\n const response = await this.handleRequest(message.request);\n\n const responseMessage: InternalMessage = {\n type: 'response',\n id: message.id,\n response,\n };\n\n conn.send(responseMessage);\n } catch (error) {\n const errorResponse: InternalMessage = {\n type: 'response',\n id: message.id,\n response: {\n status: 500,\n data: { error: error instanceof Error ? error.message : 'Unknown error' },\n },\n };\n\n conn.send(errorResponse);\n }\n }\n });\n\n conn.on('close', () => {\n this.debugLog('Conn', 'close', conn.peer);\n this.connections.delete(conn);\n });\n\n conn.on('error', (err) => {\n this.debugLog('Conn', 'error', { peer: conn.peer, error: err });\n this.connections.delete(conn);\n });\n });\n }\n\n /**\n * \u6CE8\u518C\u7B80\u5316\u5904\u7406\u5668\uFF08\u76F4\u63A5\u8FD4\u56DE\u6570\u636E\uFF0C\u81EA\u52A8\u88C5\u7BB1\uFF09\n * @param path \u8BF7\u6C42\u8DEF\u5F84\n * @param handler \u5904\u7406\u5668\u51FD\u6570\uFF0C\u63A5\u6536\u8BF7\u6C42\u6570\u636E\uFF0C\u76F4\u63A5\u8FD4\u56DE\u54CD\u5E94\u6570\u636E\n */\n registerHandler(path: string, handler: SimpleHandler): void {\n this.simpleHandlers.set(path, handler);\n }\n\n /**\n * \u6CE8\u9500\u7B80\u5316\u5904\u7406\u5668\n * @param path \u8BF7\u6C42\u8DEF\u5F84\n */\n unregisterHandler(path: string): void {\n this.simpleHandlers.delete(path);\n }\n\n /**\n * \u5185\u90E8\u8BF7\u6C42\u5904\u7406\u65B9\u6CD5\n */\n private async handleRequest(request: Request): Promise<Response> {\n const simpleHandler = this.simpleHandlers.get(request.path);\n if (simpleHandler) {\n const data = await simpleHandler(request.data);\n // \u81EA\u52A8\u88C5\u7BB1\uFF1A\u5C06\u8FD4\u56DE\u7684\u6570\u636E\u5305\u88C5\u6210 Response\n return { status: 200, data };\n }\n\n // \u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u5904\u7406\u5668\n return {\n status: 404,\n data: { error: `Path not found: ${request.path}` },\n };\n }\n\n /**\n * \u5173\u95ED\u6240\u6709\u8FDE\u63A5\u5E76\u9500\u6BC1 Peer \u5B9E\u4F8B\n */\n destroy(): void {\n this.isDestroyed = true;\n\n // \u6E05\u9664\u91CD\u8FDE\u5B9A\u65F6\u5668\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n for (const conn of this.connections.values()) {\n conn.close();\n }\n this.connections.clear();\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Peer destroyed'));\n }\n this.pendingRequests.clear();\n this.simpleHandlers.clear();\n\n if (this.peerInstance) {\n this.peerInstance.destroy();\n this.peerInstance = null;\n }\n }\n}\n\n// \u5BFC\u51FA\u7C7B\u578B\nexport type { Request, Response, SimpleHandler };\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { Peer, DataConnection } from 'peerjs';\nimport type { Request, Response, SimpleHandler } from './types';\n\n// \u5185\u90E8\u6D88\u606F\u683C\u5F0F\ninterface InternalMessage {\n type: 'request' | 'response';\n id: string;\n request?: Request;\n response?: Response;\n}\n\n/**\n * \u670D\u52A1\u5668\u914D\u7F6E\uFF08PeerJS \u4FE1\u4EE4\u670D\u52A1\u5668\uFF09\n */\nexport interface ServerConfig {\n host?: string;\n port?: number;\n path?: string;\n secure?: boolean;\n}\n\n/**\n * \u751F\u6210 UUID v4\n */\nfunction generateUUID(): string {\n return crypto.randomUUID();\n}\n\n/**\n * PeerJsWrapper - \u5C01\u88C5 PeerJS \u4E3A\u7C7B\u4F3C HTTP \u7684 API\n *\n * @example\n * ```js\n * const wrapper = new PeerJsWrapper();\n * const data = await wrapper.send(peerId, '/api/hello', { name: 'world' });\n * console.log(data); // \u76F4\u63A5\u8F93\u51FA\u54CD\u5E94\u6570\u636E\n *\n * // \u670D\u52A1\u7AEF\u6CE8\u518C\u5904\u7406\u5668\n * wrapper.registerHandler('/api/hello', (data) => {\n * return { message: 'hello' }; // \u76F4\u63A5\u8FD4\u56DE\u6570\u636E\n * });\n * ```\n */\nexport class PeerJsWrapper {\n /**\n * \u672C\u5730 Peer ID\uFF0C\u6784\u9020\u65F6\u786E\u5B9A\uFF08\u4F20\u5165\u6216\u81EA\u52A8\u751F\u6210\uFF09\n */\n private myPeerId: string;\n\n /**\n * PeerJS \u5B9E\u4F8B\n */\n private peerInstance: Peer | null = null;\n\n /**\n * \u5F53\u524D\u6D3B\u8DC3\u7684\u4F20\u5165\u8FDE\u63A5\u96C6\u5408\n */\n private connections = new Set<DataConnection>();\n\n /**\n * \u5F85\u5904\u7406\u7684\u8BF7\u6C42\u6620\u5C04\u8868\uFF08\u7528\u4E8E\u8BF7\u6C42-\u54CD\u5E94\u5339\u914D\uFF09\n */\n private pendingRequests = new Map<\n string,\n {\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n /**\n * \u8DEF\u5F84\u5904\u7406\u5668\u6620\u5C04\u8868\n */\n private simpleHandlers = new Map<string, SimpleHandler>();\n\n /**\n * \u91CD\u8FDE\u5B9A\u65F6\u5668\n */\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * \u662F\u5426\u5DF2\u9500\u6BC1\n */\n private isDestroyed = false;\n\n /**\n * \u662F\u5426\u5F00\u542F\u8C03\u8BD5\u6A21\u5F0F\n */\n private isDebug: boolean;\n\n /**\n * \u670D\u52A1\u5668\u914D\u7F6E\n */\n private serverConfig?: ServerConfig;\n\n /**\n * \u521B\u5EFA PeerJsWrapper \u5B9E\u4F8B\n * @param peerId \u53EF\u9009\u7684 Peer ID\uFF0C\u5982\u679C\u4E0D\u63D0\u4F9B\u5219\u81EA\u52A8\u751F\u6210 UUID\n * @param isDebug \u662F\u5426\u5F00\u542F\u8C03\u8BD5\u6A21\u5F0F\uFF0C\u5F00\u542F\u540E\u4F1A\u6253\u5370\u4E8B\u4EF6\u65E5\u5FD7\n * @param server \u53EF\u9009\u7684\u4FE1\u4EE4\u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u4E0D\u63D0\u4F9B\u5219\u4F7F\u7528 PeerJS \u516C\u5171\u670D\u52A1\u5668\n */\n constructor(peerId?: string, isDebug?: boolean, server?: ServerConfig) {\n this.myPeerId = peerId || generateUUID();\n this.isDebug = isDebug ?? false;\n this.serverConfig = server;\n this.connect();\n }\n\n /**\n * \u8C03\u8BD5\u65E5\u5FD7\u8F93\u51FA\n * @param obj \u5BF9\u8C61\u540D\n * @param event \u4E8B\u4EF6\u540D\n * @param data \u4E8B\u4EF6\u6570\u636E\n */\n private debugLog(obj: string, event: string, data?: unknown): void {\n if (this.isDebug) {\n const dataStr = data !== undefined ? (typeof data === 'object' ? JSON.stringify(data) : String(data)) : '';\n console.log(`${obj} ${event} ${dataStr}`);\n }\n }\n\n /**\n * \u8FDE\u63A5\u5230 PeerJS \u670D\u52A1\u5668\n */\n private connect(): void {\n if (this.isDestroyed) return;\n\n this.peerInstance = this.serverConfig\n ? new Peer(this.myPeerId, { ...this.serverConfig })\n : new Peer(this.myPeerId);\n\n this.setupPeerEventHandlers();\n }\n\n /**\n * \u8BBE\u7F6E Peer \u5B9E\u4F8B\u7684\u4E8B\u4EF6\u5904\u7406\u5668\n */\n private setupPeerEventHandlers(): void {\n if (!this.peerInstance) return;\n\n this.peerInstance.on('open', (id) => {\n this.debugLog('Peer', 'open', id);\n // \u6E05\u9664\u91CD\u8FDE\u5B9A\u65F6\u5668\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n });\n\n this.peerInstance.on('disconnected', () => {\n this.debugLog('Peer', 'disconnected');\n this.scheduleReconnect();\n });\n\n this.peerInstance.on('error', (err) => {\n this.debugLog('Peer', 'error', { type: err.type, message: err.message });\n // \u7F51\u7EDC\u76F8\u5173\u9519\u8BEF\u65F6\u5C1D\u8BD5\u91CD\u8FDE\n if (\n err.type === 'network' ||\n err.type === 'server-error' ||\n err.type === 'socket-error' ||\n err.type === 'socket-closed'\n ) {\n this.scheduleReconnect();\n }\n });\n\n this.peerInstance.on('close', () => {\n this.debugLog('Peer', 'close');\n });\n\n // \u8BBE\u7F6E\u4F20\u5165\u8FDE\u63A5\u5904\u7406\u5668\n this.setupIncomingConnectionHandler();\n }\n\n /**\n * \u5B89\u6392\u91CD\u8FDE\n */\n private scheduleReconnect(): void {\n if (this.isDestroyed) return;\n if (this.reconnectTimer) return; // \u5DF2\u6709\u91CD\u8FDE\u4EFB\u52A1\u5728\u7B49\u5F85\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.reconnect();\n }, 1000);\n }\n\n /**\n * \u6267\u884C\u91CD\u8FDE\n */\n private reconnect(): void {\n if (this.isDestroyed) return;\n\n this.debugLog('PeerJsWrapper', 'reconnect');\n\n // \u9500\u6BC1\u65E7\u5B9E\u4F8B\n if (this.peerInstance) {\n try {\n this.peerInstance.destroy();\n } catch {\n // \u5FFD\u7565\u9500\u6BC1\u65F6\u7684\u9519\u8BEF\n }\n this.peerInstance = null;\n }\n\n // \u91CD\u65B0\u8FDE\u63A5\n this.connect();\n }\n\n /**\n * \u83B7\u53D6\u5F53\u524D Peer ID\n * @returns string \u5F53\u524D Peer ID\n */\n getPeerId(): string {\n return this.myPeerId;\n }\n\n /**\n * \u7B49\u5F85 Peer \u8FDE\u63A5\u5C31\u7EEA\uFF08\u8FDE\u63A5\u5230\u4FE1\u4EE4\u670D\u52A1\u5668\uFF09\n * @returns Promise<void> \u5F53\u8FDE\u63A5\u6210\u529F\u65F6 resolve\n */\n whenReady(): Promise<void> {\n return this.waitForReady();\n }\n\n /**\n * \u7B49\u5F85 Peer \u8FDE\u63A5\u5C31\u7EEA\n */\n private waitForReady(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.peerInstance) {\n reject(new Error('Peer instance not initialized'));\n return;\n }\n\n if (this.peerInstance.open) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n this.peerInstance?.off('open', onOpen);\n this.peerInstance?.off('error', onError);\n resolve();\n };\n\n const onError = (err: Error) => {\n this.peerInstance?.off('open', onOpen);\n this.peerInstance?.off('error', onError);\n reject(err);\n };\n\n this.peerInstance.on('open', onOpen);\n this.peerInstance.on('error', onError);\n });\n }\n\n /**\n * \u53D1\u9001\u8BF7\u6C42\u5230\u6307\u5B9A Peer\n * @param peerId \u5BF9\u7AEF\u8BBE\u5907 ID\n * @param path \u8BF7\u6C42\u8DEF\u5F84\n * @param data \u8BF7\u6C42\u6570\u636E\n * @returns Promise<unknown> \u8FD4\u56DE\u54CD\u5E94\u6570\u636E\uFF08\u81EA\u52A8\u62C6\u7BB1\uFF0C\u53EA\u8FD4\u56DE data \u90E8\u5206\uFF09\n */\n send(peerId: string, path: string, data?: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n this.debugLog('PeerJsWrapper', 'send', { peerId, path, data });\n\n // \u7B49\u5F85 peer \u5B9E\u4F8B\u51C6\u5907\u597D\n this.waitForReady()\n .then(() => {\n if (!this.peerInstance) {\n reject(new Error('Peer instance not available'));\n return;\n }\n\n // \u6BCF\u6B21\u53D1\u9001\u6D88\u606F\u65F6\uFF0C\u90FD\u8FDE\u63A5\u4E00\u4E2A\u65B0\u7684 conn\n const conn = this.peerInstance.connect(peerId, {\n reliable: true,\n });\n\n const timeout = setTimeout(() => {\n conn.close();\n this.pendingRequests.delete(requestId);\n reject(new Error(`Request timeout: ${peerId}${path}`));\n }, 30000);\n\n const requestId = `${this.myPeerId}-${Date.now()}-${Math.random()}`;\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n conn.on('open', () => {\n this.debugLog('Conn', 'open', peerId);\n const request: Request = { path, data };\n const message: InternalMessage = {\n type: 'request',\n id: requestId,\n request,\n };\n conn.send(message);\n });\n\n conn.on('data', (responseData: unknown) => {\n this.debugLog('Conn', 'data', { peer: peerId, data: responseData });\n const message = responseData as InternalMessage;\n if (message.type === 'response' && message.id === requestId) {\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n\n const response = message.response!;\n // \u6821\u9A8C\u72B6\u6001\u7801\uFF0C\u975E 2xx \u5219 reject\n if (response.status < 200 || response.status >= 300) {\n pending.reject(\n new Error(`Request failed: ${response.status} ${JSON.stringify(response.data)}`)\n );\n } else {\n // \u81EA\u52A8\u62C6\u7BB1\uFF1A\u53EA\u8FD4\u56DE data \u90E8\u5206\n pending.resolve(response.data);\n }\n }\n conn.close();\n }\n });\n\n conn.on('error', (err) => {\n this.debugLog('Conn', 'error', { peer: peerId, error: err });\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.reject(err as Error);\n }\n });\n\n conn.on('close', () => {\n this.debugLog('Conn', 'close', peerId);\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.reject(new Error('Connection closed'));\n }\n });\n })\n .catch((err) => {\n reject(err);\n });\n });\n }\n\n /**\n * \u8BBE\u7F6E\u4F20\u5165\u8FDE\u63A5\u5904\u7406\u5668\n */\n private setupIncomingConnectionHandler(): void {\n if (!this.peerInstance) return;\n\n this.peerInstance.on('connection', (conn: DataConnection) => {\n this.debugLog('Peer', 'connection', conn.peer);\n this.connections.add(conn);\n\n conn.on('open', () => {\n this.debugLog('Conn', 'open', conn.peer);\n });\n\n conn.on('data', async (data: unknown) => {\n this.debugLog('Conn', 'data', { peer: conn.peer, data });\n const message = data as InternalMessage;\n\n if (message.type === 'request' && message.request) {\n try {\n const response = await this.handleRequest(conn.peer, message.request);\n\n const responseMessage: InternalMessage = {\n type: 'response',\n id: message.id,\n response,\n };\n\n conn.send(responseMessage);\n } catch (error) {\n const errorResponse: InternalMessage = {\n type: 'response',\n id: message.id,\n response: {\n status: 500,\n data: { error: error instanceof Error ? error.message : 'Unknown error' },\n },\n };\n\n conn.send(errorResponse);\n }\n }\n });\n\n conn.on('close', () => {\n this.debugLog('Conn', 'close', conn.peer);\n this.connections.delete(conn);\n });\n\n conn.on('error', (err) => {\n this.debugLog('Conn', 'error', { peer: conn.peer, error: err });\n this.connections.delete(conn);\n });\n });\n }\n\n /**\n * \u6CE8\u518C\u7B80\u5316\u5904\u7406\u5668\uFF08\u76F4\u63A5\u8FD4\u56DE\u6570\u636E\uFF0C\u81EA\u52A8\u88C5\u7BB1\uFF09\n * @param path \u8BF7\u6C42\u8DEF\u5F84\n * @param handler \u5904\u7406\u5668\u51FD\u6570\uFF0C\u63A5\u6536\u8BF7\u6C42\u6570\u636E\uFF0C\u76F4\u63A5\u8FD4\u56DE\u54CD\u5E94\u6570\u636E\n */\n registerHandler(path: string, handler: SimpleHandler): void {\n this.simpleHandlers.set(path, handler);\n }\n\n /**\n * \u6CE8\u9500\u7B80\u5316\u5904\u7406\u5668\n * @param path \u8BF7\u6C42\u8DEF\u5F84\n */\n unregisterHandler(path: string): void {\n this.simpleHandlers.delete(path);\n }\n\n /**\n * \u5185\u90E8\u8BF7\u6C42\u5904\u7406\u65B9\u6CD5\n * @param from \u53D1\u9001\u8005\u7684 Peer ID\n * @param request \u8BF7\u6C42\u6570\u636E\n */\n private async handleRequest(from: string, request: Request): Promise<Response> {\n const simpleHandler = this.simpleHandlers.get(request.path);\n if (simpleHandler) {\n const data = await simpleHandler(from, request.data);\n // \u81EA\u52A8\u88C5\u7BB1\uFF1A\u5C06\u8FD4\u56DE\u7684\u6570\u636E\u5305\u88C5\u6210 Response\n return { status: 200, data };\n }\n\n // \u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u5904\u7406\u5668\n return {\n status: 404,\n data: { error: `Path not found: ${request.path}` },\n };\n }\n\n /**\n * \u5173\u95ED\u6240\u6709\u8FDE\u63A5\u5E76\u9500\u6BC1 Peer \u5B9E\u4F8B\n */\n destroy(): void {\n this.isDestroyed = true;\n\n // \u6E05\u9664\u91CD\u8FDE\u5B9A\u65F6\u5668\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n for (const conn of this.connections.values()) {\n conn.close();\n }\n this.connections.clear();\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Peer destroyed'));\n }\n this.pendingRequests.clear();\n this.simpleHandlers.clear();\n\n if (this.peerInstance) {\n this.peerInstance.destroy();\n this.peerInstance = null;\n }\n }\n}\n\n// \u5BFC\u51FA\u7C7B\u578B\nexport type { Request, Response, SimpleHandler };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.umd.js
CHANGED
|
@@ -4913,7 +4913,7 @@ var PeerJsHttpUtil = (() => {
|
|
|
4913
4913
|
const message = data;
|
|
4914
4914
|
if (message.type === "request" && message.request) {
|
|
4915
4915
|
try {
|
|
4916
|
-
const response = await this.handleRequest(message.request);
|
|
4916
|
+
const response = await this.handleRequest(conn.peer, message.request);
|
|
4917
4917
|
const responseMessage = {
|
|
4918
4918
|
type: "response",
|
|
4919
4919
|
id: message.id,
|
|
@@ -4960,11 +4960,13 @@ var PeerJsHttpUtil = (() => {
|
|
|
4960
4960
|
}
|
|
4961
4961
|
/**
|
|
4962
4962
|
* 内部请求处理方法
|
|
4963
|
+
* @param from 发送者的 Peer ID
|
|
4964
|
+
* @param request 请求数据
|
|
4963
4965
|
*/
|
|
4964
|
-
async handleRequest(request) {
|
|
4966
|
+
async handleRequest(from, request) {
|
|
4965
4967
|
const simpleHandler = this.simpleHandlers.get(request.path);
|
|
4966
4968
|
if (simpleHandler) {
|
|
4967
|
-
const data = await simpleHandler(request.data);
|
|
4969
|
+
const data = await simpleHandler(from, request.data);
|
|
4968
4970
|
return { status: 200, data };
|
|
4969
4971
|
}
|
|
4970
4972
|
return {
|