model-action 2.2.8 → 2.3.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/dist/modules/Action.d.ts +17 -10
- package/dist/modules/Action.d.ts.map +1 -1
- package/dist/modules/Action.js +57 -83
- package/dist/modules/Action.js.map +1 -1
- package/dist/modules/Init.js +1 -1
- package/dist/modules/Init.js.map +1 -1
- package/package.json +1 -1
- package/src/modules/Action.ts +75 -86
- package/src/modules/Init.ts +1 -1
package/dist/modules/Action.d.ts
CHANGED
|
@@ -6,11 +6,21 @@ export interface SendParam {
|
|
|
6
6
|
[key: string]: any;
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
|
+
/** 三维返回的原始消息体 */
|
|
10
|
+
export interface IncomingRawMessage {
|
|
11
|
+
cmd?: string;
|
|
12
|
+
data: any;
|
|
13
|
+
requestId?: string;
|
|
14
|
+
chunkIndex?: number | string;
|
|
15
|
+
chunkNum?: number | string;
|
|
16
|
+
message?: string;
|
|
17
|
+
code?: string | number;
|
|
18
|
+
}
|
|
9
19
|
export declare class Action {
|
|
10
20
|
private static pendingRequests;
|
|
11
21
|
private static onLog?;
|
|
12
|
-
/**
|
|
13
|
-
private static
|
|
22
|
+
/** 正在组装的分包,key 为 requestId,支持多条分包流并行 */
|
|
23
|
+
private static chunkAssemblies;
|
|
14
24
|
private static defaultTimeout;
|
|
15
25
|
static setOnLog(onLog?: (...args: any[]) => void): void;
|
|
16
26
|
/**
|
|
@@ -22,16 +32,13 @@ export declare class Action {
|
|
|
22
32
|
* 注意:三维系统保证在响应中返回 requestId,因此通过 requestId 精确匹配请求
|
|
23
33
|
* @param responseData 响应数据,必须包含 requestId 字段
|
|
24
34
|
*/
|
|
35
|
+
private static hasChunkFields;
|
|
25
36
|
/**
|
|
26
|
-
*
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* 处理 peer-stream 收到的一条原始消息(支持未分包 JSON 与 -S/-I/-E 分包)
|
|
31
|
-
* @param raw 字符串:整段 JSON,或以 -S / -I / -E 开头的分包片段
|
|
32
|
-
* @param onMessage 与 Init 中一致的业务回调(收到完整一条 JSON 后调用一次)
|
|
37
|
+
* 处理 peer-stream 收到的一条原始消息(对象格式;可选 chunkIndex/chunkNum 分包)
|
|
38
|
+
* @param raw 三维消息对象,无分包时 data 为 JSON 对象;有分包时 data 为字符串片段
|
|
39
|
+
* @param onMessage 与 Init 中一致的业务回调(拼包完成或单包时,对 data 解析结果调用一次)
|
|
33
40
|
*/
|
|
34
|
-
static handleIncomingRawMessage(raw:
|
|
41
|
+
static handleIncomingRawMessage(raw: object, onMessage?: (data: any) => void): void;
|
|
35
42
|
static handleResponse(responseData: any): void;
|
|
36
43
|
/**
|
|
37
44
|
* 发送到model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Action.d.ts","sourceRoot":"","sources":["../../src/modules/Action.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE;QACF,MAAM,EAAE,MAAM,CAAC;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,CAAC;CACL;
|
|
1
|
+
{"version":3,"file":"Action.d.ts","sourceRoot":"","sources":["../../src/modules/Action.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE;QACF,MAAM,EAAE,MAAM,CAAC;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,CAAC;CACL;AASD,iBAAiB;AACjB,MAAM,WAAW,kBAAkB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAQD,qBAAa,MAAM;IAEf,OAAO,CAAC,MAAM,CAAC,eAAe,CAAqC;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAA2B;IAEhD,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAyC;IAGvE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;IAEtC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI;IAIhD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAIhC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAK7B;;;;OAIG;IACH,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI;IA2E5E,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG;IAgBvC;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,SAAS,EAChC,KAAK,EAAE,CAAC,EACR,GAAG,GAAE,MAAW,EAChB,OAAO,GAAE,MAA4B,GACtC,OAAO,CAAC,GAAG,CAAC;CAwClB"}
|
package/dist/modules/Action.js
CHANGED
|
@@ -13,107 +13,81 @@ export class Action {
|
|
|
13
13
|
* 注意:三维系统保证在响应中返回 requestId,因此通过 requestId 精确匹配请求
|
|
14
14
|
* @param responseData 响应数据,必须包含 requestId 字段
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
static tryExtractRequestId(jsonPrefix) {
|
|
20
|
-
const m = jsonPrefix.match(/"requestId"\s*:\s*"([^"]+)"/);
|
|
21
|
-
return m ? m[1] : null;
|
|
16
|
+
static hasChunkFields(msg) {
|
|
17
|
+
return msg.chunkIndex !== undefined && msg.chunkIndex !== null
|
|
18
|
+
&& msg.chunkNum !== undefined && msg.chunkNum !== null;
|
|
22
19
|
}
|
|
23
20
|
/**
|
|
24
|
-
* 处理 peer-stream
|
|
25
|
-
* @param raw
|
|
26
|
-
* @param onMessage 与 Init
|
|
21
|
+
* 处理 peer-stream 收到的一条原始消息(对象格式;可选 chunkIndex/chunkNum 分包)
|
|
22
|
+
* @param raw 三维消息对象,无分包时 data 为 JSON 对象;有分包时 data 为字符串片段
|
|
23
|
+
* @param onMessage 与 Init 中一致的业务回调(拼包完成或单包时,对 data 解析结果调用一次)
|
|
27
24
|
*/
|
|
28
25
|
static handleIncomingRawMessage(raw, onMessage) {
|
|
29
|
-
var _a, _b, _c, _d, _e
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
var _a, _b, _c, _d, _e;
|
|
27
|
+
const msg = raw;
|
|
28
|
+
if (!this.hasChunkFields(msg)) {
|
|
29
|
+
const data = msg.data;
|
|
32
30
|
this.handleResponse(data);
|
|
33
31
|
onMessage === null || onMessage === void 0 ? void 0 : onMessage(data);
|
|
32
|
+
(_a = this.onLog) === null || _a === void 0 ? void 0 : _a.call(this, {
|
|
33
|
+
content: `收到三维消息: ${JSON.stringify(data)}`,
|
|
34
|
+
operTime: +new Date().getTime(),
|
|
35
|
+
});
|
|
34
36
|
return;
|
|
35
37
|
}
|
|
36
|
-
const
|
|
37
|
-
if (!
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
data = JSON.parse(raw);
|
|
41
|
-
}
|
|
42
|
-
catch (e) {
|
|
43
|
-
console.error('解析消息失败:', e);
|
|
44
|
-
(_a = this.onLog) === null || _a === void 0 ? void 0 : _a.call(this, {
|
|
45
|
-
content: `解析消息失败: ${e}`,
|
|
46
|
-
operTime: +new Date().getTime(),
|
|
47
|
-
});
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
this.handleResponse(data);
|
|
51
|
-
onMessage === null || onMessage === void 0 ? void 0 : onMessage(data);
|
|
38
|
+
const requestId = msg.requestId;
|
|
39
|
+
if (!requestId) {
|
|
40
|
+
console.error('分包消息缺少 requestId');
|
|
52
41
|
(_b = this.onLog) === null || _b === void 0 ? void 0 : _b.call(this, {
|
|
53
|
-
content:
|
|
42
|
+
content: '分包消息缺少 requestId',
|
|
54
43
|
operTime: +new Date().getTime(),
|
|
55
44
|
});
|
|
56
45
|
return;
|
|
57
46
|
}
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
console.warn('分包消息: 收到新的 -S,丢弃未拼完的上一包');
|
|
63
|
-
(_c = this.onLog) === null || _c === void 0 ? void 0 : _c.call(this, {
|
|
64
|
-
content: `分包消息: 收到新的 -S,丢弃未拼完的上一包`,
|
|
65
|
-
operTime: +new Date().getTime(),
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
this.chunkAssembly = { buffer: body, requestId: this.tryExtractRequestId(body) };
|
|
47
|
+
const chunkIndex = Number(msg.chunkIndex);
|
|
48
|
+
const chunkNum = Number(msg.chunkNum);
|
|
49
|
+
if (!Number.isFinite(chunkIndex) || !Number.isFinite(chunkNum) || chunkNum < 1) {
|
|
50
|
+
console.error('分包消息 chunkIndex/chunkNum 无效:', msg.chunkIndex, msg.chunkNum);
|
|
69
51
|
return;
|
|
70
52
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
this.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
53
|
+
const fragment = typeof msg.data === 'string' ? msg.data : String((_c = msg.data) !== null && _c !== void 0 ? _c : '');
|
|
54
|
+
let state = this.chunkAssemblies.get(requestId);
|
|
55
|
+
if (!state) {
|
|
56
|
+
state = { chunks: new Map(), chunkNum };
|
|
57
|
+
this.chunkAssemblies.set(requestId, state);
|
|
58
|
+
}
|
|
59
|
+
else if (state.chunkNum !== chunkNum) {
|
|
60
|
+
console.warn(`分包消息 requestId=${requestId}: chunkNum 不一致,重置组装`);
|
|
61
|
+
state = { chunks: new Map(), chunkNum };
|
|
62
|
+
this.chunkAssemblies.set(requestId, state);
|
|
63
|
+
}
|
|
64
|
+
state.chunks.set(chunkIndex, fragment);
|
|
65
|
+
if (state.chunks.size < chunkNum) {
|
|
84
66
|
return;
|
|
85
67
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
this.
|
|
98
|
-
|
|
99
|
-
try {
|
|
100
|
-
data = JSON.parse(fullJson);
|
|
101
|
-
}
|
|
102
|
-
catch (e) {
|
|
103
|
-
console.error('分包消息 JSON 解析失败:', e);
|
|
104
|
-
(_f = this.onLog) === null || _f === void 0 ? void 0 : _f.call(this, {
|
|
105
|
-
content: `分包消息 JSON 解析失败: ${e}`,
|
|
106
|
-
operTime: +new Date().getTime(),
|
|
107
|
-
});
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
this.handleResponse(data);
|
|
111
|
-
onMessage === null || onMessage === void 0 ? void 0 : onMessage(data);
|
|
112
|
-
(_g = this.onLog) === null || _g === void 0 ? void 0 : _g.call(this, {
|
|
113
|
-
content: `收到三维分包消息: ${JSON.stringify(data)}`,
|
|
68
|
+
const fullJson = [...state.chunks.entries()]
|
|
69
|
+
.sort((a, b) => a[0] - b[0])
|
|
70
|
+
.map(([, part]) => part)
|
|
71
|
+
.join('');
|
|
72
|
+
this.chunkAssemblies.delete(requestId);
|
|
73
|
+
let data;
|
|
74
|
+
try {
|
|
75
|
+
data = JSON.parse(fullJson);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.error('分包消息 JSON 解析失败:', e);
|
|
79
|
+
(_d = this.onLog) === null || _d === void 0 ? void 0 : _d.call(this, {
|
|
80
|
+
content: `分包消息 JSON 解析失败: ${e}`,
|
|
114
81
|
operTime: +new Date().getTime(),
|
|
115
82
|
});
|
|
83
|
+
return;
|
|
116
84
|
}
|
|
85
|
+
this.handleResponse(data);
|
|
86
|
+
onMessage === null || onMessage === void 0 ? void 0 : onMessage(data);
|
|
87
|
+
(_e = this.onLog) === null || _e === void 0 ? void 0 : _e.call(this, {
|
|
88
|
+
content: `收到三维分包消息: ${JSON.stringify(data)}`,
|
|
89
|
+
operTime: +new Date().getTime(),
|
|
90
|
+
});
|
|
117
91
|
}
|
|
118
92
|
static handleResponse(responseData) {
|
|
119
93
|
// 通过 requestId 精确匹配请求(三维系统保证返回 requestId)
|
|
@@ -174,8 +148,8 @@ export class Action {
|
|
|
174
148
|
}
|
|
175
149
|
// 存储待处理的请求,key 为 requestId
|
|
176
150
|
Action.pendingRequests = new Map();
|
|
177
|
-
/**
|
|
178
|
-
Action.
|
|
151
|
+
/** 正在组装的分包,key 为 requestId,支持多条分包流并行 */
|
|
152
|
+
Action.chunkAssemblies = new Map();
|
|
179
153
|
// 默认超时时间(毫秒)
|
|
180
154
|
Action.defaultTimeout = 10000;
|
|
181
155
|
//# sourceMappingURL=Action.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Action.js","sourceRoot":"","sources":["../../src/modules/Action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Action.js","sourceRoot":"","sources":["../../src/modules/Action.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/Init.js
CHANGED
|
@@ -34,7 +34,7 @@ export class InitAction extends Action {
|
|
|
34
34
|
if (ps.registerMouseHoverEvents) {
|
|
35
35
|
ps.registerMouseHoverEvents();
|
|
36
36
|
}
|
|
37
|
-
// 监听消息事件(含三维大包
|
|
37
|
+
// 监听消息事件(含三维大包 chunkIndex/chunkNum 分包拼包后,再 handleResponse + onMessage)
|
|
38
38
|
ps.addEventListener("message", (e) => {
|
|
39
39
|
try {
|
|
40
40
|
Action.handleIncomingRawMessage(e.detail, options.onMessage);
|
package/dist/modules/Init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Init.js","sourceRoot":"","sources":["../../src/modules/Init.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,oCAAoC;AACpC,OAAO,mBAAmB,CAAC;AAmB3B,MAAM,OAAO,UAAW,SAAQ,MAAM;IAClC;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,OAAyB;QACtC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,0BAA0B;QAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAQ,CAAC;QAEzE,OAAO;QACP,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QACxB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,gBAAgB,GAAG,WAAW,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC;QAClC,EAAE,CAAC,KAAK,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACvC,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACtB,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;QACrB,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAE/B,oBAAoB;QACpB,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAEtB,kBAAkB;QAClB,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAElC,YAAY;QACZ,IAAI,EAAE,CAAC,sBAAsB,EAAE,CAAC;YAC5B,EAAE,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,EAAE,CAAC,wBAAwB,EAAE,CAAC;YAC9B,EAAE,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"Init.js","sourceRoot":"","sources":["../../src/modules/Init.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,oCAAoC;AACpC,OAAO,mBAAmB,CAAC;AAmB3B,MAAM,OAAO,UAAW,SAAQ,MAAM;IAClC;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,OAAyB;QACtC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,0BAA0B;QAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAQ,CAAC;QAEzE,OAAO;QACP,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QACxB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,gBAAgB,GAAG,WAAW,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC;QAClC,EAAE,CAAC,KAAK,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACvC,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACtB,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;QACrB,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAE/B,oBAAoB;QACpB,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAEtB,kBAAkB;QAClB,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAElC,YAAY;QACZ,IAAI,EAAE,CAAC,sBAAsB,EAAE,CAAC;YAC5B,EAAE,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,EAAE,CAAC,wBAAwB,EAAE,CAAC;YAC9B,EAAE,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC;QAED,uEAAuE;QACvE,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAM,EAAE,EAAE;YACtC,IAAI,CAAC;gBACD,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,YAAY;QACZ,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,GAAG,EAAE;;YACvC,IAAI,EAAE,EAAE,CAAC;gBACL,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;gBAC5B,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;gBACxB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7B,CAAC;YACD,MAAA,OAAO,CAAC,gBAAgB,uDAAI,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,WAAW;QACX,IAAI,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACjC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAe,EAAE,EAAE;gBAClD,IAAI,CAAC;oBACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAChC,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBAC9B,OAAO,CAAC,aAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACrC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,sBAAsB;gBAC1B,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,WAAW;QACX,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;gBAChC,OAAO,CAAC,SAAU,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC;CACJ"}
|
package/package.json
CHANGED
package/src/modules/Action.ts
CHANGED
|
@@ -15,10 +15,21 @@ interface PendingRequest {
|
|
|
15
15
|
timeout: ReturnType<typeof setTimeout>;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
interface
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
/** 三维返回的原始消息体 */
|
|
19
|
+
export interface IncomingRawMessage {
|
|
20
|
+
cmd?: string;
|
|
21
|
+
data: any;
|
|
22
|
+
requestId?: string;
|
|
23
|
+
chunkIndex?: number | string;
|
|
24
|
+
chunkNum?: number | string;
|
|
25
|
+
message?: string;
|
|
26
|
+
code?: string | number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** 按 requestId 组装分包:chunkIndex 为序号,chunkNum 为总片数,data 为字符串片段 */
|
|
30
|
+
interface ChunkAssemblyState {
|
|
31
|
+
chunks: Map<number, string>;
|
|
32
|
+
chunkNum: number;
|
|
22
33
|
}
|
|
23
34
|
|
|
24
35
|
export class Action {
|
|
@@ -26,8 +37,8 @@ export class Action {
|
|
|
26
37
|
private static pendingRequests = new Map<string, PendingRequest>();
|
|
27
38
|
private static onLog?: (...args: any[]) => void;
|
|
28
39
|
|
|
29
|
-
/**
|
|
30
|
-
private static
|
|
40
|
+
/** 正在组装的分包,key 为 requestId,支持多条分包流并行 */
|
|
41
|
+
private static chunkAssemblies = new Map<string, ChunkAssemblyState>();
|
|
31
42
|
|
|
32
43
|
// 默认超时时间(毫秒)
|
|
33
44
|
private static defaultTimeout = 10000;
|
|
@@ -48,40 +59,21 @@ export class Action {
|
|
|
48
59
|
* 注意:三维系统保证在响应中返回 requestId,因此通过 requestId 精确匹配请求
|
|
49
60
|
* @param responseData 响应数据,必须包含 requestId 字段
|
|
50
61
|
*/
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
private static tryExtractRequestId(jsonPrefix: string): string | null {
|
|
55
|
-
const m = jsonPrefix.match(/"requestId"\s*:\s*"([^"]+)"/);
|
|
56
|
-
return m ? m[1] : null;
|
|
62
|
+
private static hasChunkFields(msg: IncomingRawMessage): boolean {
|
|
63
|
+
return msg.chunkIndex !== undefined && msg.chunkIndex !== null
|
|
64
|
+
&& msg.chunkNum !== undefined && msg.chunkNum !== null;
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
/**
|
|
60
|
-
* 处理 peer-stream
|
|
61
|
-
* @param raw
|
|
62
|
-
* @param onMessage 与 Init
|
|
68
|
+
* 处理 peer-stream 收到的一条原始消息(对象格式;可选 chunkIndex/chunkNum 分包)
|
|
69
|
+
* @param raw 三维消息对象,无分包时 data 为 JSON 对象;有分包时 data 为字符串片段
|
|
70
|
+
* @param onMessage 与 Init 中一致的业务回调(拼包完成或单包时,对 data 解析结果调用一次)
|
|
63
71
|
*/
|
|
64
|
-
static handleIncomingRawMessage(raw:
|
|
65
|
-
|
|
66
|
-
const data = raw as any;
|
|
67
|
-
this.handleResponse(data);
|
|
68
|
-
onMessage?.(data);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
72
|
+
static handleIncomingRawMessage(raw: object, onMessage?: (data: any) => void) {
|
|
73
|
+
const msg = raw as IncomingRawMessage;
|
|
71
74
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
let data: any;
|
|
75
|
-
try {
|
|
76
|
-
data = JSON.parse(raw);
|
|
77
|
-
} catch (e) {
|
|
78
|
-
console.error('解析消息失败:', e);
|
|
79
|
-
this.onLog?.({
|
|
80
|
-
content: `解析消息失败: ${e}`,
|
|
81
|
-
operTime: +new Date().getTime(),
|
|
82
|
-
});
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
75
|
+
if (!this.hasChunkFields(msg)) {
|
|
76
|
+
const data = msg.data;
|
|
85
77
|
this.handleResponse(data);
|
|
86
78
|
onMessage?.(data);
|
|
87
79
|
this.onLog?.({
|
|
@@ -91,68 +83,65 @@ export class Action {
|
|
|
91
83
|
return;
|
|
92
84
|
}
|
|
93
85
|
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
content: `分包消息: 收到新的 -S,丢弃未拼完的上一包`,
|
|
102
|
-
operTime: +new Date().getTime(),
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
this.chunkAssembly = { buffer: body, requestId: this.tryExtractRequestId(body) };
|
|
86
|
+
const requestId = msg.requestId;
|
|
87
|
+
if (!requestId) {
|
|
88
|
+
console.error('分包消息缺少 requestId');
|
|
89
|
+
this.onLog?.({
|
|
90
|
+
content: '分包消息缺少 requestId',
|
|
91
|
+
operTime: +new Date().getTime(),
|
|
92
|
+
});
|
|
106
93
|
return;
|
|
107
94
|
}
|
|
108
95
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
content: `分包消息: 收到 -I 但缺少前置 -S`,
|
|
114
|
-
operTime: +new Date().getTime(),
|
|
115
|
-
});
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
this.chunkAssembly.buffer += body;
|
|
119
|
-
if (!this.chunkAssembly.requestId) {
|
|
120
|
-
this.chunkAssembly.requestId = this.tryExtractRequestId(this.chunkAssembly.buffer);
|
|
121
|
-
}
|
|
96
|
+
const chunkIndex = Number(msg.chunkIndex);
|
|
97
|
+
const chunkNum = Number(msg.chunkNum);
|
|
98
|
+
if (!Number.isFinite(chunkIndex) || !Number.isFinite(chunkNum) || chunkNum < 1) {
|
|
99
|
+
console.error('分包消息 chunkIndex/chunkNum 无效:', msg.chunkIndex, msg.chunkNum);
|
|
122
100
|
return;
|
|
123
101
|
}
|
|
124
102
|
|
|
125
|
-
|
|
126
|
-
if (!this.chunkAssembly) {
|
|
127
|
-
console.error('分包消息: 收到 -E 但缺少前置 -S');
|
|
128
|
-
this.onLog?.({
|
|
129
|
-
content: `分包消息: 收到 -E 但缺少前置 -S`,
|
|
130
|
-
operTime: +new Date().getTime(),
|
|
131
|
-
});
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
this.chunkAssembly.buffer += body;
|
|
135
|
-
const fullJson = this.chunkAssembly.buffer;
|
|
136
|
-
this.chunkAssembly = null;
|
|
103
|
+
const fragment = typeof msg.data === 'string' ? msg.data : String(msg.data ?? '');
|
|
137
104
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
105
|
+
let state = this.chunkAssemblies.get(requestId);
|
|
106
|
+
if (!state) {
|
|
107
|
+
state = { chunks: new Map(), chunkNum };
|
|
108
|
+
this.chunkAssemblies.set(requestId, state);
|
|
109
|
+
} else if (state.chunkNum !== chunkNum) {
|
|
110
|
+
console.warn(`分包消息 requestId=${requestId}: chunkNum 不一致,重置组装`);
|
|
111
|
+
state = { chunks: new Map(), chunkNum };
|
|
112
|
+
this.chunkAssemblies.set(requestId, state);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
state.chunks.set(chunkIndex, fragment);
|
|
116
|
+
|
|
117
|
+
if (state.chunks.size < chunkNum) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const fullJson = [...state.chunks.entries()]
|
|
122
|
+
.sort((a, b) => a[0] - b[0])
|
|
123
|
+
.map(([, part]) => part)
|
|
124
|
+
.join('');
|
|
125
|
+
this.chunkAssemblies.delete(requestId);
|
|
126
|
+
|
|
127
|
+
let data: any;
|
|
128
|
+
try {
|
|
129
|
+
data = JSON.parse(fullJson);
|
|
130
|
+
} catch (e) {
|
|
131
|
+
console.error('分包消息 JSON 解析失败:', e);
|
|
151
132
|
this.onLog?.({
|
|
152
|
-
content:
|
|
133
|
+
content: `分包消息 JSON 解析失败: ${e}`,
|
|
153
134
|
operTime: +new Date().getTime(),
|
|
154
135
|
});
|
|
136
|
+
return;
|
|
155
137
|
}
|
|
138
|
+
|
|
139
|
+
this.handleResponse(data);
|
|
140
|
+
onMessage?.(data);
|
|
141
|
+
this.onLog?.({
|
|
142
|
+
content: `收到三维分包消息: ${JSON.stringify(data)}`,
|
|
143
|
+
operTime: +new Date().getTime(),
|
|
144
|
+
});
|
|
156
145
|
}
|
|
157
146
|
|
|
158
147
|
static handleResponse(responseData: any) {
|
package/src/modules/Init.ts
CHANGED
|
@@ -57,7 +57,7 @@ export class InitAction extends Action {
|
|
|
57
57
|
ps.registerMouseHoverEvents();
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
// 监听消息事件(含三维大包
|
|
60
|
+
// 监听消息事件(含三维大包 chunkIndex/chunkNum 分包拼包后,再 handleResponse + onMessage)
|
|
61
61
|
ps.addEventListener("message", (e: any) => {
|
|
62
62
|
try {
|
|
63
63
|
Action.handleIncomingRawMessage(e.detail, options.onMessage);
|