lightclawbot 1.1.2 → 1.2.0-beta.0
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/README.md +0 -1
- package/dist/index.js +38 -31
- package/dist/setup-entry.js +32 -0
- package/dist/src/channel.js +301 -257
- package/dist/src/channel.setup.js +16 -0
- package/dist/src/config.js +31 -124
- package/dist/src/dedup.js +0 -1
- package/dist/src/download-tool.js +0 -1
- package/dist/src/file-storage.js +2 -2
- package/dist/src/gateway.js +226 -178
- package/dist/src/history/cron-utils.js +0 -1
- package/dist/src/history/index.js +0 -1
- package/dist/src/history/message-parser.js +0 -1
- package/dist/src/history/session-reader.js +3 -1
- package/dist/src/history/session-store.js +0 -1
- package/dist/src/history/text-processing.js +0 -1
- package/dist/src/history/types.js +0 -1
- package/dist/src/inbound.js +183 -234
- package/dist/src/media.js +0 -1
- package/dist/src/messaging.js +65 -0
- package/dist/src/outbound.js +131 -45
- package/dist/src/runtime.js +29 -11
- package/dist/src/setup-core.js +27 -0
- package/dist/src/shared.js +141 -0
- package/dist/src/socket/handlers.js +72 -49
- package/dist/src/socket/index.js +0 -1
- package/dist/src/socket/native-socket.js +385 -0
- package/dist/src/socket/registry.js +0 -1
- package/dist/src/socket/reliable-emitter.js +188 -50
- package/dist/src/streaming/delta-tracker.js +140 -0
- package/dist/src/streaming/index.js +12 -0
- package/dist/src/streaming/stream-reply-sink.js +387 -0
- package/dist/src/streaming/types.js +4 -0
- package/dist/src/tools.js +13 -0
- package/dist/src/types.js +23 -2
- package/dist/src/upload-tool.js +0 -1
- package/dist/src/utils/account.js +73 -0
- package/dist/src/utils/common.js +48 -0
- package/dist/src/utils/index.js +2 -0
- package/node_modules/ws/index.js +22 -0
- package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/constants.js +1 -0
- package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/permessage-deflate.js +6 -6
- package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/websocket-server.js +10 -6
- package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/websocket.js +19 -14
- package/node_modules/{engine.io-client/node_modules/ws → ws}/package.json +4 -3
- package/node_modules/ws/wrapper.mjs +21 -0
- package/openclaw.plugin.json +0 -7
- package/package.json +8 -5
- package/dist/index.d.ts +0 -24
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/public/data/scripts/manifest.json +0 -11
- package/dist/public/data/scripts/preflight.9af62b39.sh +0 -191
- package/dist/public/data/scripts/preflight.sh +0 -191
- package/dist/src/channel.d.ts +0 -11
- package/dist/src/channel.d.ts.map +0 -1
- package/dist/src/channel.js.map +0 -1
- package/dist/src/config.d.ts +0 -129
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js.map +0 -1
- package/dist/src/dedup.d.ts +0 -12
- package/dist/src/dedup.d.ts.map +0 -1
- package/dist/src/dedup.js.map +0 -1
- package/dist/src/download-tool.d.ts +0 -32
- package/dist/src/download-tool.d.ts.map +0 -1
- package/dist/src/download-tool.js.map +0 -1
- package/dist/src/file-storage.d.ts +0 -74
- package/dist/src/file-storage.d.ts.map +0 -1
- package/dist/src/file-storage.js.map +0 -1
- package/dist/src/format-urls.d.ts +0 -26
- package/dist/src/format-urls.d.ts.map +0 -1
- package/dist/src/format-urls.js +0 -53
- package/dist/src/format-urls.js.map +0 -1
- package/dist/src/gateway.d.ts +0 -16
- package/dist/src/gateway.d.ts.map +0 -1
- package/dist/src/gateway.js.map +0 -1
- package/dist/src/history/cron-utils.d.ts +0 -76
- package/dist/src/history/cron-utils.d.ts.map +0 -1
- package/dist/src/history/cron-utils.js.map +0 -1
- package/dist/src/history/index.d.ts +0 -20
- package/dist/src/history/index.d.ts.map +0 -1
- package/dist/src/history/index.js.map +0 -1
- package/dist/src/history/message-parser.d.ts +0 -52
- package/dist/src/history/message-parser.d.ts.map +0 -1
- package/dist/src/history/message-parser.js.map +0 -1
- package/dist/src/history/session-reader.d.ts +0 -58
- package/dist/src/history/session-reader.d.ts.map +0 -1
- package/dist/src/history/session-reader.js.map +0 -1
- package/dist/src/history/session-store.d.ts +0 -42
- package/dist/src/history/session-store.d.ts.map +0 -1
- package/dist/src/history/session-store.js.map +0 -1
- package/dist/src/history/text-processing.d.ts +0 -41
- package/dist/src/history/text-processing.d.ts.map +0 -1
- package/dist/src/history/text-processing.js.map +0 -1
- package/dist/src/history/types.d.ts +0 -134
- package/dist/src/history/types.d.ts.map +0 -1
- package/dist/src/history/types.js.map +0 -1
- package/dist/src/inbound.d.ts +0 -18
- package/dist/src/inbound.d.ts.map +0 -1
- package/dist/src/inbound.js.map +0 -1
- package/dist/src/media.d.ts +0 -12
- package/dist/src/media.d.ts.map +0 -1
- package/dist/src/media.js.map +0 -1
- package/dist/src/outbound.d.ts +0 -28
- package/dist/src/outbound.d.ts.map +0 -1
- package/dist/src/outbound.js.map +0 -1
- package/dist/src/runtime.d.ts +0 -4
- package/dist/src/runtime.d.ts.map +0 -1
- package/dist/src/runtime.js.map +0 -1
- package/dist/src/socket/handlers.d.ts +0 -26
- package/dist/src/socket/handlers.d.ts.map +0 -1
- package/dist/src/socket/handlers.js.map +0 -1
- package/dist/src/socket/index.d.ts +0 -11
- package/dist/src/socket/index.d.ts.map +0 -1
- package/dist/src/socket/index.js.map +0 -1
- package/dist/src/socket/registry.d.ts +0 -59
- package/dist/src/socket/registry.d.ts.map +0 -1
- package/dist/src/socket/registry.js.map +0 -1
- package/dist/src/socket/reliable-emitter.d.ts +0 -79
- package/dist/src/socket/reliable-emitter.d.ts.map +0 -1
- package/dist/src/socket/reliable-emitter.js.map +0 -1
- package/dist/src/types.d.ts +0 -112
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js.map +0 -1
- package/dist/src/upload-tool.d.ts +0 -27
- package/dist/src/upload-tool.d.ts.map +0 -1
- package/dist/src/upload-tool.js.map +0 -1
- package/node_modules/@socket.io/component-emitter/LICENSE +0 -24
- package/node_modules/@socket.io/component-emitter/Readme.md +0 -79
- package/node_modules/@socket.io/component-emitter/lib/cjs/index.d.ts +0 -179
- package/node_modules/@socket.io/component-emitter/lib/cjs/index.js +0 -176
- package/node_modules/@socket.io/component-emitter/lib/cjs/package.json +0 -4
- package/node_modules/@socket.io/component-emitter/lib/esm/index.d.ts +0 -179
- package/node_modules/@socket.io/component-emitter/lib/esm/index.js +0 -169
- package/node_modules/@socket.io/component-emitter/lib/esm/package.json +0 -4
- package/node_modules/@socket.io/component-emitter/package.json +0 -28
- package/node_modules/debug/LICENSE +0 -20
- package/node_modules/debug/README.md +0 -481
- package/node_modules/debug/package.json +0 -64
- package/node_modules/debug/src/browser.js +0 -272
- package/node_modules/debug/src/common.js +0 -292
- package/node_modules/debug/src/index.js +0 -10
- package/node_modules/debug/src/node.js +0 -263
- package/node_modules/engine.io-client/LICENSE +0 -22
- package/node_modules/engine.io-client/README.md +0 -331
- package/node_modules/engine.io-client/build/cjs/browser-entrypoint.d.ts +0 -3
- package/node_modules/engine.io-client/build/cjs/browser-entrypoint.js +0 -4
- package/node_modules/engine.io-client/build/cjs/contrib/has-cors.d.ts +0 -1
- package/node_modules/engine.io-client/build/cjs/contrib/has-cors.js +0 -14
- package/node_modules/engine.io-client/build/cjs/contrib/parseqs.d.ts +0 -15
- package/node_modules/engine.io-client/build/cjs/contrib/parseqs.js +0 -38
- package/node_modules/engine.io-client/build/cjs/contrib/parseuri.d.ts +0 -1
- package/node_modules/engine.io-client/build/cjs/contrib/parseuri.js +0 -67
- package/node_modules/engine.io-client/build/cjs/globals.d.ts +0 -4
- package/node_modules/engine.io-client/build/cjs/globals.js +0 -26
- package/node_modules/engine.io-client/build/cjs/globals.node.d.ts +0 -21
- package/node_modules/engine.io-client/build/cjs/globals.node.js +0 -97
- package/node_modules/engine.io-client/build/cjs/index.d.ts +0 -15
- package/node_modules/engine.io-client/build/cjs/index.js +0 -32
- package/node_modules/engine.io-client/build/cjs/package.json +0 -10
- package/node_modules/engine.io-client/build/cjs/socket.d.ts +0 -482
- package/node_modules/engine.io-client/build/cjs/socket.js +0 -765
- package/node_modules/engine.io-client/build/cjs/transport.d.ts +0 -106
- package/node_modules/engine.io-client/build/cjs/transport.js +0 -153
- package/node_modules/engine.io-client/build/cjs/transports/index.d.ts +0 -8
- package/node_modules/engine.io-client/build/cjs/transports/index.js +0 -11
- package/node_modules/engine.io-client/build/cjs/transports/polling-fetch.d.ts +0 -15
- package/node_modules/engine.io-client/build/cjs/transports/polling-fetch.js +0 -60
- package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.d.ts +0 -108
- package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.js +0 -285
- package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.node.d.ts +0 -11
- package/node_modules/engine.io-client/build/cjs/transports/polling-xhr.node.js +0 -44
- package/node_modules/engine.io-client/build/cjs/transports/polling.d.ts +0 -52
- package/node_modules/engine.io-client/build/cjs/transports/polling.js +0 -165
- package/node_modules/engine.io-client/build/cjs/transports/websocket.d.ts +0 -36
- package/node_modules/engine.io-client/build/cjs/transports/websocket.js +0 -136
- package/node_modules/engine.io-client/build/cjs/transports/websocket.node.d.ts +0 -14
- package/node_modules/engine.io-client/build/cjs/transports/websocket.node.js +0 -68
- package/node_modules/engine.io-client/build/cjs/transports/webtransport.d.ts +0 -18
- package/node_modules/engine.io-client/build/cjs/transports/webtransport.js +0 -94
- package/node_modules/engine.io-client/build/cjs/util.d.ts +0 -7
- package/node_modules/engine.io-client/build/cjs/util.js +0 -65
- package/node_modules/engine.io-client/build/esm/browser-entrypoint.d.ts +0 -3
- package/node_modules/engine.io-client/build/esm/browser-entrypoint.js +0 -2
- package/node_modules/engine.io-client/build/esm/contrib/has-cors.d.ts +0 -1
- package/node_modules/engine.io-client/build/esm/contrib/has-cors.js +0 -11
- package/node_modules/engine.io-client/build/esm/contrib/parseqs.d.ts +0 -15
- package/node_modules/engine.io-client/build/esm/contrib/parseqs.js +0 -34
- package/node_modules/engine.io-client/build/esm/contrib/parseuri.d.ts +0 -1
- package/node_modules/engine.io-client/build/esm/contrib/parseuri.js +0 -64
- package/node_modules/engine.io-client/build/esm/globals.d.ts +0 -4
- package/node_modules/engine.io-client/build/esm/globals.js +0 -22
- package/node_modules/engine.io-client/build/esm/globals.node.d.ts +0 -21
- package/node_modules/engine.io-client/build/esm/globals.node.js +0 -91
- package/node_modules/engine.io-client/build/esm/index.d.ts +0 -15
- package/node_modules/engine.io-client/build/esm/index.js +0 -15
- package/node_modules/engine.io-client/build/esm/package.json +0 -10
- package/node_modules/engine.io-client/build/esm/socket.d.ts +0 -482
- package/node_modules/engine.io-client/build/esm/socket.js +0 -727
- package/node_modules/engine.io-client/build/esm/transport.d.ts +0 -106
- package/node_modules/engine.io-client/build/esm/transport.js +0 -142
- package/node_modules/engine.io-client/build/esm/transports/index.d.ts +0 -8
- package/node_modules/engine.io-client/build/esm/transports/index.js +0 -8
- package/node_modules/engine.io-client/build/esm/transports/polling-fetch.d.ts +0 -15
- package/node_modules/engine.io-client/build/esm/transports/polling-fetch.js +0 -56
- package/node_modules/engine.io-client/build/esm/transports/polling-xhr.d.ts +0 -108
- package/node_modules/engine.io-client/build/esm/transports/polling-xhr.js +0 -271
- package/node_modules/engine.io-client/build/esm/transports/polling-xhr.node.d.ts +0 -11
- package/node_modules/engine.io-client/build/esm/transports/polling-xhr.node.js +0 -17
- package/node_modules/engine.io-client/build/esm/transports/polling.d.ts +0 -52
- package/node_modules/engine.io-client/build/esm/transports/polling.js +0 -145
- package/node_modules/engine.io-client/build/esm/transports/websocket.d.ts +0 -36
- package/node_modules/engine.io-client/build/esm/transports/websocket.js +0 -125
- package/node_modules/engine.io-client/build/esm/transports/websocket.node.d.ts +0 -14
- package/node_modules/engine.io-client/build/esm/transports/websocket.node.js +0 -41
- package/node_modules/engine.io-client/build/esm/transports/webtransport.d.ts +0 -18
- package/node_modules/engine.io-client/build/esm/transports/webtransport.js +0 -80
- package/node_modules/engine.io-client/build/esm/util.d.ts +0 -7
- package/node_modules/engine.io-client/build/esm/util.js +0 -59
- package/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.d.ts +0 -3
- package/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.js +0 -2
- package/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.d.ts +0 -1
- package/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.js +0 -11
- package/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.d.ts +0 -15
- package/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.js +0 -34
- package/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.d.ts +0 -1
- package/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.js +0 -64
- package/node_modules/engine.io-client/build/esm-debug/globals.d.ts +0 -4
- package/node_modules/engine.io-client/build/esm-debug/globals.js +0 -22
- package/node_modules/engine.io-client/build/esm-debug/globals.node.d.ts +0 -21
- package/node_modules/engine.io-client/build/esm-debug/globals.node.js +0 -91
- package/node_modules/engine.io-client/build/esm-debug/index.d.ts +0 -15
- package/node_modules/engine.io-client/build/esm-debug/index.js +0 -15
- package/node_modules/engine.io-client/build/esm-debug/package.json +0 -10
- package/node_modules/engine.io-client/build/esm-debug/socket.d.ts +0 -482
- package/node_modules/engine.io-client/build/esm-debug/socket.js +0 -756
- package/node_modules/engine.io-client/build/esm-debug/transport.d.ts +0 -106
- package/node_modules/engine.io-client/build/esm-debug/transport.js +0 -145
- package/node_modules/engine.io-client/build/esm-debug/transports/index.d.ts +0 -8
- package/node_modules/engine.io-client/build/esm-debug/transports/index.js +0 -8
- package/node_modules/engine.io-client/build/esm-debug/transports/polling-fetch.d.ts +0 -15
- package/node_modules/engine.io-client/build/esm-debug/transports/polling-fetch.js +0 -56
- package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.d.ts +0 -108
- package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.js +0 -276
- package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.node.d.ts +0 -11
- package/node_modules/engine.io-client/build/esm-debug/transports/polling-xhr.node.js +0 -17
- package/node_modules/engine.io-client/build/esm-debug/transports/polling.d.ts +0 -52
- package/node_modules/engine.io-client/build/esm-debug/transports/polling.js +0 -158
- package/node_modules/engine.io-client/build/esm-debug/transports/websocket.d.ts +0 -36
- package/node_modules/engine.io-client/build/esm-debug/transports/websocket.js +0 -128
- package/node_modules/engine.io-client/build/esm-debug/transports/websocket.node.d.ts +0 -14
- package/node_modules/engine.io-client/build/esm-debug/transports/websocket.node.js +0 -41
- package/node_modules/engine.io-client/build/esm-debug/transports/webtransport.d.ts +0 -18
- package/node_modules/engine.io-client/build/esm-debug/transports/webtransport.js +0 -87
- package/node_modules/engine.io-client/build/esm-debug/util.d.ts +0 -7
- package/node_modules/engine.io-client/build/esm-debug/util.js +0 -59
- package/node_modules/engine.io-client/dist/engine.io.esm.min.js +0 -7
- package/node_modules/engine.io-client/dist/engine.io.esm.min.js.map +0 -1
- package/node_modules/engine.io-client/dist/engine.io.js +0 -3064
- package/node_modules/engine.io-client/dist/engine.io.js.map +0 -1
- package/node_modules/engine.io-client/dist/engine.io.min.js +0 -7
- package/node_modules/engine.io-client/dist/engine.io.min.js.map +0 -1
- package/node_modules/engine.io-client/node_modules/ws/index.js +0 -13
- package/node_modules/engine.io-client/node_modules/ws/wrapper.mjs +0 -8
- package/node_modules/engine.io-client/package.json +0 -95
- package/node_modules/engine.io-parser/LICENSE +0 -22
- package/node_modules/engine.io-parser/Readme.md +0 -158
- package/node_modules/engine.io-parser/build/cjs/commons.d.ts +0 -14
- package/node_modules/engine.io-parser/build/cjs/commons.js +0 -19
- package/node_modules/engine.io-parser/build/cjs/contrib/base64-arraybuffer.d.ts +0 -2
- package/node_modules/engine.io-parser/build/cjs/contrib/base64-arraybuffer.js +0 -48
- package/node_modules/engine.io-parser/build/cjs/decodePacket.browser.d.ts +0 -2
- package/node_modules/engine.io-parser/build/cjs/decodePacket.browser.js +0 -66
- package/node_modules/engine.io-parser/build/cjs/decodePacket.d.ts +0 -2
- package/node_modules/engine.io-parser/build/cjs/decodePacket.js +0 -59
- package/node_modules/engine.io-parser/build/cjs/encodePacket.browser.d.ts +0 -4
- package/node_modules/engine.io-parser/build/cjs/encodePacket.browser.js +0 -72
- package/node_modules/engine.io-parser/build/cjs/encodePacket.d.ts +0 -3
- package/node_modules/engine.io-parser/build/cjs/encodePacket.js +0 -38
- package/node_modules/engine.io-parser/build/cjs/index.d.ts +0 -9
- package/node_modules/engine.io-parser/build/cjs/index.js +0 -164
- package/node_modules/engine.io-parser/build/cjs/package.json +0 -8
- package/node_modules/engine.io-parser/build/esm/commons.d.ts +0 -14
- package/node_modules/engine.io-parser/build/esm/commons.js +0 -14
- package/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.d.ts +0 -2
- package/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js +0 -43
- package/node_modules/engine.io-parser/build/esm/decodePacket.browser.d.ts +0 -2
- package/node_modules/engine.io-parser/build/esm/decodePacket.browser.js +0 -62
- package/node_modules/engine.io-parser/build/esm/decodePacket.d.ts +0 -2
- package/node_modules/engine.io-parser/build/esm/decodePacket.js +0 -55
- package/node_modules/engine.io-parser/build/esm/encodePacket.browser.d.ts +0 -4
- package/node_modules/engine.io-parser/build/esm/encodePacket.browser.js +0 -68
- package/node_modules/engine.io-parser/build/esm/encodePacket.d.ts +0 -3
- package/node_modules/engine.io-parser/build/esm/encodePacket.js +0 -33
- package/node_modules/engine.io-parser/build/esm/index.d.ts +0 -9
- package/node_modules/engine.io-parser/build/esm/index.js +0 -156
- package/node_modules/engine.io-parser/build/esm/package.json +0 -8
- package/node_modules/engine.io-parser/package.json +0 -46
- package/node_modules/ms/index.js +0 -162
- package/node_modules/ms/license.md +0 -21
- package/node_modules/ms/package.json +0 -38
- package/node_modules/ms/readme.md +0 -59
- package/node_modules/socket.io-client/LICENSE +0 -21
- package/node_modules/socket.io-client/README.md +0 -29
- package/node_modules/socket.io-client/build/cjs/browser-entrypoint.d.ts +0 -2
- package/node_modules/socket.io-client/build/cjs/browser-entrypoint.js +0 -4
- package/node_modules/socket.io-client/build/cjs/contrib/backo2.d.ts +0 -12
- package/node_modules/socket.io-client/build/cjs/contrib/backo2.js +0 -69
- package/node_modules/socket.io-client/build/cjs/index.d.ts +0 -29
- package/node_modules/socket.io-client/build/cjs/index.js +0 -76
- package/node_modules/socket.io-client/build/cjs/manager.d.ts +0 -295
- package/node_modules/socket.io-client/build/cjs/manager.js +0 -416
- package/node_modules/socket.io-client/build/cjs/on.d.ts +0 -2
- package/node_modules/socket.io-client/build/cjs/on.js +0 -9
- package/node_modules/socket.io-client/build/cjs/socket.d.ts +0 -593
- package/node_modules/socket.io-client/build/cjs/socket.js +0 -909
- package/node_modules/socket.io-client/build/cjs/url.d.ts +0 -33
- package/node_modules/socket.io-client/build/cjs/url.js +0 -69
- package/node_modules/socket.io-client/build/esm/browser-entrypoint.d.ts +0 -2
- package/node_modules/socket.io-client/build/esm/browser-entrypoint.js +0 -2
- package/node_modules/socket.io-client/build/esm/contrib/backo2.d.ts +0 -12
- package/node_modules/socket.io-client/build/esm/contrib/backo2.js +0 -66
- package/node_modules/socket.io-client/build/esm/index.d.ts +0 -29
- package/node_modules/socket.io-client/build/esm/index.js +0 -58
- package/node_modules/socket.io-client/build/esm/manager.d.ts +0 -295
- package/node_modules/socket.io-client/build/esm/manager.js +0 -367
- package/node_modules/socket.io-client/build/esm/on.d.ts +0 -2
- package/node_modules/socket.io-client/build/esm/on.js +0 -6
- package/node_modules/socket.io-client/build/esm/package.json +0 -5
- package/node_modules/socket.io-client/build/esm/socket.d.ts +0 -593
- package/node_modules/socket.io-client/build/esm/socket.js +0 -880
- package/node_modules/socket.io-client/build/esm/url.d.ts +0 -33
- package/node_modules/socket.io-client/build/esm/url.js +0 -59
- package/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.d.ts +0 -2
- package/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.js +0 -2
- package/node_modules/socket.io-client/build/esm-debug/contrib/backo2.d.ts +0 -12
- package/node_modules/socket.io-client/build/esm-debug/contrib/backo2.js +0 -66
- package/node_modules/socket.io-client/build/esm-debug/index.d.ts +0 -29
- package/node_modules/socket.io-client/build/esm-debug/index.js +0 -62
- package/node_modules/socket.io-client/build/esm-debug/manager.d.ts +0 -295
- package/node_modules/socket.io-client/build/esm-debug/manager.js +0 -386
- package/node_modules/socket.io-client/build/esm-debug/on.d.ts +0 -2
- package/node_modules/socket.io-client/build/esm-debug/on.js +0 -6
- package/node_modules/socket.io-client/build/esm-debug/package.json +0 -5
- package/node_modules/socket.io-client/build/esm-debug/socket.d.ts +0 -593
- package/node_modules/socket.io-client/build/esm-debug/socket.js +0 -902
- package/node_modules/socket.io-client/build/esm-debug/url.d.ts +0 -33
- package/node_modules/socket.io-client/build/esm-debug/url.js +0 -63
- package/node_modules/socket.io-client/dist/socket.io.esm.min.js +0 -7
- package/node_modules/socket.io-client/dist/socket.io.esm.min.js.map +0 -1
- package/node_modules/socket.io-client/dist/socket.io.js +0 -4955
- package/node_modules/socket.io-client/dist/socket.io.js.map +0 -1
- package/node_modules/socket.io-client/dist/socket.io.min.js +0 -7
- package/node_modules/socket.io-client/dist/socket.io.min.js.map +0 -1
- package/node_modules/socket.io-client/dist/socket.io.msgpack.min.js +0 -7
- package/node_modules/socket.io-client/dist/socket.io.msgpack.min.js.map +0 -1
- package/node_modules/socket.io-client/package.json +0 -101
- package/node_modules/socket.io-parser/LICENSE +0 -20
- package/node_modules/socket.io-parser/Readme.md +0 -81
- package/node_modules/socket.io-parser/build/cjs/binary.d.ts +0 -20
- package/node_modules/socket.io-parser/build/cjs/binary.js +0 -87
- package/node_modules/socket.io-parser/build/cjs/index.d.ts +0 -101
- package/node_modules/socket.io-parser/build/cjs/index.js +0 -367
- package/node_modules/socket.io-parser/build/cjs/is-binary.d.ts +0 -7
- package/node_modules/socket.io-parser/build/cjs/is-binary.js +0 -54
- package/node_modules/socket.io-parser/build/cjs/package.json +0 -3
- package/node_modules/socket.io-parser/build/esm/binary.d.ts +0 -20
- package/node_modules/socket.io-parser/build/esm/binary.js +0 -83
- package/node_modules/socket.io-parser/build/esm/index.d.ts +0 -101
- package/node_modules/socket.io-parser/build/esm/index.js +0 -356
- package/node_modules/socket.io-parser/build/esm/is-binary.d.ts +0 -7
- package/node_modules/socket.io-parser/build/esm/is-binary.js +0 -50
- package/node_modules/socket.io-parser/build/esm/package.json +0 -3
- package/node_modules/socket.io-parser/build/esm-debug/binary.d.ts +0 -20
- package/node_modules/socket.io-parser/build/esm-debug/binary.js +0 -83
- package/node_modules/socket.io-parser/build/esm-debug/index.d.ts +0 -101
- package/node_modules/socket.io-parser/build/esm-debug/index.js +0 -361
- package/node_modules/socket.io-parser/build/esm-debug/is-binary.d.ts +0 -7
- package/node_modules/socket.io-parser/build/esm-debug/is-binary.js +0 -50
- package/node_modules/socket.io-parser/build/esm-debug/package.json +0 -3
- package/node_modules/socket.io-parser/package.json +0 -44
- package/node_modules/xmlhttprequest-ssl/LICENSE +0 -22
- package/node_modules/xmlhttprequest-ssl/README.md +0 -67
- package/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js +0 -689
- package/node_modules/xmlhttprequest-ssl/package.json +0 -40
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/LICENSE +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/README.md +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/browser.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/buffer-util.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/event-target.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/extension.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/limiter.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/receiver.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/sender.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/stream.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/subprotocol.js +0 -0
- /package/node_modules/{engine.io-client/node_modules/ws → ws}/lib/validation.js +0 -0
|
@@ -1,32 +1,66 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* LightClaw —
|
|
2
|
+
* LightClaw — 可靠发送器(ReliableEmitter)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* socket.
|
|
6
|
-
*
|
|
4
|
+
* 解决的核心问题:
|
|
5
|
+
* 普通的 socket.emit 是「发完即忘」,网络抖动时消息可能悄无声息地丢失。
|
|
6
|
+
* ReliableEmitter 在此基础上增加了「确认 + 重试」机制,确保消息最终送达。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 工作原理:
|
|
9
|
+
* 1. 发送时利用 NativeSocketClient 的 ACK + timeout 机制:
|
|
10
|
+
* socket.timeout(ms).emit(event, data, (err, ...args) => { ... })
|
|
11
|
+
* 超时由 NativeSocketClient 内部处理,回调第一个参数为 Error(超时)或 null(成功)。
|
|
12
|
+
* 2. 未收到 ACK(超时或出错)则按「指数退避 + 随机抖动」策略安排重试。
|
|
13
|
+
* 3. 断线期间暂停所有重试计时器(pause),重连后立即重发所有待确认消息(resume)。
|
|
14
|
+
* 4. 每条消息注入 idempotencyKey,服务端/前端据此去重,防止重试导致重复处理。
|
|
15
|
+
*
|
|
16
|
+
* 生命周期:
|
|
17
|
+
* new ReliableEmitter(getSocket, log)
|
|
18
|
+
* → emitWithAck(...) 发送消息
|
|
19
|
+
* → pause() 断线时调用
|
|
20
|
+
* → resume() 重连时调用
|
|
21
|
+
* → destroy() 销毁时调用(清理所有定时器)
|
|
22
|
+
*
|
|
23
|
+
* @format
|
|
9
24
|
*/
|
|
10
|
-
import { EMIT_ACK_TIMEOUT, EMIT_MAX_RETRIES, EMIT_RETRY_BASE_DELAY, EMIT_RETRY_MAX_DELAY, EMIT_PENDING_MAX, } from
|
|
25
|
+
import { EMIT_ACK_TIMEOUT, EMIT_MAX_RETRIES, EMIT_RETRY_BASE_DELAY, EMIT_RETRY_MAX_DELAY, EMIT_PENDING_MAX, } from '../config.js';
|
|
11
26
|
// ============================================================
|
|
12
|
-
// ReliableEmitter
|
|
27
|
+
// ReliableEmitter 主类
|
|
13
28
|
// ============================================================
|
|
14
29
|
export class ReliableEmitter {
|
|
15
30
|
getSocket;
|
|
16
31
|
log;
|
|
32
|
+
/**
|
|
33
|
+
* 待确认消息队列。
|
|
34
|
+
* key = emitId(内部唯一标识),value = PendingMessage。
|
|
35
|
+
* 消息从入队到收到 ACK(或放弃)期间始终存在于此 Map 中。
|
|
36
|
+
*/
|
|
17
37
|
pending = new Map();
|
|
38
|
+
/**
|
|
39
|
+
* 是否处于暂停状态(断线中)。
|
|
40
|
+
* 暂停时:新消息入队但不发送;已有重试计时器全部清除。
|
|
41
|
+
* 恢复时:立即重发所有 pending 消息。
|
|
42
|
+
*/
|
|
18
43
|
paused = false;
|
|
44
|
+
/**
|
|
45
|
+
* 自增计数器,配合时间戳生成唯一的 emitId,防止高频调用时 ID 碰撞。
|
|
46
|
+
*/
|
|
19
47
|
idCounter = 0;
|
|
20
|
-
|
|
48
|
+
/** 运行时统计,通过 getStats() 对外暴露 */
|
|
21
49
|
stats = {
|
|
22
50
|
totalEmitted: 0,
|
|
23
51
|
totalConfirmed: 0,
|
|
24
52
|
totalRetries: 0,
|
|
25
53
|
totalFailed: 0,
|
|
26
54
|
};
|
|
27
|
-
|
|
55
|
+
/**
|
|
56
|
+
* 日志前缀。默认 `[ReliableEmitter]`;gateway 在创建实例时可注入
|
|
57
|
+
* 业务通道前缀(如 `[lightclawbot]`),使上游日志风格统一。
|
|
58
|
+
*/
|
|
59
|
+
logPrefix;
|
|
60
|
+
constructor(getSocket, log, logPrefix = "[ReliableEmitter]") {
|
|
28
61
|
this.getSocket = getSocket;
|
|
29
62
|
this.log = log;
|
|
63
|
+
this.logPrefix = logPrefix;
|
|
30
64
|
}
|
|
31
65
|
// ----------------------------------------------------------
|
|
32
66
|
// 公开 API
|
|
@@ -34,24 +68,35 @@ export class ReliableEmitter {
|
|
|
34
68
|
/**
|
|
35
69
|
* 可靠发送 — 带 ACK 确认 + 自动重试。
|
|
36
70
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
71
|
+
* 与普通 socket.emit 的区别:
|
|
72
|
+
* - 每次发送都等待服务端 ACK 回调,超时则自动重试
|
|
73
|
+
* - 断线期间消息不丢失,重连后自动补发
|
|
74
|
+
* - 消息体自动注入 idempotencyKey,防止重试导致重复处理
|
|
39
75
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
76
|
+
* 注意:每次调用都是独立的发送请求,不会因相同 msgId 被合并或去重。
|
|
77
|
+
* 内部使用自增 emitId 作为 pending Map 的 key、ACK 回路的 pendingKey 及 idempotencyKey。
|
|
78
|
+
* 业务层 msgId 保留在 data.msgId 中原样发送,同一条消息的所有重试保持相同,服务端用它识别消息身份。
|
|
79
|
+
*
|
|
80
|
+
* @param event WebSocket 事件名(如 "message:private")
|
|
81
|
+
* @param data 消息体对象,会被浅拷贝并注入 idempotencyKey
|
|
82
|
+
* @param msgId 业务层消息 ID,保留在 data.msgId 中不变,可选
|
|
83
|
+
* @returns Promise<boolean>:true = 服务端已确认,false = 重试耗尽或被淘汰
|
|
44
84
|
*/
|
|
45
85
|
emitWithAck(event, data, msgId) {
|
|
46
86
|
// 每次调用生成唯一的内部 ID,确保同一 msgId 的多次 emit 不会互相覆盖
|
|
47
87
|
const emitId = this.generateEmitId();
|
|
48
88
|
this.stats.totalEmitted++;
|
|
49
|
-
// 队列满时淘汰最早的
|
|
89
|
+
// 队列满时淘汰最早的 pending 消息,防止内存无限增长
|
|
50
90
|
this.evictIfNeeded();
|
|
51
91
|
// 为消息体注入 idempotencyKey:
|
|
52
|
-
// 使用 emitId
|
|
53
|
-
//
|
|
92
|
+
// - 使用 emitId 作为值,每次 emitWithAck 调用唯一
|
|
93
|
+
// - 同一次 emit 的所有重试共用同一 emitId,服务端据此去重,避免 ACK 丢失重发导致重复处理
|
|
94
|
+
// - idempotencyKey 同时作为 ACK 回路的 pendingKey(NativeSocket 优先取 data.idempotencyKey)
|
|
95
|
+
// - 浅拷贝原始 data,不修改调用方传入的对象
|
|
96
|
+
// - data.msgId 保持业务层原值不变,同一条消息的所有重试相同,服务端用它识别消息身份
|
|
54
97
|
const enrichedData = { ...data, idempotencyKey: emitId };
|
|
98
|
+
// 统一的发送日志(含最终 payload),业务层无需再打
|
|
99
|
+
this.log?.info(`${this.logPrefix} emit: ${JSON.stringify(enrichedData)}`);
|
|
55
100
|
return new Promise((resolve) => {
|
|
56
101
|
const entry = {
|
|
57
102
|
id: emitId,
|
|
@@ -63,59 +108,87 @@ export class ReliableEmitter {
|
|
|
63
108
|
retryTimer: null,
|
|
64
109
|
resolve,
|
|
65
110
|
};
|
|
111
|
+
// 入队:消息在收到 ACK 或放弃前始终保存在 pending Map 中
|
|
66
112
|
this.pending.set(emitId, entry);
|
|
67
113
|
if (this.paused) {
|
|
68
|
-
//
|
|
69
|
-
this.log?.info(
|
|
114
|
+
// 断线中,等 resume 统一重发
|
|
115
|
+
this.log?.info(`${this.logPrefix} Queued while paused: emitId=${emitId}, msgId=${msgId}`);
|
|
70
116
|
return;
|
|
71
117
|
}
|
|
118
|
+
// 正常状态:立即尝试发送
|
|
72
119
|
this.doEmit(entry);
|
|
73
120
|
});
|
|
74
121
|
}
|
|
75
122
|
/**
|
|
76
|
-
* 断线时调用 —
|
|
123
|
+
* 断线时调用 — 暂停所有重试计时器。
|
|
124
|
+
*
|
|
125
|
+
* 调用后:
|
|
126
|
+
* - 所有已安排的重试定时器被清除(retryTimer = null)
|
|
127
|
+
* - 新的 emitWithAck 调用仍可入队,但不会立即发送
|
|
128
|
+
* - 重试次数计数器不增加(断线等待不算重试)
|
|
129
|
+
*
|
|
130
|
+
* 幂等:重复调用无副作用。
|
|
77
131
|
*/
|
|
78
132
|
pause() {
|
|
79
133
|
if (this.paused)
|
|
80
134
|
return;
|
|
81
135
|
this.paused = true;
|
|
136
|
+
// 清除所有待执行的重试定时器,避免断线期间无效的发送尝试
|
|
82
137
|
for (const entry of this.pending.values()) {
|
|
83
138
|
if (entry.retryTimer) {
|
|
84
139
|
clearTimeout(entry.retryTimer);
|
|
85
140
|
entry.retryTimer = null;
|
|
86
141
|
}
|
|
87
142
|
}
|
|
88
|
-
this.log?.info(
|
|
143
|
+
this.log?.info(`${this.logPrefix} Paused, ${this.pending.size} message(s) pending`);
|
|
89
144
|
}
|
|
90
145
|
/**
|
|
91
|
-
* 重连时调用 —
|
|
146
|
+
* 重连时调用 — 立即重发所有待确认消息。
|
|
147
|
+
*
|
|
148
|
+
* 调用后:
|
|
149
|
+
* - 解除暂停状态
|
|
150
|
+
* - 遍历 pending Map,对每条消息立即调用 doEmit
|
|
151
|
+
* - 断线期间新入队的消息也会在此时被发送
|
|
152
|
+
*
|
|
153
|
+
* 幂等:重复调用无副作用。
|
|
92
154
|
*/
|
|
93
155
|
resume() {
|
|
94
156
|
if (!this.paused)
|
|
95
157
|
return;
|
|
96
158
|
this.paused = false;
|
|
97
|
-
this.log?.info(
|
|
159
|
+
this.log?.info(`${this.logPrefix} Resumed, re-emitting ${this.pending.size} pending message(s)`);
|
|
98
160
|
for (const entry of this.pending.values()) {
|
|
99
161
|
this.doEmit(entry);
|
|
100
162
|
}
|
|
101
163
|
}
|
|
102
164
|
/**
|
|
103
|
-
* 销毁 —
|
|
165
|
+
* 销毁 — 清除所有定时器,将所有 pending Promise resolve 为 false。
|
|
166
|
+
*
|
|
167
|
+
* 在 gateway 断开连接、插件卸载时调用,防止内存泄漏和悬空定时器。
|
|
168
|
+
* 调用后此实例不应再被使用。
|
|
104
169
|
*/
|
|
105
170
|
destroy() {
|
|
106
171
|
for (const entry of this.pending.values()) {
|
|
172
|
+
// 清除重试定时器,防止 destroy 后仍有定时器触发
|
|
107
173
|
if (entry.retryTimer)
|
|
108
174
|
clearTimeout(entry.retryTimer);
|
|
175
|
+
// 将 Promise resolve 为 false,通知调用方消息未被确认
|
|
109
176
|
entry.resolve(false);
|
|
110
177
|
}
|
|
111
178
|
this.pending.clear();
|
|
112
|
-
this.log?.info(
|
|
179
|
+
this.log?.info(`${this.logPrefix} Destroyed`);
|
|
113
180
|
}
|
|
114
|
-
/**
|
|
181
|
+
/**
|
|
182
|
+
* 当前待确认消息数(实时值)。
|
|
183
|
+
* 可用于监控队列积压情况,正常情况下应接近 0。
|
|
184
|
+
*/
|
|
115
185
|
get pendingCount() {
|
|
116
186
|
return this.pending.size;
|
|
117
187
|
}
|
|
118
|
-
/**
|
|
188
|
+
/**
|
|
189
|
+
* 获取运行时统计信息的快照(浅拷贝,不影响内部状态)。
|
|
190
|
+
* 可用于监控面板、调试日志等场景。
|
|
191
|
+
*/
|
|
119
192
|
getStats() {
|
|
120
193
|
return { ...this.stats, currentPending: this.pending.size };
|
|
121
194
|
}
|
|
@@ -123,95 +196,160 @@ export class ReliableEmitter {
|
|
|
123
196
|
// 内部方法
|
|
124
197
|
// ----------------------------------------------------------
|
|
125
198
|
/**
|
|
126
|
-
*
|
|
199
|
+
* 实际执行 socket.emit 的内部方法。
|
|
200
|
+
*
|
|
201
|
+
* 发送机制:
|
|
202
|
+
* socket.timeout(EMIT_ACK_TIMEOUT).emit(event, data, callback)
|
|
203
|
+
* - 超时由 NativeSocketClient 的 .timeout() 处理,无需手动 setTimeout
|
|
204
|
+
* - 回调签名为 (err: Error | null),err 非空表示超时或服务端返回错误
|
|
205
|
+
* - socket.emit 是异步的,不会抛同步异常,无需 try-catch
|
|
127
206
|
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
207
|
+
* 调用时机:
|
|
208
|
+
* - emitWithAck 首次发送(非暂停状态)
|
|
209
|
+
* - resume 重连后补发
|
|
210
|
+
* - scheduleRetry 定时器触发后重试
|
|
131
211
|
*/
|
|
132
212
|
doEmit(entry) {
|
|
133
213
|
const socket = this.getSocket();
|
|
134
214
|
if (!socket?.connected) {
|
|
135
|
-
// socket
|
|
215
|
+
// socket 不可用(断线或尚未连接),不计重试次数,等 resume() 时重发
|
|
136
216
|
return;
|
|
137
217
|
}
|
|
138
|
-
|
|
139
|
-
|
|
218
|
+
// 直接使用 entry.data 作为发送数据,字段职责说明:
|
|
219
|
+
// - data.msgId:业务层消息 ID,同一条消息所有重试相同,服务端 ACK 通过 relatedMsgId 原样回传
|
|
220
|
+
// - data.idempotencyKey:= emitId,每次 emitWithAck 调用唯一,仅用于服务端去重,不参与 ACK 匹配
|
|
221
|
+
// - ACK 回路:NativeSocket 以 data.msgId 为 pendingKey 注册,服务端 ACK relatedMsgId = msgId,两者一致,回路正常闭合
|
|
222
|
+
const sendData = entry.data;
|
|
223
|
+
socket
|
|
224
|
+
.timeout(EMIT_ACK_TIMEOUT)
|
|
225
|
+
.emit(entry.event, sendData, (err) => {
|
|
226
|
+
// 防御性检查:消息可能在等待 ACK 期间被 destroy() 或 confirm() 移除
|
|
140
227
|
if (!this.pending.has(entry.id))
|
|
141
228
|
return;
|
|
142
229
|
if (err) {
|
|
143
|
-
//
|
|
230
|
+
// ACK 超时或服务端返回错误,安排下一次重试
|
|
144
231
|
this.log?.warn(`[ReliableEmitter] ACK error: emitId=${entry.id}, msgId=${entry.msgId}, err=${err.message}, retryCount=${entry.retryCount}`);
|
|
145
232
|
this.scheduleRetry(entry);
|
|
146
233
|
}
|
|
147
234
|
else {
|
|
148
|
-
|
|
149
|
-
//
|
|
235
|
+
// 服务端已确认收到,从 pending 队列移除
|
|
236
|
+
// this.log?.info(
|
|
237
|
+
// `[ReliableEmitter] ACK success: emitId=${entry.id}, msgId=${entry.msgId}, retryCount=${entry.retryCount}`,
|
|
238
|
+
// );
|
|
150
239
|
this.confirm(entry.id);
|
|
151
240
|
}
|
|
152
241
|
});
|
|
153
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* 确认消息已送达,从 pending 队列移除并 resolve Promise 为 true。
|
|
245
|
+
* 幂等:若消息已被移除(重复 ACK 或已 destroy),直接返回。
|
|
246
|
+
*/
|
|
154
247
|
confirm(id) {
|
|
155
248
|
const entry = this.pending.get(id);
|
|
156
249
|
if (!entry)
|
|
157
|
-
return; // 已被 confirm 或 destroy
|
|
250
|
+
return; // 已被 confirm 或 destroy,幂等处理
|
|
251
|
+
// 清除可能存在的重试定时器(理论上 ACK 成功时不应有,但做防御性清理)
|
|
158
252
|
if (entry.retryTimer) {
|
|
159
253
|
clearTimeout(entry.retryTimer);
|
|
160
254
|
entry.retryTimer = null;
|
|
161
255
|
}
|
|
162
256
|
this.pending.delete(id);
|
|
163
257
|
this.stats.totalConfirmed++;
|
|
258
|
+
// 通知调用方:消息已被服务端确认
|
|
164
259
|
entry.resolve(true);
|
|
165
260
|
}
|
|
261
|
+
/**
|
|
262
|
+
* 安排下一次重试,使用指数退避 + 随机抖动策略。
|
|
263
|
+
*
|
|
264
|
+
* 重试流程:
|
|
265
|
+
* 1. 若当前处于暂停状态(断线),不安排重试,等 resume() 统一处理
|
|
266
|
+
* 2. 若重试次数已达上限(EMIT_MAX_RETRIES),放弃并 resolve false
|
|
267
|
+
* 3. 否则计算延迟时间,设置定时器,到期后调用 doEmit
|
|
268
|
+
*/
|
|
166
269
|
scheduleRetry(entry) {
|
|
167
|
-
//
|
|
270
|
+
// 断线中不安排重试,等 resume() 时由 doEmit 统一重发
|
|
168
271
|
if (this.paused)
|
|
169
272
|
return;
|
|
170
273
|
if (entry.retryCount >= EMIT_MAX_RETRIES) {
|
|
171
|
-
//
|
|
274
|
+
// 重试次数耗尽,放弃该消息
|
|
172
275
|
this.pending.delete(entry.id);
|
|
173
276
|
this.stats.totalFailed++;
|
|
174
|
-
this.log?.error(
|
|
277
|
+
this.log?.error(`${this.logPrefix} Gave up after ${entry.retryCount} retries: emitId=${entry.id}, msgId=${entry.msgId}, ` +
|
|
175
278
|
`elapsed=${Date.now() - entry.createdAt}ms`);
|
|
279
|
+
// 通知调用方:消息最终未被确认
|
|
176
280
|
entry.resolve(false);
|
|
177
281
|
return;
|
|
178
282
|
}
|
|
283
|
+
// 增加重试计数(先加后用,确保 getRetryDelay 收到正确的重试序号)
|
|
179
284
|
entry.retryCount++;
|
|
180
285
|
this.stats.totalRetries++;
|
|
181
286
|
const delay = this.getRetryDelay(entry.retryCount);
|
|
182
|
-
this.log?.info(
|
|
287
|
+
this.log?.info(`${this.logPrefix} Retry #${entry.retryCount} in ${delay}ms: emitId=${entry.id}, msgId=${entry.msgId}`);
|
|
183
288
|
entry.retryTimer = setTimeout(() => {
|
|
184
289
|
entry.retryTimer = null;
|
|
290
|
+
// 定时器触发时再次检查是否断线(重试等待期间可能发生断线)
|
|
185
291
|
if (this.paused)
|
|
186
|
-
return;
|
|
292
|
+
return;
|
|
187
293
|
this.doEmit(entry);
|
|
188
294
|
}, delay);
|
|
189
295
|
}
|
|
190
296
|
/**
|
|
191
|
-
*
|
|
192
|
-
*
|
|
297
|
+
* 计算重试延迟时间(指数退避 + 随机抖动)。
|
|
298
|
+
*
|
|
299
|
+
* 公式:delay = min(base × 2^(retryCount-1) + jitter, maxDelay)
|
|
300
|
+
*
|
|
301
|
+
* 示例(base=1000ms, max=30000ms):
|
|
302
|
+
* 第 1 次重试:~1000ms + jitter
|
|
303
|
+
* 第 2 次重试:~2000ms + jitter
|
|
304
|
+
* 第 3 次重试:~4000ms + jitter
|
|
305
|
+
* 第 4 次重试:~8000ms + jitter
|
|
306
|
+
* 第 5 次重试:~16000ms + jitter(若超过 maxDelay 则取 maxDelay)
|
|
307
|
+
*
|
|
308
|
+
* 随机抖动(0~1000ms)的作用:
|
|
309
|
+
* 防止多个客户端在同一时刻同时重试,避免服务端瞬间收到大量重试请求(惊群效应)。
|
|
310
|
+
*
|
|
311
|
+
* @param retryCount - 当前重试序号(从 1 开始)
|
|
193
312
|
*/
|
|
194
313
|
getRetryDelay(retryCount) {
|
|
195
314
|
const base = EMIT_RETRY_BASE_DELAY * Math.pow(2, retryCount - 1);
|
|
196
315
|
const jitter = Math.random() * 1000;
|
|
197
316
|
return Math.min(base + jitter, EMIT_RETRY_MAX_DELAY);
|
|
198
317
|
}
|
|
199
|
-
/**
|
|
318
|
+
/**
|
|
319
|
+
* 队列容量保护:当 pending 消息数达到上限(EMIT_PENDING_MAX)时,
|
|
320
|
+
* 按 FIFO 顺序淘汰最早入队的消息,防止内存无限增长。
|
|
321
|
+
*
|
|
322
|
+
* 触发场景:网络长时间中断且消息持续入队时。
|
|
323
|
+
* Map 的迭代顺序与插入顺序一致,因此 values().next().value 即为最早的消息。
|
|
324
|
+
*/
|
|
200
325
|
evictIfNeeded() {
|
|
201
326
|
while (this.pending.size >= EMIT_PENDING_MAX) {
|
|
327
|
+
// Map 按插入顺序迭代,第一个即为最早入队的消息
|
|
202
328
|
const oldest = this.pending.values().next().value;
|
|
203
329
|
if (!oldest)
|
|
204
330
|
break;
|
|
331
|
+
// 清除重试定时器,防止被淘汰后仍触发重试
|
|
205
332
|
if (oldest.retryTimer)
|
|
206
333
|
clearTimeout(oldest.retryTimer);
|
|
207
334
|
this.pending.delete(oldest.id);
|
|
208
335
|
this.stats.totalFailed++;
|
|
209
|
-
this.log?.warn(
|
|
336
|
+
this.log?.warn(`${this.logPrefix} Evicted oldest pending: emitId=${oldest.id}, msgId=${oldest.msgId}`);
|
|
210
337
|
oldest.resolve(false);
|
|
211
338
|
}
|
|
212
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* 生成 emitId,同时用作 pending Map 的 key、ACK 回路的 pendingKey 及 idempotencyKey。
|
|
342
|
+
*
|
|
343
|
+
* 格式:`_re_<16位毫秒时间戳>_<12位自增序号>`,例:`_re_0001776656562000_000000000042`
|
|
344
|
+
*
|
|
345
|
+
* 设计约束:
|
|
346
|
+
* - 固定宽度十进制:保证字典序 == 生成顺序
|
|
347
|
+
* - 每次 emitWithAck 调用生成唯一 id,同一次 emit 的所有重试共用同一 id
|
|
348
|
+
* - 注入为 data.idempotencyKey,NativeSocket 优先取此字段作为 pendingKey
|
|
349
|
+
*/
|
|
213
350
|
generateEmitId() {
|
|
214
|
-
|
|
351
|
+
const ts = Date.now().toString().padStart(16, "0");
|
|
352
|
+
const seq = (this.idCounter++).toString().padStart(12, "0");
|
|
353
|
+
return `_re_${ts}_${seq}`;
|
|
215
354
|
}
|
|
216
355
|
}
|
|
217
|
-
//# sourceMappingURL=reliable-emitter.js.map
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — 文本增量计算器 (DeltaTracker)
|
|
3
|
+
*
|
|
4
|
+
* 核心作用:
|
|
5
|
+
* AI 引擎的 `onPartialReply` 回调输出的文本格式不确定 —— 有的模型输出全量快照(snapshot),
|
|
6
|
+
* 有的输出纯增量(delta),甚至可能在同一次对话中混合使用。
|
|
7
|
+
* DeltaTracker 会自动检测模式,始终输出 **纯增量文本**,方便直接追加到流式推送中。
|
|
8
|
+
*
|
|
9
|
+
* 算法概述:
|
|
10
|
+
* 1. 维护 `{ latest, mode, lastEmitted, localSnapshot }` 状态
|
|
11
|
+
* 2. 新文本到达时,判断其与 `latest` 的关系:
|
|
12
|
+
* - 如果新文本以 latest 为前缀 → snapshot 模式,截取增量
|
|
13
|
+
* - 如果新文本与 latest 有较长公共前缀 → snapshot 模式(可能是局部重传)
|
|
14
|
+
* - 如果上述均不满足 → delta 模式,直接追加
|
|
15
|
+
* 3. 各种边界处理:重复文本、前缀回退、模式切换等
|
|
16
|
+
*/
|
|
17
|
+
// ============================================================
|
|
18
|
+
// 公共工具
|
|
19
|
+
// ============================================================
|
|
20
|
+
/** 计算两个字符串的最长公共前缀长度 */
|
|
21
|
+
function longestCommonPrefixLength(a, b) {
|
|
22
|
+
const len = Math.min(a.length, b.length);
|
|
23
|
+
let i = 0;
|
|
24
|
+
while (i < len && a[i] === b[i]) {
|
|
25
|
+
i += 1;
|
|
26
|
+
}
|
|
27
|
+
return i;
|
|
28
|
+
}
|
|
29
|
+
// ============================================================
|
|
30
|
+
// 核心 API
|
|
31
|
+
// ============================================================
|
|
32
|
+
/**
|
|
33
|
+
* 创建一个新的增量追踪器状态。
|
|
34
|
+
*/
|
|
35
|
+
export function createDeltaTrackerState() {
|
|
36
|
+
return {
|
|
37
|
+
latest: "",
|
|
38
|
+
mode: "unknown",
|
|
39
|
+
lastEmitted: "",
|
|
40
|
+
localSnapshot: undefined,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 将传入的文本(可能是快照或增量)转换为纯增量文本。
|
|
45
|
+
*
|
|
46
|
+
* @param state - 增量追踪器状态(会被就地修改)
|
|
47
|
+
* @param text - AI 引擎传入的文本
|
|
48
|
+
* @returns 需要追加发送的增量文本;如果无新增量则返回 `undefined`
|
|
49
|
+
*/
|
|
50
|
+
export function toStreamDeltaText(state, text) {
|
|
51
|
+
if (typeof text !== "string" || text.length === 0)
|
|
52
|
+
return undefined;
|
|
53
|
+
const incoming = text;
|
|
54
|
+
const previous = state.latest;
|
|
55
|
+
const currentMode = state.mode ?? "unknown";
|
|
56
|
+
// ── 首次接收 ──
|
|
57
|
+
if (!previous) {
|
|
58
|
+
state.latest = incoming;
|
|
59
|
+
state.mode = "unknown";
|
|
60
|
+
state.lastEmitted = incoming;
|
|
61
|
+
state.localSnapshot = undefined;
|
|
62
|
+
return incoming;
|
|
63
|
+
}
|
|
64
|
+
// ── 完全相同 → 无增量 ──
|
|
65
|
+
if (incoming === previous) {
|
|
66
|
+
state.localSnapshot = undefined;
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
// ── 新文本以 previous 为前缀 → snapshot 模式 ──
|
|
70
|
+
if (incoming.startsWith(previous)) {
|
|
71
|
+
state.latest = incoming;
|
|
72
|
+
state.mode = "snapshot";
|
|
73
|
+
const delta = incoming.slice(previous.length);
|
|
74
|
+
state.localSnapshot = undefined;
|
|
75
|
+
if (delta.length > 0) {
|
|
76
|
+
state.lastEmitted = delta;
|
|
77
|
+
return delta;
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
// ── 部分公共前缀分析 ──
|
|
82
|
+
const commonLen = longestCommonPrefixLength(previous, incoming);
|
|
83
|
+
if (incoming.length - previous.length > 0 &&
|
|
84
|
+
commonLen > 0 &&
|
|
85
|
+
(currentMode === "snapshot" ||
|
|
86
|
+
commonLen >= Math.max(8, Math.floor(0.75 * previous.length)) ||
|
|
87
|
+
previous.length >= 64 ||
|
|
88
|
+
incoming.length >= 128 ||
|
|
89
|
+
incoming.length >= 2 * previous.length)) {
|
|
90
|
+
state.latest = incoming;
|
|
91
|
+
state.mode = "snapshot";
|
|
92
|
+
const delta = incoming.slice(commonLen);
|
|
93
|
+
state.localSnapshot = undefined;
|
|
94
|
+
if (delta.length > 0) {
|
|
95
|
+
state.lastEmitted = delta;
|
|
96
|
+
return delta;
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
// ── localSnapshot 追踪(delta 模式下的累计快照校验) ──
|
|
101
|
+
if (typeof state.localSnapshot === "string" && state.localSnapshot.length > 0) {
|
|
102
|
+
if (incoming === state.localSnapshot) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
if (incoming.startsWith(state.localSnapshot)) {
|
|
106
|
+
const delta = incoming.slice(state.localSnapshot.length);
|
|
107
|
+
state.latest = `${previous}${delta}`;
|
|
108
|
+
state.mode = "snapshot";
|
|
109
|
+
state.localSnapshot = incoming;
|
|
110
|
+
if (delta.length > 0) {
|
|
111
|
+
state.lastEmitted = delta;
|
|
112
|
+
return delta;
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
state.localSnapshot = undefined;
|
|
117
|
+
}
|
|
118
|
+
// ── 前缀回退(新文本是旧文本的前缀)→ 忽略 ──
|
|
119
|
+
if (previous.startsWith(incoming)) {
|
|
120
|
+
if (currentMode === "snapshot") {
|
|
121
|
+
state.latest = incoming;
|
|
122
|
+
}
|
|
123
|
+
state.localSnapshot = undefined;
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
// ── snapshot 模式下的重复增量检测 ──
|
|
127
|
+
if (currentMode === "snapshot" &&
|
|
128
|
+
typeof state.lastEmitted === "string" &&
|
|
129
|
+
incoming === state.lastEmitted &&
|
|
130
|
+
previous.endsWith(incoming)) {
|
|
131
|
+
state.localSnapshot = undefined;
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
// ── 兜底:视为 delta 模式,直接追加 ──
|
|
135
|
+
state.latest = `${previous}${incoming}`;
|
|
136
|
+
state.mode = "delta";
|
|
137
|
+
state.lastEmitted = incoming;
|
|
138
|
+
state.localSnapshot = incoming;
|
|
139
|
+
return incoming;
|
|
140
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — 流式输出模块
|
|
3
|
+
*
|
|
4
|
+
* 统一导出流式输出相关的类型、工具和分发器。
|
|
5
|
+
*
|
|
6
|
+
* 使用方式:
|
|
7
|
+
* import { createStreamReplyConfig } from "./streaming/index.js";
|
|
8
|
+
*/
|
|
9
|
+
// 增量计算器
|
|
10
|
+
export { createDeltaTrackerState, toStreamDeltaText } from "./delta-tracker.js";
|
|
11
|
+
// 真流式回复配置(dispatcher + replyOptions,用于 dispatchReplyFromConfig)
|
|
12
|
+
export { createStreamReplyConfig } from "./stream-reply-sink.js";
|