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 CHANGED
@@ -129,6 +129,8 @@ export declare class PeerJsWrapper {
129
129
  unregisterHandler(path: string): void;
130
130
  /**
131
131
  * 内部请求处理方法
132
+ * @param from 发送者的 Peer ID
133
+ * @param request 请求数据
132
134
  */
133
135
  private handleRequest;
134
136
  /**
@@ -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;;OAEG;YACW,aAAa;IAe3B;;OAEG;IACH,OAAO,IAAI,IAAI;CA0BhB;AAGD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC"}
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 {
@@ -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 {