@netless/forge-rtm 0.1.3 → 0.1.4
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 +12 -0
- package/dist/ChunkedUpdateMessage.d.ts +20 -0
- package/dist/ChunkedUpdateMessage.d.ts.map +1 -0
- package/dist/RTM_2_1.d.ts +5 -7
- package/dist/RTM_2_1.d.ts.map +1 -1
- package/dist/RTM_2_2.d.ts +23 -0
- package/dist/RTM_2_2.d.ts.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/rtm-provider.esm.js +187 -1
- package/dist/rtm-provider.esm.js.map +4 -4
- package/dist/rtm-provider.js +187 -1
- package/dist/rtm-provider.js.map +4 -4
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## rtm-provider
|
|
2
|
+
|
|
3
|
+
`rtm-provider` 通过 `agora-rtm` 为 `@netless/forge-room` 提供实时消息服务。
|
|
4
|
+
|
|
5
|
+
此包会导出一系列适配 `agora-rtm` 各个版本的适配器类, 例如 `agora-rtm`2.1 对应使用 RTMProvider_2_1 类, `agora-rtm`2.2 对应使用 RTMProvider_2_2.
|
|
6
|
+
|
|
7
|
+
各版本注意事项如下:
|
|
8
|
+
|
|
9
|
+
### RTMProvider_2_1
|
|
10
|
+
|
|
11
|
+
* 掉线后重新 login 时, 需要再 login 后调用 `RTMProvider_2_1.resubscribe` 重新订阅频道。否则会发生只能发送消息无法接收消息的情况。
|
|
12
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type ChunkedUpdateMessageType = {
|
|
2
|
+
buf: Uint8Array;
|
|
3
|
+
index: number;
|
|
4
|
+
length: number;
|
|
5
|
+
session: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class ChunkedUpdateMessage {
|
|
8
|
+
static fromObject(obj: ChunkedUpdateMessageType, target: string, customType: string): ChunkedUpdateMessage;
|
|
9
|
+
static fromBuffer(buf: Uint8Array, target: string, customType: string): ChunkedUpdateMessage;
|
|
10
|
+
target: string;
|
|
11
|
+
customType: string;
|
|
12
|
+
buffer: Uint8Array;
|
|
13
|
+
private header;
|
|
14
|
+
get buf(): Uint8Array;
|
|
15
|
+
get index(): number;
|
|
16
|
+
get length(): number;
|
|
17
|
+
get session(): string;
|
|
18
|
+
private constructor();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ChunkedUpdateMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChunkedUpdateMessage.d.ts","sourceRoot":"","sources":["../src/ChunkedUpdateMessage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACnC,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB,CAAA;AAED,qBAAa,oBAAoB;IAE7B,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,oBAAoB;IA8B1G,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAW9D,MAAM,EAAG,MAAM,CAAC;IAChB,UAAU,EAAG,MAAM,CAAC;IACpB,MAAM,EAAG,UAAU,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAY;IAE1B,IAAW,GAAG,IAAI,UAAU,CAG3B;IAED,IAAW,KAAK,IAAI,MAAM,CAEzB;IAED,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,OAAO,IAAI,MAAM,CAK3B;IAED,OAAO;CACV"}
|
package/dist/RTM_2_1.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { SocketProvider, SocketProviderEvent } from "@netless/forge-room";
|
|
2
2
|
import EventEmitter from "eventemitter3";
|
|
3
|
-
import { RTMClient } from "agora-rtm";
|
|
4
|
-
export type ChunkedUpdateMessageType = {
|
|
5
|
-
buf: Uint8Array;
|
|
6
|
-
index: number;
|
|
7
|
-
length: number;
|
|
8
|
-
session: string;
|
|
9
|
-
};
|
|
3
|
+
import type { RTMClient } from "agora-rtm";
|
|
10
4
|
export declare class RTMProvider_2_1 extends EventEmitter<SocketProviderEvent> implements SocketProvider {
|
|
11
5
|
private rtmClient;
|
|
12
6
|
private roomId;
|
|
@@ -18,6 +12,10 @@ export declare class RTMProvider_2_1 extends EventEmitter<SocketProviderEvent> i
|
|
|
18
12
|
constructor(rtmClient: RTMClient);
|
|
19
13
|
private roomChannel;
|
|
20
14
|
private userChannel;
|
|
15
|
+
/**
|
|
16
|
+
* 重新订阅频道
|
|
17
|
+
*/
|
|
18
|
+
resubscribe(): Promise<void>;
|
|
21
19
|
initialize(roomId: string, userId: string): Promise<void>;
|
|
22
20
|
private handleRtmMessage;
|
|
23
21
|
private handleStatus;
|
package/dist/RTM_2_1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RTM_2_1.d.ts","sourceRoot":"","sources":["../src/RTM_2_1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAO,MAAM,qBAAqB,CAAC;AAC/E,OAAO,YAAY,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"RTM_2_1.d.ts","sourceRoot":"","sources":["../src/RTM_2_1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAO,MAAM,qBAAqB,CAAC;AAC/E,OAAO,YAAY,MAAM,eAAe,CAAC;AAIzC,OAAO,KAAK,EAAC,SAAS,EAAY,MAAM,WAAW,CAAC;AAIpD,qBAAa,eAAgB,SAAQ,YAAY,CAAC,mBAAmB,CAAE,YAAW,cAAc;IAE5F,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAU;IAExB,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,cAAc,CAA8B;IAEpD,OAAO,CAAC,UAAU,CAAa;gBAEZ,SAAS,EAAE,SAAS;IAKvC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACU,WAAW;IAYX,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCtE,OAAO,CAAC,gBAAgB,CAEtB;IAEF,OAAO,CAAC,YAAY,CAoBnB;IAED,OAAO,CAAC,cAAc,CAYpB;IAEF,OAAO,CAAC,mBAAmB;IAuBpB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW;IA2B1D,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;CAuBhD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SocketProvider, SocketProviderEvent } from "@netless/forge-room";
|
|
2
|
+
import EventEmitter from "eventemitter3";
|
|
3
|
+
import type { RTMClient } from "agora-rtm";
|
|
4
|
+
export declare class RTMProvider_2_2 extends EventEmitter<SocketProviderEvent> implements SocketProvider {
|
|
5
|
+
private rtmClient;
|
|
6
|
+
private roomId;
|
|
7
|
+
private userId;
|
|
8
|
+
private reconnectTimeout;
|
|
9
|
+
private chunkedMessages;
|
|
10
|
+
private cachedMessages;
|
|
11
|
+
private intervalId;
|
|
12
|
+
constructor(rtmClient: RTMClient);
|
|
13
|
+
private roomChannel;
|
|
14
|
+
private userChannel;
|
|
15
|
+
initialize(roomId: string, userId: string): Promise<void>;
|
|
16
|
+
private handleRtmMessage;
|
|
17
|
+
private handleStatus;
|
|
18
|
+
private handlePresence;
|
|
19
|
+
private receiveChunkMessage;
|
|
20
|
+
publish(buf: Uint8Array, customType: string, target?: string): void;
|
|
21
|
+
userList(): Promise<Set<string>>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=RTM_2_2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RTM_2_2.d.ts","sourceRoot":"","sources":["../src/RTM_2_2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAO,MAAM,qBAAqB,CAAC;AAC/E,OAAO,YAAY,MAAM,eAAe,CAAC;AAIzC,OAAO,KAAK,EAAC,SAAS,EAAY,MAAM,WAAW,CAAC;AAGpD,qBAAa,eAAgB,SAAQ,YAAY,CAAC,mBAAmB,CAAE,YAAW,cAAc;IAE5F,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAU;IAExB,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,cAAc,CAA8B;IAEpD,OAAO,CAAC,UAAU,CAAa;gBAEZ,SAAS,EAAE,SAAS;IAKvC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;IAON,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCtE,OAAO,CAAC,gBAAgB,CAEtB;IAEF,OAAO,CAAC,YAAY,CAqBnB;IAED,OAAO,CAAC,cAAc,CAYpB;IAEF,OAAO,CAAC,mBAAmB;IAuBpB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW;IA2B1D,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;CAuBhD"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/rtm-provider.esm.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { log } from "@netless/forge-room";
|
|
3
3
|
import EventEmitter from "eventemitter3";
|
|
4
4
|
import { v4 as uuidv4 } from "uuid";
|
|
5
|
+
|
|
6
|
+
// src/utils.ts
|
|
5
7
|
var cyrb53 = (str, seed = 0) => {
|
|
6
8
|
let h1 = 3735928559 ^ seed, h2 = 1103547991 ^ seed;
|
|
7
9
|
for (let i = 0, ch; i < str.length; i++) {
|
|
@@ -15,6 +17,8 @@ var cyrb53 = (str, seed = 0) => {
|
|
|
15
17
|
h2 ^= Math.imul(h1 ^ h1 >>> 13, 3266489909);
|
|
16
18
|
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
|
17
19
|
};
|
|
20
|
+
|
|
21
|
+
// src/ChunkedUpdateMessage.ts
|
|
18
22
|
var ChunkedUpdateMessage = class _ChunkedUpdateMessage {
|
|
19
23
|
static fromObject(obj, target, customType) {
|
|
20
24
|
const msg = new _ChunkedUpdateMessage();
|
|
@@ -69,6 +73,8 @@ var ChunkedUpdateMessage = class _ChunkedUpdateMessage {
|
|
|
69
73
|
constructor() {
|
|
70
74
|
}
|
|
71
75
|
};
|
|
76
|
+
|
|
77
|
+
// src/RTM_2_1.ts
|
|
72
78
|
var RTMProvider_2_1 = class extends EventEmitter {
|
|
73
79
|
rtmClient;
|
|
74
80
|
roomId;
|
|
@@ -90,6 +96,20 @@ var RTMProvider_2_1 = class extends EventEmitter {
|
|
|
90
96
|
}
|
|
91
97
|
return `${this.roomChannel()}_u_${userId}`;
|
|
92
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* 重新订阅频道
|
|
101
|
+
*/
|
|
102
|
+
async resubscribe() {
|
|
103
|
+
try {
|
|
104
|
+
await this.rtmClient.subscribe(this.roomChannel());
|
|
105
|
+
await this.rtmClient.subscribe(this.userChannel(this.userId));
|
|
106
|
+
} catch (error) {
|
|
107
|
+
this.emit("error", `rtm subscribe fail, ${error}`);
|
|
108
|
+
log(`rtm subscribe fail`, {
|
|
109
|
+
error: error.toString()
|
|
110
|
+
}, "error");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
93
113
|
async initialize(roomId, userId) {
|
|
94
114
|
window.clearInterval(this.intervalId);
|
|
95
115
|
this.roomId = roomId;
|
|
@@ -226,7 +246,173 @@ var RTMProvider_2_1 = class extends EventEmitter {
|
|
|
226
246
|
return output;
|
|
227
247
|
}
|
|
228
248
|
};
|
|
249
|
+
|
|
250
|
+
// src/RTM_2_2.ts
|
|
251
|
+
import { log as log2 } from "@netless/forge-room";
|
|
252
|
+
import EventEmitter2 from "eventemitter3";
|
|
253
|
+
import { v4 as uuidv42 } from "uuid";
|
|
254
|
+
var RTMProvider_2_2 = class extends EventEmitter2 {
|
|
255
|
+
rtmClient;
|
|
256
|
+
roomId;
|
|
257
|
+
userId;
|
|
258
|
+
reconnectTimeout = null;
|
|
259
|
+
chunkedMessages = /* @__PURE__ */ new Map();
|
|
260
|
+
cachedMessages = [];
|
|
261
|
+
intervalId = null;
|
|
262
|
+
constructor(rtmClient) {
|
|
263
|
+
super();
|
|
264
|
+
this.rtmClient = rtmClient;
|
|
265
|
+
}
|
|
266
|
+
roomChannel() {
|
|
267
|
+
return `r_${this.roomId}`;
|
|
268
|
+
}
|
|
269
|
+
userChannel(userId) {
|
|
270
|
+
if (userId.length > 16) {
|
|
271
|
+
userId = `${cyrb53(userId)}`;
|
|
272
|
+
}
|
|
273
|
+
return `${this.roomChannel()}_u_${userId}`;
|
|
274
|
+
}
|
|
275
|
+
async initialize(roomId, userId) {
|
|
276
|
+
window.clearInterval(this.intervalId);
|
|
277
|
+
this.roomId = roomId;
|
|
278
|
+
this.userId = userId;
|
|
279
|
+
this.rtmClient.addEventListener("message", this.handleRtmMessage);
|
|
280
|
+
this.rtmClient.addEventListener("presence", this.handlePresence);
|
|
281
|
+
this.rtmClient.addEventListener("status", this.handleStatus);
|
|
282
|
+
try {
|
|
283
|
+
await this.rtmClient.subscribe(this.roomChannel());
|
|
284
|
+
await this.rtmClient.subscribe(this.userChannel(this.userId));
|
|
285
|
+
} catch (error) {
|
|
286
|
+
this.emit("error", `rtm subscribe fail, ${error}`);
|
|
287
|
+
log2(`rtm subscribe fail`, {
|
|
288
|
+
error: error.toString(),
|
|
289
|
+
rtm: "2.2"
|
|
290
|
+
}, "error");
|
|
291
|
+
}
|
|
292
|
+
this.intervalId = setInterval(() => {
|
|
293
|
+
const msg = this.cachedMessages.shift();
|
|
294
|
+
if (msg) {
|
|
295
|
+
const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();
|
|
296
|
+
this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch((error) => {
|
|
297
|
+
log2(`rtm publish failed`, {
|
|
298
|
+
channel,
|
|
299
|
+
code: error.code,
|
|
300
|
+
rtm: "2.2"
|
|
301
|
+
}, "warning");
|
|
302
|
+
this.emit("error", `rtm publish fail, ${error}`);
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}, 32);
|
|
306
|
+
}
|
|
307
|
+
handleRtmMessage = (evt) => {
|
|
308
|
+
this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message, "", evt.customType), evt.publisher);
|
|
309
|
+
};
|
|
310
|
+
handleStatus = (connectionStatus) => {
|
|
311
|
+
log2(`rtm status update`, {
|
|
312
|
+
state: connectionStatus.state,
|
|
313
|
+
reason: connectionStatus.reason,
|
|
314
|
+
rtm: "2.2"
|
|
315
|
+
});
|
|
316
|
+
if (connectionStatus.state === "RECONNECTING" && this.reconnectTimeout === null) {
|
|
317
|
+
this.reconnectTimeout = window.setTimeout(() => {
|
|
318
|
+
this.emit("error", `reconnecting timeout`);
|
|
319
|
+
this.emit("connectionStatusChange", "DISCONNECTED");
|
|
320
|
+
}, 30 * 1e3);
|
|
321
|
+
} else if (connectionStatus.state === "CONNECTED") {
|
|
322
|
+
window.clearTimeout(this.reconnectTimeout);
|
|
323
|
+
this.emit("connectionStatusChange", "CONNECTED");
|
|
324
|
+
} else if (connectionStatus.state === "FAILED") {
|
|
325
|
+
window.clearTimeout(this.reconnectTimeout);
|
|
326
|
+
this.emit("error", `rtm connection failed, ${connectionStatus.reason}`);
|
|
327
|
+
this.emit("connectionStatusChange", "DISCONNECTED");
|
|
328
|
+
} else if (connectionStatus.state === "CONNECTING") {
|
|
329
|
+
this.emit("connectionStatusChange", "CONNECTING");
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
handlePresence = (evt) => {
|
|
333
|
+
if (evt.channelName === this.roomChannel()) {
|
|
334
|
+
if (evt.eventType === "REMOTE_JOIN") {
|
|
335
|
+
this.emit("userJoin", evt.publisher);
|
|
336
|
+
} else if (evt.eventType === "REMOTE_LEAVE") {
|
|
337
|
+
this.emit("userLeave", evt.publisher);
|
|
338
|
+
} else if (evt.eventType === "REMOTE_TIMEOUT") {
|
|
339
|
+
this.emit("userLeave", evt.publisher);
|
|
340
|
+
} else if (evt.eventType === "INTERVAL") {
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
receiveChunkMessage(msg, publisher) {
|
|
345
|
+
if (msg.length === 1) {
|
|
346
|
+
this.emit("message", msg.buf, publisher, msg.customType);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
const chunks = this.chunkedMessages.get(msg.session) || [];
|
|
350
|
+
chunks.push(msg);
|
|
351
|
+
if (chunks.length === msg.length) {
|
|
352
|
+
const buffer = chunks.sort((a, b) => a.index - b.index).reduce((result, next) => {
|
|
353
|
+
const buf = next.buf;
|
|
354
|
+
const output = new Uint8Array(result.length + buf.length);
|
|
355
|
+
output.set(result, 0);
|
|
356
|
+
output.set(buf, result.length);
|
|
357
|
+
return output;
|
|
358
|
+
}, new Uint8Array());
|
|
359
|
+
this.emit("message", buffer, publisher, msg.customType);
|
|
360
|
+
this.chunkedMessages.delete(msg.session);
|
|
361
|
+
} else {
|
|
362
|
+
this.chunkedMessages.set(msg.session, chunks);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
publish(buf, customType, target = "") {
|
|
366
|
+
const session = uuidv42();
|
|
367
|
+
const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;
|
|
368
|
+
if (size < 16) {
|
|
369
|
+
this.cachedMessages.push(ChunkedUpdateMessage.fromObject({
|
|
370
|
+
buf,
|
|
371
|
+
length: 1,
|
|
372
|
+
index: 0,
|
|
373
|
+
session
|
|
374
|
+
}, target, customType));
|
|
375
|
+
} else {
|
|
376
|
+
const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;
|
|
377
|
+
let len = Math.ceil(size / 16);
|
|
378
|
+
let index = 0;
|
|
379
|
+
while (index < len) {
|
|
380
|
+
this.cachedMessages.push(ChunkedUpdateMessage.fromObject({
|
|
381
|
+
buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),
|
|
382
|
+
length: len,
|
|
383
|
+
index,
|
|
384
|
+
session
|
|
385
|
+
}, target, customType));
|
|
386
|
+
index += 1;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
async userList() {
|
|
391
|
+
const output = /* @__PURE__ */ new Set();
|
|
392
|
+
const result = await this.rtmClient.presence.whoNow(this.roomChannel(), "MESSAGE", {
|
|
393
|
+
includedState: false
|
|
394
|
+
});
|
|
395
|
+
var nextPage = result.nextPage;
|
|
396
|
+
result.occupants.forEach((userInfo) => {
|
|
397
|
+
const { userId } = userInfo;
|
|
398
|
+
output.add(userId);
|
|
399
|
+
});
|
|
400
|
+
while (nextPage) {
|
|
401
|
+
const result2 = await this.rtmClient.presence.whoNow(this.roomChannel(), "MESSAGE", {
|
|
402
|
+
includedState: false,
|
|
403
|
+
page: nextPage
|
|
404
|
+
});
|
|
405
|
+
nextPage = result2.nextPage;
|
|
406
|
+
result2.occupants.forEach((userInfo) => {
|
|
407
|
+
const { userId } = userInfo;
|
|
408
|
+
output.add(userId);
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
return output;
|
|
412
|
+
}
|
|
413
|
+
};
|
|
229
414
|
export {
|
|
230
|
-
RTMProvider_2_1
|
|
415
|
+
RTMProvider_2_1,
|
|
416
|
+
RTMProvider_2_2
|
|
231
417
|
};
|
|
232
418
|
//# sourceMappingURL=rtm-provider.esm.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/RTM_2_1.ts"],
|
|
4
|
-
"sourcesContent": ["import { SocketProvider, SocketProviderEvent, log } from \"@netless/forge-room\";\nimport EventEmitter from \"eventemitter3\";\nimport {v4 as uuidv4} from \"uuid\";\n\nimport {RTMClient, RTMEvents} from \"agora-rtm\";\n\nconst cyrb53 = (str: string, seed = 0) => {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for(let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\n\nexport type ChunkedUpdateMessageType = {\n buf: Uint8Array;\n index: number;\n length: number;\n session: string;\n}\n\nclass ChunkedUpdateMessage {\n\n static fromObject(obj: ChunkedUpdateMessageType, target: string, customType: string): ChunkedUpdateMessage {\n const msg = new ChunkedUpdateMessage();\n msg.target = target;\n msg.customType = customType;\n\n const encoder = new TextEncoder();\n const sessionBuf = encoder.encode(obj.session);\n\n // header \u6309\u987A\u5E8F\u6307\u793A buf, session, target, customType \u90E8\u5206\u7684 uint8 \u957F\u5EA6\n msg.header = new DataView(new Uint8Array(10).buffer);\n\n msg.header.setUint32(0, obj.buf.length, false);\n msg.header.setUint32(4, sessionBuf.length, false);\n msg.header.setUint8(8, obj.index);\n msg.header.setUint8(9, obj.length);\n\n msg.buffer = new Uint8Array(\n obj.buf.length + sessionBuf.length + msg.header.buffer.byteLength\n );\n\n let len = 0;\n msg.buffer.set(new Uint8Array(msg.header.buffer), len);\n len += msg.header.buffer.byteLength;\n msg.buffer.set(obj.buf, len);\n len += obj.buf.length;\n msg.buffer.set(sessionBuf, len);\n\n return msg;\n }\n\n static fromBuffer(buf: Uint8Array, target: string, customType: string) {\n const msg = new ChunkedUpdateMessage();\n\n msg.header = new DataView(buf.slice(0, 10).buffer);\n msg.buffer = buf.slice(10);\n msg.target = target;\n msg.customType = customType;\n\n return msg;\n }\n\n public target!: string;\n public customType!: string;\n public buffer!: Uint8Array;\n private header!: DataView;\n\n public get buf(): Uint8Array {\n const len = this.header.getInt32(0);\n return this.buffer.slice(0, len);\n }\n\n public get index(): number {\n return this.header.getUint8(8);\n }\n\n public get length(): number {\n return this.header.getUint8(9);\n }\n\n public get session(): string {\n const start = this.header.getInt32(0);\n const sessionBuf = this.buffer.slice(start, start + this.header.getInt32(4));\n const textDecoder = new TextDecoder();\n return textDecoder.decode(sessionBuf);\n }\n\n private constructor() {}\n}\n\nexport class RTMProvider_2_1 extends EventEmitter<SocketProviderEvent> implements SocketProvider {\n\n private rtmClient!: RTMClient;\n private roomId!: string;\n private userId!: string;\n\n private reconnectTimeout: any = null;\n private chunkedMessages: Map<string, ChunkedUpdateMessage[]> = new Map();\n private cachedMessages: ChunkedUpdateMessage[] = [];\n\n private intervalId: any = null;\n\n public constructor(rtmClient: RTMClient) {\n super();\n this.rtmClient = rtmClient;\n }\n\n private roomChannel(): string {\n return `r_${this.roomId}`;\n }\n\n private userChannel(userId: string): string {\n if (userId.length > 16) {\n userId = `${cyrb53(userId)}`;\n }\n return `${this.roomChannel()}_u_${userId}`;\n }\n\n public async initialize(roomId: string, userId: string): Promise<void> {\n window.clearInterval(this.intervalId);\n this.roomId = roomId;\n this.userId = userId;\n this.rtmClient.addEventListener(\"message\", this.handleRtmMessage);\n this.rtmClient.addEventListener(\"presence\", this.handlePresence);\n // @ts-ignore\n this.rtmClient.addEventListener(\"status\", this.handleStatus);\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n }, \"error\");\n }\n this.intervalId = setInterval(() => {\n const msg = this.cachedMessages.shift();\n if (msg) {\n const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();\n this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch(error => {\n log(`rtm publish failed`, {\n channel,\n code: error.code\n }, \"warning\");\n this.emit(\"error\", `rtm publish fail, ${error}`);\n });\n }\n }, 32);\n }\n\n private handleRtmMessage = (evt: RTMEvents.MessageEvent) => {\n this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message as Uint8Array, \"\", evt.customType), evt.publisher);\n };\n\n private handleStatus = (connectionStatus: RTMEvents.RTMConnectionStatusChangeEvent) => {\n log(`rtm status update`, {\n state: connectionStatus.state,\n reason: connectionStatus.reason\n });\n if (connectionStatus.state === \"RECONNECTING\" && this.reconnectTimeout === null) {\n this.reconnectTimeout = window.setTimeout(() => {\n this.emit(\"error\", `reconnecting timeout`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n }, 30 * 1000);\n } else if (connectionStatus.state === \"CONNECTED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"connectionStatusChange\", \"CONNECTED\");\n } else if (connectionStatus.state === \"FAILED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"error\", `rtm connection failed, ${connectionStatus.reason}`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n } else if (connectionStatus.state === \"CONNECTING\") {\n this.emit(\"connectionStatusChange\", \"CONNECTING\");\n }\n }\n\n private handlePresence = (evt: RTMEvents.PresenceEvent) => {\n if (evt.channelName === this.roomChannel()) {\n if (evt.eventType === \"REMOTE_JOIN\") {\n this.emit(\"userJoin\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_LEAVE\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_TIMEOUT\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"INTERVAL\") {\n // evt.interval.join.users\n }\n }\n };\n\n private receiveChunkMessage(msg: ChunkedUpdateMessage, publisher: string) {\n if (msg.length === 1) {\n this.emit(\"message\", msg.buf, publisher, msg.customType);\n return;\n }\n const chunks = this.chunkedMessages.get(msg.session) || [];\n chunks.push(msg);\n if (chunks.length === msg.length) {\n const buffer = chunks.sort((a, b) => a.index - b.index)\n .reduce((result, next) => {\n const buf = next.buf;\n const output = new Uint8Array(result.length + buf.length);\n output.set(result, 0);\n output.set(buf, result.length);\n return output;\n }, new Uint8Array());\n this.emit(\"message\", buffer, publisher, msg.customType);\n this.chunkedMessages.delete(msg.session);\n } else {\n this.chunkedMessages.set(msg.session, chunks);\n }\n }\n\n public publish(buf: Uint8Array, customType: string, target: string = \"\") {\n const session = uuidv4();\n // \u6D88\u606F\u5305\u4F53\u79EF, \u5355\u4F4D kb\n const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;\n if (size < 16) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf,\n length: 1,\n index: 0,\n session\n }, target, customType));\n } else {\n const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;\n let len = Math.ceil(size / 16);\n let index = 0;\n while (index < len) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),\n length: len,\n index: index,\n session,\n }, target, customType));\n index += 1;\n }\n }\n }\n\n public async userList(): Promise<Set<string>> {\n const output = new Set<string>();\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n });\n var nextPage: string | null = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n while (nextPage) {\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n page: nextPage,\n });\n nextPage = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n }\n return output;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["result"]
|
|
3
|
+
"sources": ["../src/RTM_2_1.ts", "../src/utils.ts", "../src/ChunkedUpdateMessage.ts", "../src/RTM_2_2.ts"],
|
|
4
|
+
"sourcesContent": ["import { SocketProvider, SocketProviderEvent, log } from \"@netless/forge-room\";\nimport EventEmitter from \"eventemitter3\";\nimport {v4 as uuidv4} from \"uuid\";\nimport {cyrb53} from \"./utils\";\n\nimport type {RTMClient, RTMEvents} from \"agora-rtm\";\n\nimport {ChunkedUpdateMessage} from \"./ChunkedUpdateMessage\";\n\nexport class RTMProvider_2_1 extends EventEmitter<SocketProviderEvent> implements SocketProvider {\n\n private rtmClient!: RTMClient;\n private roomId!: string;\n private userId!: string;\n\n private reconnectTimeout: any = null;\n private chunkedMessages: Map<string, ChunkedUpdateMessage[]> = new Map();\n private cachedMessages: ChunkedUpdateMessage[] = [];\n\n private intervalId: any = null;\n\n public constructor(rtmClient: RTMClient) {\n super();\n this.rtmClient = rtmClient;\n }\n\n private roomChannel(): string {\n return `r_${this.roomId}`;\n }\n\n private userChannel(userId: string): string {\n if (userId.length > 16) {\n userId = `${cyrb53(userId)}`;\n }\n return `${this.roomChannel()}_u_${userId}`;\n }\n\n /**\n * \u91CD\u65B0\u8BA2\u9605\u9891\u9053\n */\n public async resubscribe() {\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n }, \"error\");\n }\n }\n\n public async initialize(roomId: string, userId: string): Promise<void> {\n window.clearInterval(this.intervalId);\n this.roomId = roomId;\n this.userId = userId;\n this.rtmClient.addEventListener(\"message\", this.handleRtmMessage);\n this.rtmClient.addEventListener(\"presence\", this.handlePresence);\n // @ts-ignore\n this.rtmClient.addEventListener(\"status\", this.handleStatus);\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n }, \"error\");\n }\n this.intervalId = setInterval(() => {\n const msg = this.cachedMessages.shift();\n if (msg) {\n const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();\n this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch(error => {\n log(`rtm publish failed`, {\n channel,\n code: error.code\n }, \"warning\");\n this.emit(\"error\", `rtm publish fail, ${error}`);\n });\n }\n }, 32);\n }\n\n private handleRtmMessage = (evt: RTMEvents.MessageEvent) => {\n this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message as Uint8Array, \"\", evt.customType), evt.publisher);\n };\n\n private handleStatus = (connectionStatus: RTMEvents.RTMConnectionStatusChangeEvent) => {\n log(`rtm status update`, {\n state: connectionStatus.state,\n reason: connectionStatus.reason\n });\n if (connectionStatus.state === \"RECONNECTING\" && this.reconnectTimeout === null) {\n this.reconnectTimeout = window.setTimeout(() => {\n this.emit(\"error\", `reconnecting timeout`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n }, 30 * 1000);\n } else if (connectionStatus.state === \"CONNECTED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"connectionStatusChange\", \"CONNECTED\");\n } else if (connectionStatus.state === \"FAILED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"error\", `rtm connection failed, ${connectionStatus.reason}`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n } else if (connectionStatus.state === \"CONNECTING\") {\n this.emit(\"connectionStatusChange\", \"CONNECTING\");\n }\n }\n\n private handlePresence = (evt: RTMEvents.PresenceEvent) => {\n if (evt.channelName === this.roomChannel()) {\n if (evt.eventType === \"REMOTE_JOIN\") {\n this.emit(\"userJoin\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_LEAVE\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_TIMEOUT\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"INTERVAL\") {\n // evt.interval.join.users\n }\n }\n };\n\n private receiveChunkMessage(msg: ChunkedUpdateMessage, publisher: string) {\n if (msg.length === 1) {\n this.emit(\"message\", msg.buf, publisher, msg.customType);\n return;\n }\n const chunks = this.chunkedMessages.get(msg.session) || [];\n chunks.push(msg);\n if (chunks.length === msg.length) {\n const buffer = chunks.sort((a, b) => a.index - b.index)\n .reduce((result, next) => {\n const buf = next.buf;\n const output = new Uint8Array(result.length + buf.length);\n output.set(result, 0);\n output.set(buf, result.length);\n return output;\n }, new Uint8Array());\n this.emit(\"message\", buffer, publisher, msg.customType);\n this.chunkedMessages.delete(msg.session);\n } else {\n this.chunkedMessages.set(msg.session, chunks);\n }\n }\n\n public publish(buf: Uint8Array, customType: string, target: string = \"\") {\n const session = uuidv4();\n // \u6D88\u606F\u5305\u4F53\u79EF, \u5355\u4F4D kb\n const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;\n if (size < 16) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf,\n length: 1,\n index: 0,\n session\n }, target, customType));\n } else {\n const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;\n let len = Math.ceil(size / 16);\n let index = 0;\n while (index < len) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),\n length: len,\n index: index,\n session,\n }, target, customType));\n index += 1;\n }\n }\n }\n\n public async userList(): Promise<Set<string>> {\n const output = new Set<string>();\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n });\n var nextPage: string | null = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n while (nextPage) {\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n page: nextPage,\n });\n nextPage = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n }\n return output;\n }\n}\n", "export const cyrb53 = (str: string, seed = 0) => {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for(let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};", "export type ChunkedUpdateMessageType = {\n buf: Uint8Array;\n index: number;\n length: number;\n session: string;\n}\n\nexport class ChunkedUpdateMessage {\n\n static fromObject(obj: ChunkedUpdateMessageType, target: string, customType: string): ChunkedUpdateMessage {\n const msg = new ChunkedUpdateMessage();\n msg.target = target;\n msg.customType = customType;\n\n const encoder = new TextEncoder();\n const sessionBuf = encoder.encode(obj.session);\n\n // header \u6309\u987A\u5E8F\u6307\u793A buf, session, target, customType \u90E8\u5206\u7684 uint8 \u957F\u5EA6\n msg.header = new DataView(new Uint8Array(10).buffer);\n\n msg.header.setUint32(0, obj.buf.length, false);\n msg.header.setUint32(4, sessionBuf.length, false);\n msg.header.setUint8(8, obj.index);\n msg.header.setUint8(9, obj.length);\n\n msg.buffer = new Uint8Array(\n obj.buf.length + sessionBuf.length + msg.header.buffer.byteLength\n );\n\n let len = 0;\n msg.buffer.set(new Uint8Array(msg.header.buffer), len);\n len += msg.header.buffer.byteLength;\n msg.buffer.set(obj.buf, len);\n len += obj.buf.length;\n msg.buffer.set(sessionBuf, len);\n\n return msg;\n }\n\n static fromBuffer(buf: Uint8Array, target: string, customType: string) {\n const msg = new ChunkedUpdateMessage();\n\n msg.header = new DataView(buf.slice(0, 10).buffer);\n msg.buffer = buf.slice(10);\n msg.target = target;\n msg.customType = customType;\n\n return msg;\n }\n\n public target!: string;\n public customType!: string;\n public buffer!: Uint8Array;\n private header!: DataView;\n\n public get buf(): Uint8Array {\n const len = this.header.getInt32(0);\n return this.buffer.slice(0, len);\n }\n\n public get index(): number {\n return this.header.getUint8(8);\n }\n\n public get length(): number {\n return this.header.getUint8(9);\n }\n\n public get session(): string {\n const start = this.header.getInt32(0);\n const sessionBuf = this.buffer.slice(start, start + this.header.getInt32(4));\n const textDecoder = new TextDecoder();\n return textDecoder.decode(sessionBuf);\n }\n\n private constructor() {}\n}", "import { SocketProvider, SocketProviderEvent, log } from \"@netless/forge-room\";\nimport EventEmitter from \"eventemitter3\";\nimport {v4 as uuidv4} from \"uuid\";\nimport {cyrb53} from \"./utils\";\n\nimport type {RTMClient, RTMEvents} from \"agora-rtm\";\nimport {ChunkedUpdateMessage} from \"./ChunkedUpdateMessage\";\n\nexport class RTMProvider_2_2 extends EventEmitter<SocketProviderEvent> implements SocketProvider {\n\n private rtmClient!: RTMClient;\n private roomId!: string;\n private userId!: string;\n\n private reconnectTimeout: any = null;\n private chunkedMessages: Map<string, ChunkedUpdateMessage[]> = new Map();\n private cachedMessages: ChunkedUpdateMessage[] = [];\n\n private intervalId: any = null;\n\n public constructor(rtmClient: RTMClient) {\n super();\n this.rtmClient = rtmClient;\n }\n\n private roomChannel(): string {\n return `r_${this.roomId}`;\n }\n\n private userChannel(userId: string): string {\n if (userId.length > 16) {\n userId = `${cyrb53(userId)}`;\n }\n return `${this.roomChannel()}_u_${userId}`;\n }\n\n public async initialize(roomId: string, userId: string): Promise<void> {\n window.clearInterval(this.intervalId);\n this.roomId = roomId;\n this.userId = userId;\n this.rtmClient.addEventListener(\"message\", this.handleRtmMessage);\n this.rtmClient.addEventListener(\"presence\", this.handlePresence);\n // @ts-ignore\n this.rtmClient.addEventListener(\"status\", this.handleStatus);\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n rtm: \"2.2\"\n }, \"error\");\n }\n this.intervalId = setInterval(() => {\n const msg = this.cachedMessages.shift();\n if (msg) {\n const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();\n this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch(error => {\n log(`rtm publish failed`, {\n channel,\n code: error.code,\n rtm: \"2.2\"\n }, \"warning\");\n this.emit(\"error\", `rtm publish fail, ${error}`);\n });\n }\n }, 32);\n }\n\n private handleRtmMessage = (evt: RTMEvents.MessageEvent) => {\n this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message as Uint8Array, \"\", evt.customType), evt.publisher);\n };\n\n private handleStatus = (connectionStatus: RTMEvents.RTMConnectionStatusChangeEvent) => {\n log(`rtm status update`, {\n state: connectionStatus.state,\n reason: connectionStatus.reason,\n rtm: \"2.2\"\n });\n if (connectionStatus.state === \"RECONNECTING\" && this.reconnectTimeout === null) {\n this.reconnectTimeout = window.setTimeout(() => {\n this.emit(\"error\", `reconnecting timeout`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n }, 30 * 1000);\n } else if (connectionStatus.state === \"CONNECTED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"connectionStatusChange\", \"CONNECTED\");\n } else if (connectionStatus.state === \"FAILED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"error\", `rtm connection failed, ${connectionStatus.reason}`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n } else if (connectionStatus.state === \"CONNECTING\") {\n this.emit(\"connectionStatusChange\", \"CONNECTING\");\n }\n }\n\n private handlePresence = (evt: RTMEvents.PresenceEvent) => {\n if (evt.channelName === this.roomChannel()) {\n if (evt.eventType === \"REMOTE_JOIN\") {\n this.emit(\"userJoin\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_LEAVE\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_TIMEOUT\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"INTERVAL\") {\n // evt.interval.join.users\n }\n }\n };\n\n private receiveChunkMessage(msg: ChunkedUpdateMessage, publisher: string) {\n if (msg.length === 1) {\n this.emit(\"message\", msg.buf, publisher, msg.customType);\n return;\n }\n const chunks = this.chunkedMessages.get(msg.session) || [];\n chunks.push(msg);\n if (chunks.length === msg.length) {\n const buffer = chunks.sort((a, b) => a.index - b.index)\n .reduce((result, next) => {\n const buf = next.buf;\n const output = new Uint8Array(result.length + buf.length);\n output.set(result, 0);\n output.set(buf, result.length);\n return output;\n }, new Uint8Array());\n this.emit(\"message\", buffer, publisher, msg.customType);\n this.chunkedMessages.delete(msg.session);\n } else {\n this.chunkedMessages.set(msg.session, chunks);\n }\n }\n\n public publish(buf: Uint8Array, customType: string, target: string = \"\") {\n const session = uuidv4();\n // \u6D88\u606F\u5305\u4F53\u79EF, \u5355\u4F4D kb\n const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;\n if (size < 16) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf,\n length: 1,\n index: 0,\n session\n }, target, customType));\n } else {\n const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;\n let len = Math.ceil(size / 16);\n let index = 0;\n while (index < len) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),\n length: len,\n index: index,\n session,\n }, target, customType));\n index += 1;\n }\n }\n }\n\n public async userList(): Promise<Set<string>> {\n const output = new Set<string>();\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n });\n var nextPage: string | null = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n while (nextPage) {\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n page: nextPage,\n });\n nextPage = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n }\n return output;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["result", "log", "EventEmitter", "uuidv4", "EventEmitter", "log", "uuidv4", "result"]
|
|
7
7
|
}
|
package/dist/rtm-provider.js
CHANGED
|
@@ -30,7 +30,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
|
-
RTMProvider_2_1: () => RTMProvider_2_1
|
|
33
|
+
RTMProvider_2_1: () => RTMProvider_2_1,
|
|
34
|
+
RTMProvider_2_2: () => RTMProvider_2_2
|
|
34
35
|
});
|
|
35
36
|
module.exports = __toCommonJS(src_exports);
|
|
36
37
|
|
|
@@ -38,6 +39,8 @@ module.exports = __toCommonJS(src_exports);
|
|
|
38
39
|
var import_forge_room = require("@netless/forge-room");
|
|
39
40
|
var import_eventemitter3 = __toESM(require("eventemitter3"), 1);
|
|
40
41
|
var import_uuid = require("uuid");
|
|
42
|
+
|
|
43
|
+
// src/utils.ts
|
|
41
44
|
var cyrb53 = (str, seed = 0) => {
|
|
42
45
|
let h1 = 3735928559 ^ seed, h2 = 1103547991 ^ seed;
|
|
43
46
|
for (let i = 0, ch; i < str.length; i++) {
|
|
@@ -51,6 +54,8 @@ var cyrb53 = (str, seed = 0) => {
|
|
|
51
54
|
h2 ^= Math.imul(h1 ^ h1 >>> 13, 3266489909);
|
|
52
55
|
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
|
53
56
|
};
|
|
57
|
+
|
|
58
|
+
// src/ChunkedUpdateMessage.ts
|
|
54
59
|
var ChunkedUpdateMessage = class _ChunkedUpdateMessage {
|
|
55
60
|
static fromObject(obj, target, customType) {
|
|
56
61
|
const msg = new _ChunkedUpdateMessage();
|
|
@@ -105,6 +110,8 @@ var ChunkedUpdateMessage = class _ChunkedUpdateMessage {
|
|
|
105
110
|
constructor() {
|
|
106
111
|
}
|
|
107
112
|
};
|
|
113
|
+
|
|
114
|
+
// src/RTM_2_1.ts
|
|
108
115
|
var RTMProvider_2_1 = class extends import_eventemitter3.default {
|
|
109
116
|
rtmClient;
|
|
110
117
|
roomId;
|
|
@@ -126,6 +133,20 @@ var RTMProvider_2_1 = class extends import_eventemitter3.default {
|
|
|
126
133
|
}
|
|
127
134
|
return `${this.roomChannel()}_u_${userId}`;
|
|
128
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* 重新订阅频道
|
|
138
|
+
*/
|
|
139
|
+
async resubscribe() {
|
|
140
|
+
try {
|
|
141
|
+
await this.rtmClient.subscribe(this.roomChannel());
|
|
142
|
+
await this.rtmClient.subscribe(this.userChannel(this.userId));
|
|
143
|
+
} catch (error) {
|
|
144
|
+
this.emit("error", `rtm subscribe fail, ${error}`);
|
|
145
|
+
(0, import_forge_room.log)(`rtm subscribe fail`, {
|
|
146
|
+
error: error.toString()
|
|
147
|
+
}, "error");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
129
150
|
async initialize(roomId, userId) {
|
|
130
151
|
window.clearInterval(this.intervalId);
|
|
131
152
|
this.roomId = roomId;
|
|
@@ -262,4 +283,169 @@ var RTMProvider_2_1 = class extends import_eventemitter3.default {
|
|
|
262
283
|
return output;
|
|
263
284
|
}
|
|
264
285
|
};
|
|
286
|
+
|
|
287
|
+
// src/RTM_2_2.ts
|
|
288
|
+
var import_forge_room2 = require("@netless/forge-room");
|
|
289
|
+
var import_eventemitter32 = __toESM(require("eventemitter3"), 1);
|
|
290
|
+
var import_uuid2 = require("uuid");
|
|
291
|
+
var RTMProvider_2_2 = class extends import_eventemitter32.default {
|
|
292
|
+
rtmClient;
|
|
293
|
+
roomId;
|
|
294
|
+
userId;
|
|
295
|
+
reconnectTimeout = null;
|
|
296
|
+
chunkedMessages = /* @__PURE__ */ new Map();
|
|
297
|
+
cachedMessages = [];
|
|
298
|
+
intervalId = null;
|
|
299
|
+
constructor(rtmClient) {
|
|
300
|
+
super();
|
|
301
|
+
this.rtmClient = rtmClient;
|
|
302
|
+
}
|
|
303
|
+
roomChannel() {
|
|
304
|
+
return `r_${this.roomId}`;
|
|
305
|
+
}
|
|
306
|
+
userChannel(userId) {
|
|
307
|
+
if (userId.length > 16) {
|
|
308
|
+
userId = `${cyrb53(userId)}`;
|
|
309
|
+
}
|
|
310
|
+
return `${this.roomChannel()}_u_${userId}`;
|
|
311
|
+
}
|
|
312
|
+
async initialize(roomId, userId) {
|
|
313
|
+
window.clearInterval(this.intervalId);
|
|
314
|
+
this.roomId = roomId;
|
|
315
|
+
this.userId = userId;
|
|
316
|
+
this.rtmClient.addEventListener("message", this.handleRtmMessage);
|
|
317
|
+
this.rtmClient.addEventListener("presence", this.handlePresence);
|
|
318
|
+
this.rtmClient.addEventListener("status", this.handleStatus);
|
|
319
|
+
try {
|
|
320
|
+
await this.rtmClient.subscribe(this.roomChannel());
|
|
321
|
+
await this.rtmClient.subscribe(this.userChannel(this.userId));
|
|
322
|
+
} catch (error) {
|
|
323
|
+
this.emit("error", `rtm subscribe fail, ${error}`);
|
|
324
|
+
(0, import_forge_room2.log)(`rtm subscribe fail`, {
|
|
325
|
+
error: error.toString(),
|
|
326
|
+
rtm: "2.2"
|
|
327
|
+
}, "error");
|
|
328
|
+
}
|
|
329
|
+
this.intervalId = setInterval(() => {
|
|
330
|
+
const msg = this.cachedMessages.shift();
|
|
331
|
+
if (msg) {
|
|
332
|
+
const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();
|
|
333
|
+
this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch((error) => {
|
|
334
|
+
(0, import_forge_room2.log)(`rtm publish failed`, {
|
|
335
|
+
channel,
|
|
336
|
+
code: error.code,
|
|
337
|
+
rtm: "2.2"
|
|
338
|
+
}, "warning");
|
|
339
|
+
this.emit("error", `rtm publish fail, ${error}`);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}, 32);
|
|
343
|
+
}
|
|
344
|
+
handleRtmMessage = (evt) => {
|
|
345
|
+
this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message, "", evt.customType), evt.publisher);
|
|
346
|
+
};
|
|
347
|
+
handleStatus = (connectionStatus) => {
|
|
348
|
+
(0, import_forge_room2.log)(`rtm status update`, {
|
|
349
|
+
state: connectionStatus.state,
|
|
350
|
+
reason: connectionStatus.reason,
|
|
351
|
+
rtm: "2.2"
|
|
352
|
+
});
|
|
353
|
+
if (connectionStatus.state === "RECONNECTING" && this.reconnectTimeout === null) {
|
|
354
|
+
this.reconnectTimeout = window.setTimeout(() => {
|
|
355
|
+
this.emit("error", `reconnecting timeout`);
|
|
356
|
+
this.emit("connectionStatusChange", "DISCONNECTED");
|
|
357
|
+
}, 30 * 1e3);
|
|
358
|
+
} else if (connectionStatus.state === "CONNECTED") {
|
|
359
|
+
window.clearTimeout(this.reconnectTimeout);
|
|
360
|
+
this.emit("connectionStatusChange", "CONNECTED");
|
|
361
|
+
} else if (connectionStatus.state === "FAILED") {
|
|
362
|
+
window.clearTimeout(this.reconnectTimeout);
|
|
363
|
+
this.emit("error", `rtm connection failed, ${connectionStatus.reason}`);
|
|
364
|
+
this.emit("connectionStatusChange", "DISCONNECTED");
|
|
365
|
+
} else if (connectionStatus.state === "CONNECTING") {
|
|
366
|
+
this.emit("connectionStatusChange", "CONNECTING");
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
handlePresence = (evt) => {
|
|
370
|
+
if (evt.channelName === this.roomChannel()) {
|
|
371
|
+
if (evt.eventType === "REMOTE_JOIN") {
|
|
372
|
+
this.emit("userJoin", evt.publisher);
|
|
373
|
+
} else if (evt.eventType === "REMOTE_LEAVE") {
|
|
374
|
+
this.emit("userLeave", evt.publisher);
|
|
375
|
+
} else if (evt.eventType === "REMOTE_TIMEOUT") {
|
|
376
|
+
this.emit("userLeave", evt.publisher);
|
|
377
|
+
} else if (evt.eventType === "INTERVAL") {
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
receiveChunkMessage(msg, publisher) {
|
|
382
|
+
if (msg.length === 1) {
|
|
383
|
+
this.emit("message", msg.buf, publisher, msg.customType);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const chunks = this.chunkedMessages.get(msg.session) || [];
|
|
387
|
+
chunks.push(msg);
|
|
388
|
+
if (chunks.length === msg.length) {
|
|
389
|
+
const buffer = chunks.sort((a, b) => a.index - b.index).reduce((result, next) => {
|
|
390
|
+
const buf = next.buf;
|
|
391
|
+
const output = new Uint8Array(result.length + buf.length);
|
|
392
|
+
output.set(result, 0);
|
|
393
|
+
output.set(buf, result.length);
|
|
394
|
+
return output;
|
|
395
|
+
}, new Uint8Array());
|
|
396
|
+
this.emit("message", buffer, publisher, msg.customType);
|
|
397
|
+
this.chunkedMessages.delete(msg.session);
|
|
398
|
+
} else {
|
|
399
|
+
this.chunkedMessages.set(msg.session, chunks);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
publish(buf, customType, target = "") {
|
|
403
|
+
const session = (0, import_uuid2.v4)();
|
|
404
|
+
const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;
|
|
405
|
+
if (size < 16) {
|
|
406
|
+
this.cachedMessages.push(ChunkedUpdateMessage.fromObject({
|
|
407
|
+
buf,
|
|
408
|
+
length: 1,
|
|
409
|
+
index: 0,
|
|
410
|
+
session
|
|
411
|
+
}, target, customType));
|
|
412
|
+
} else {
|
|
413
|
+
const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;
|
|
414
|
+
let len = Math.ceil(size / 16);
|
|
415
|
+
let index = 0;
|
|
416
|
+
while (index < len) {
|
|
417
|
+
this.cachedMessages.push(ChunkedUpdateMessage.fromObject({
|
|
418
|
+
buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),
|
|
419
|
+
length: len,
|
|
420
|
+
index,
|
|
421
|
+
session
|
|
422
|
+
}, target, customType));
|
|
423
|
+
index += 1;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
async userList() {
|
|
428
|
+
const output = /* @__PURE__ */ new Set();
|
|
429
|
+
const result = await this.rtmClient.presence.whoNow(this.roomChannel(), "MESSAGE", {
|
|
430
|
+
includedState: false
|
|
431
|
+
});
|
|
432
|
+
var nextPage = result.nextPage;
|
|
433
|
+
result.occupants.forEach((userInfo) => {
|
|
434
|
+
const { userId } = userInfo;
|
|
435
|
+
output.add(userId);
|
|
436
|
+
});
|
|
437
|
+
while (nextPage) {
|
|
438
|
+
const result2 = await this.rtmClient.presence.whoNow(this.roomChannel(), "MESSAGE", {
|
|
439
|
+
includedState: false,
|
|
440
|
+
page: nextPage
|
|
441
|
+
});
|
|
442
|
+
nextPage = result2.nextPage;
|
|
443
|
+
result2.occupants.forEach((userInfo) => {
|
|
444
|
+
const { userId } = userInfo;
|
|
445
|
+
output.add(userId);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
return output;
|
|
449
|
+
}
|
|
450
|
+
};
|
|
265
451
|
//# sourceMappingURL=rtm-provider.js.map
|
package/dist/rtm-provider.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/RTM_2_1.ts"],
|
|
4
|
-
"sourcesContent": ["export * from \"./RTM_2_1\";\n", "import { SocketProvider, SocketProviderEvent, log } from \"@netless/forge-room\";\nimport EventEmitter from \"eventemitter3\";\nimport {v4 as uuidv4} from \"uuid\";\n\nimport {RTMClient, RTMEvents} from \"agora-rtm\";\n\nconst cyrb53 = (str: string, seed = 0) => {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for(let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\n\nexport type ChunkedUpdateMessageType = {\n buf: Uint8Array;\n index: number;\n length: number;\n session: string;\n}\n\nclass ChunkedUpdateMessage {\n\n static fromObject(obj: ChunkedUpdateMessageType, target: string, customType: string): ChunkedUpdateMessage {\n const msg = new ChunkedUpdateMessage();\n msg.target = target;\n msg.customType = customType;\n\n const encoder = new TextEncoder();\n const sessionBuf = encoder.encode(obj.session);\n\n // header \u6309\u987A\u5E8F\u6307\u793A buf, session, target, customType \u90E8\u5206\u7684 uint8 \u957F\u5EA6\n msg.header = new DataView(new Uint8Array(10).buffer);\n\n msg.header.setUint32(0, obj.buf.length, false);\n msg.header.setUint32(4, sessionBuf.length, false);\n msg.header.setUint8(8, obj.index);\n msg.header.setUint8(9, obj.length);\n\n msg.buffer = new Uint8Array(\n obj.buf.length + sessionBuf.length + msg.header.buffer.byteLength\n );\n\n let len = 0;\n msg.buffer.set(new Uint8Array(msg.header.buffer), len);\n len += msg.header.buffer.byteLength;\n msg.buffer.set(obj.buf, len);\n len += obj.buf.length;\n msg.buffer.set(sessionBuf, len);\n\n return msg;\n }\n\n static fromBuffer(buf: Uint8Array, target: string, customType: string) {\n const msg = new ChunkedUpdateMessage();\n\n msg.header = new DataView(buf.slice(0, 10).buffer);\n msg.buffer = buf.slice(10);\n msg.target = target;\n msg.customType = customType;\n\n return msg;\n }\n\n public target!: string;\n public customType!: string;\n public buffer!: Uint8Array;\n private header!: DataView;\n\n public get buf(): Uint8Array {\n const len = this.header.getInt32(0);\n return this.buffer.slice(0, len);\n }\n\n public get index(): number {\n return this.header.getUint8(8);\n }\n\n public get length(): number {\n return this.header.getUint8(9);\n }\n\n public get session(): string {\n const start = this.header.getInt32(0);\n const sessionBuf = this.buffer.slice(start, start + this.header.getInt32(4));\n const textDecoder = new TextDecoder();\n return textDecoder.decode(sessionBuf);\n }\n\n private constructor() {}\n}\n\nexport class RTMProvider_2_1 extends EventEmitter<SocketProviderEvent> implements SocketProvider {\n\n private rtmClient!: RTMClient;\n private roomId!: string;\n private userId!: string;\n\n private reconnectTimeout: any = null;\n private chunkedMessages: Map<string, ChunkedUpdateMessage[]> = new Map();\n private cachedMessages: ChunkedUpdateMessage[] = [];\n\n private intervalId: any = null;\n\n public constructor(rtmClient: RTMClient) {\n super();\n this.rtmClient = rtmClient;\n }\n\n private roomChannel(): string {\n return `r_${this.roomId}`;\n }\n\n private userChannel(userId: string): string {\n if (userId.length > 16) {\n userId = `${cyrb53(userId)}`;\n }\n return `${this.roomChannel()}_u_${userId}`;\n }\n\n public async initialize(roomId: string, userId: string): Promise<void> {\n window.clearInterval(this.intervalId);\n this.roomId = roomId;\n this.userId = userId;\n this.rtmClient.addEventListener(\"message\", this.handleRtmMessage);\n this.rtmClient.addEventListener(\"presence\", this.handlePresence);\n // @ts-ignore\n this.rtmClient.addEventListener(\"status\", this.handleStatus);\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n }, \"error\");\n }\n this.intervalId = setInterval(() => {\n const msg = this.cachedMessages.shift();\n if (msg) {\n const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();\n this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch(error => {\n log(`rtm publish failed`, {\n channel,\n code: error.code\n }, \"warning\");\n this.emit(\"error\", `rtm publish fail, ${error}`);\n });\n }\n }, 32);\n }\n\n private handleRtmMessage = (evt: RTMEvents.MessageEvent) => {\n this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message as Uint8Array, \"\", evt.customType), evt.publisher);\n };\n\n private handleStatus = (connectionStatus: RTMEvents.RTMConnectionStatusChangeEvent) => {\n log(`rtm status update`, {\n state: connectionStatus.state,\n reason: connectionStatus.reason\n });\n if (connectionStatus.state === \"RECONNECTING\" && this.reconnectTimeout === null) {\n this.reconnectTimeout = window.setTimeout(() => {\n this.emit(\"error\", `reconnecting timeout`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n }, 30 * 1000);\n } else if (connectionStatus.state === \"CONNECTED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"connectionStatusChange\", \"CONNECTED\");\n } else if (connectionStatus.state === \"FAILED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"error\", `rtm connection failed, ${connectionStatus.reason}`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n } else if (connectionStatus.state === \"CONNECTING\") {\n this.emit(\"connectionStatusChange\", \"CONNECTING\");\n }\n }\n\n private handlePresence = (evt: RTMEvents.PresenceEvent) => {\n if (evt.channelName === this.roomChannel()) {\n if (evt.eventType === \"REMOTE_JOIN\") {\n this.emit(\"userJoin\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_LEAVE\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_TIMEOUT\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"INTERVAL\") {\n // evt.interval.join.users\n }\n }\n };\n\n private receiveChunkMessage(msg: ChunkedUpdateMessage, publisher: string) {\n if (msg.length === 1) {\n this.emit(\"message\", msg.buf, publisher, msg.customType);\n return;\n }\n const chunks = this.chunkedMessages.get(msg.session) || [];\n chunks.push(msg);\n if (chunks.length === msg.length) {\n const buffer = chunks.sort((a, b) => a.index - b.index)\n .reduce((result, next) => {\n const buf = next.buf;\n const output = new Uint8Array(result.length + buf.length);\n output.set(result, 0);\n output.set(buf, result.length);\n return output;\n }, new Uint8Array());\n this.emit(\"message\", buffer, publisher, msg.customType);\n this.chunkedMessages.delete(msg.session);\n } else {\n this.chunkedMessages.set(msg.session, chunks);\n }\n }\n\n public publish(buf: Uint8Array, customType: string, target: string = \"\") {\n const session = uuidv4();\n // \u6D88\u606F\u5305\u4F53\u79EF, \u5355\u4F4D kb\n const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;\n if (size < 16) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf,\n length: 1,\n index: 0,\n session\n }, target, customType));\n } else {\n const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;\n let len = Math.ceil(size / 16);\n let index = 0;\n while (index < len) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),\n length: len,\n index: index,\n session,\n }, target, customType));\n index += 1;\n }\n }\n }\n\n public async userList(): Promise<Set<string>> {\n const output = new Set<string>();\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n });\n var nextPage: string | null = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n while (nextPage) {\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n page: nextPage,\n });\n nextPage = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n }\n return output;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["EventEmitter", "uuidv4", "result"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/RTM_2_1.ts", "../src/utils.ts", "../src/ChunkedUpdateMessage.ts", "../src/RTM_2_2.ts"],
|
|
4
|
+
"sourcesContent": ["export { RTMProvider_2_1 } from \"./RTM_2_1\";\nexport { RTMProvider_2_2 } from \"./RTM_2_2\";", "import { SocketProvider, SocketProviderEvent, log } from \"@netless/forge-room\";\nimport EventEmitter from \"eventemitter3\";\nimport {v4 as uuidv4} from \"uuid\";\nimport {cyrb53} from \"./utils\";\n\nimport type {RTMClient, RTMEvents} from \"agora-rtm\";\n\nimport {ChunkedUpdateMessage} from \"./ChunkedUpdateMessage\";\n\nexport class RTMProvider_2_1 extends EventEmitter<SocketProviderEvent> implements SocketProvider {\n\n private rtmClient!: RTMClient;\n private roomId!: string;\n private userId!: string;\n\n private reconnectTimeout: any = null;\n private chunkedMessages: Map<string, ChunkedUpdateMessage[]> = new Map();\n private cachedMessages: ChunkedUpdateMessage[] = [];\n\n private intervalId: any = null;\n\n public constructor(rtmClient: RTMClient) {\n super();\n this.rtmClient = rtmClient;\n }\n\n private roomChannel(): string {\n return `r_${this.roomId}`;\n }\n\n private userChannel(userId: string): string {\n if (userId.length > 16) {\n userId = `${cyrb53(userId)}`;\n }\n return `${this.roomChannel()}_u_${userId}`;\n }\n\n /**\n * \u91CD\u65B0\u8BA2\u9605\u9891\u9053\n */\n public async resubscribe() {\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n }, \"error\");\n }\n }\n\n public async initialize(roomId: string, userId: string): Promise<void> {\n window.clearInterval(this.intervalId);\n this.roomId = roomId;\n this.userId = userId;\n this.rtmClient.addEventListener(\"message\", this.handleRtmMessage);\n this.rtmClient.addEventListener(\"presence\", this.handlePresence);\n // @ts-ignore\n this.rtmClient.addEventListener(\"status\", this.handleStatus);\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n }, \"error\");\n }\n this.intervalId = setInterval(() => {\n const msg = this.cachedMessages.shift();\n if (msg) {\n const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();\n this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch(error => {\n log(`rtm publish failed`, {\n channel,\n code: error.code\n }, \"warning\");\n this.emit(\"error\", `rtm publish fail, ${error}`);\n });\n }\n }, 32);\n }\n\n private handleRtmMessage = (evt: RTMEvents.MessageEvent) => {\n this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message as Uint8Array, \"\", evt.customType), evt.publisher);\n };\n\n private handleStatus = (connectionStatus: RTMEvents.RTMConnectionStatusChangeEvent) => {\n log(`rtm status update`, {\n state: connectionStatus.state,\n reason: connectionStatus.reason\n });\n if (connectionStatus.state === \"RECONNECTING\" && this.reconnectTimeout === null) {\n this.reconnectTimeout = window.setTimeout(() => {\n this.emit(\"error\", `reconnecting timeout`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n }, 30 * 1000);\n } else if (connectionStatus.state === \"CONNECTED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"connectionStatusChange\", \"CONNECTED\");\n } else if (connectionStatus.state === \"FAILED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"error\", `rtm connection failed, ${connectionStatus.reason}`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n } else if (connectionStatus.state === \"CONNECTING\") {\n this.emit(\"connectionStatusChange\", \"CONNECTING\");\n }\n }\n\n private handlePresence = (evt: RTMEvents.PresenceEvent) => {\n if (evt.channelName === this.roomChannel()) {\n if (evt.eventType === \"REMOTE_JOIN\") {\n this.emit(\"userJoin\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_LEAVE\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_TIMEOUT\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"INTERVAL\") {\n // evt.interval.join.users\n }\n }\n };\n\n private receiveChunkMessage(msg: ChunkedUpdateMessage, publisher: string) {\n if (msg.length === 1) {\n this.emit(\"message\", msg.buf, publisher, msg.customType);\n return;\n }\n const chunks = this.chunkedMessages.get(msg.session) || [];\n chunks.push(msg);\n if (chunks.length === msg.length) {\n const buffer = chunks.sort((a, b) => a.index - b.index)\n .reduce((result, next) => {\n const buf = next.buf;\n const output = new Uint8Array(result.length + buf.length);\n output.set(result, 0);\n output.set(buf, result.length);\n return output;\n }, new Uint8Array());\n this.emit(\"message\", buffer, publisher, msg.customType);\n this.chunkedMessages.delete(msg.session);\n } else {\n this.chunkedMessages.set(msg.session, chunks);\n }\n }\n\n public publish(buf: Uint8Array, customType: string, target: string = \"\") {\n const session = uuidv4();\n // \u6D88\u606F\u5305\u4F53\u79EF, \u5355\u4F4D kb\n const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;\n if (size < 16) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf,\n length: 1,\n index: 0,\n session\n }, target, customType));\n } else {\n const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;\n let len = Math.ceil(size / 16);\n let index = 0;\n while (index < len) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),\n length: len,\n index: index,\n session,\n }, target, customType));\n index += 1;\n }\n }\n }\n\n public async userList(): Promise<Set<string>> {\n const output = new Set<string>();\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n });\n var nextPage: string | null = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n while (nextPage) {\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n page: nextPage,\n });\n nextPage = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n }\n return output;\n }\n}\n", "export const cyrb53 = (str: string, seed = 0) => {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for(let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};", "export type ChunkedUpdateMessageType = {\n buf: Uint8Array;\n index: number;\n length: number;\n session: string;\n}\n\nexport class ChunkedUpdateMessage {\n\n static fromObject(obj: ChunkedUpdateMessageType, target: string, customType: string): ChunkedUpdateMessage {\n const msg = new ChunkedUpdateMessage();\n msg.target = target;\n msg.customType = customType;\n\n const encoder = new TextEncoder();\n const sessionBuf = encoder.encode(obj.session);\n\n // header \u6309\u987A\u5E8F\u6307\u793A buf, session, target, customType \u90E8\u5206\u7684 uint8 \u957F\u5EA6\n msg.header = new DataView(new Uint8Array(10).buffer);\n\n msg.header.setUint32(0, obj.buf.length, false);\n msg.header.setUint32(4, sessionBuf.length, false);\n msg.header.setUint8(8, obj.index);\n msg.header.setUint8(9, obj.length);\n\n msg.buffer = new Uint8Array(\n obj.buf.length + sessionBuf.length + msg.header.buffer.byteLength\n );\n\n let len = 0;\n msg.buffer.set(new Uint8Array(msg.header.buffer), len);\n len += msg.header.buffer.byteLength;\n msg.buffer.set(obj.buf, len);\n len += obj.buf.length;\n msg.buffer.set(sessionBuf, len);\n\n return msg;\n }\n\n static fromBuffer(buf: Uint8Array, target: string, customType: string) {\n const msg = new ChunkedUpdateMessage();\n\n msg.header = new DataView(buf.slice(0, 10).buffer);\n msg.buffer = buf.slice(10);\n msg.target = target;\n msg.customType = customType;\n\n return msg;\n }\n\n public target!: string;\n public customType!: string;\n public buffer!: Uint8Array;\n private header!: DataView;\n\n public get buf(): Uint8Array {\n const len = this.header.getInt32(0);\n return this.buffer.slice(0, len);\n }\n\n public get index(): number {\n return this.header.getUint8(8);\n }\n\n public get length(): number {\n return this.header.getUint8(9);\n }\n\n public get session(): string {\n const start = this.header.getInt32(0);\n const sessionBuf = this.buffer.slice(start, start + this.header.getInt32(4));\n const textDecoder = new TextDecoder();\n return textDecoder.decode(sessionBuf);\n }\n\n private constructor() {}\n}", "import { SocketProvider, SocketProviderEvent, log } from \"@netless/forge-room\";\nimport EventEmitter from \"eventemitter3\";\nimport {v4 as uuidv4} from \"uuid\";\nimport {cyrb53} from \"./utils\";\n\nimport type {RTMClient, RTMEvents} from \"agora-rtm\";\nimport {ChunkedUpdateMessage} from \"./ChunkedUpdateMessage\";\n\nexport class RTMProvider_2_2 extends EventEmitter<SocketProviderEvent> implements SocketProvider {\n\n private rtmClient!: RTMClient;\n private roomId!: string;\n private userId!: string;\n\n private reconnectTimeout: any = null;\n private chunkedMessages: Map<string, ChunkedUpdateMessage[]> = new Map();\n private cachedMessages: ChunkedUpdateMessage[] = [];\n\n private intervalId: any = null;\n\n public constructor(rtmClient: RTMClient) {\n super();\n this.rtmClient = rtmClient;\n }\n\n private roomChannel(): string {\n return `r_${this.roomId}`;\n }\n\n private userChannel(userId: string): string {\n if (userId.length > 16) {\n userId = `${cyrb53(userId)}`;\n }\n return `${this.roomChannel()}_u_${userId}`;\n }\n\n public async initialize(roomId: string, userId: string): Promise<void> {\n window.clearInterval(this.intervalId);\n this.roomId = roomId;\n this.userId = userId;\n this.rtmClient.addEventListener(\"message\", this.handleRtmMessage);\n this.rtmClient.addEventListener(\"presence\", this.handlePresence);\n // @ts-ignore\n this.rtmClient.addEventListener(\"status\", this.handleStatus);\n try {\n await this.rtmClient.subscribe(this.roomChannel());\n await this.rtmClient.subscribe(this.userChannel(this.userId));\n } catch(error: any) {\n this.emit(\"error\", `rtm subscribe fail, ${error}`);\n log(`rtm subscribe fail`, {\n error: error.toString(),\n rtm: \"2.2\"\n }, \"error\");\n }\n this.intervalId = setInterval(() => {\n const msg = this.cachedMessages.shift();\n if (msg) {\n const channel = msg.target ? this.userChannel(msg.target) : this.roomChannel();\n this.rtmClient.publish(channel, msg.buffer, { customType: msg.customType }).catch(error => {\n log(`rtm publish failed`, {\n channel,\n code: error.code,\n rtm: \"2.2\"\n }, \"warning\");\n this.emit(\"error\", `rtm publish fail, ${error}`);\n });\n }\n }, 32);\n }\n\n private handleRtmMessage = (evt: RTMEvents.MessageEvent) => {\n this.receiveChunkMessage(ChunkedUpdateMessage.fromBuffer(evt.message as Uint8Array, \"\", evt.customType), evt.publisher);\n };\n\n private handleStatus = (connectionStatus: RTMEvents.RTMConnectionStatusChangeEvent) => {\n log(`rtm status update`, {\n state: connectionStatus.state,\n reason: connectionStatus.reason,\n rtm: \"2.2\"\n });\n if (connectionStatus.state === \"RECONNECTING\" && this.reconnectTimeout === null) {\n this.reconnectTimeout = window.setTimeout(() => {\n this.emit(\"error\", `reconnecting timeout`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n }, 30 * 1000);\n } else if (connectionStatus.state === \"CONNECTED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"connectionStatusChange\", \"CONNECTED\");\n } else if (connectionStatus.state === \"FAILED\") {\n window.clearTimeout(this.reconnectTimeout);\n this.emit(\"error\", `rtm connection failed, ${connectionStatus.reason}`);\n this.emit(\"connectionStatusChange\", \"DISCONNECTED\");\n } else if (connectionStatus.state === \"CONNECTING\") {\n this.emit(\"connectionStatusChange\", \"CONNECTING\");\n }\n }\n\n private handlePresence = (evt: RTMEvents.PresenceEvent) => {\n if (evt.channelName === this.roomChannel()) {\n if (evt.eventType === \"REMOTE_JOIN\") {\n this.emit(\"userJoin\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_LEAVE\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"REMOTE_TIMEOUT\") {\n this.emit(\"userLeave\", evt.publisher);\n } else if (evt.eventType === \"INTERVAL\") {\n // evt.interval.join.users\n }\n }\n };\n\n private receiveChunkMessage(msg: ChunkedUpdateMessage, publisher: string) {\n if (msg.length === 1) {\n this.emit(\"message\", msg.buf, publisher, msg.customType);\n return;\n }\n const chunks = this.chunkedMessages.get(msg.session) || [];\n chunks.push(msg);\n if (chunks.length === msg.length) {\n const buffer = chunks.sort((a, b) => a.index - b.index)\n .reduce((result, next) => {\n const buf = next.buf;\n const output = new Uint8Array(result.length + buf.length);\n output.set(result, 0);\n output.set(buf, result.length);\n return output;\n }, new Uint8Array());\n this.emit(\"message\", buffer, publisher, msg.customType);\n this.chunkedMessages.delete(msg.session);\n } else {\n this.chunkedMessages.set(msg.session, chunks);\n }\n }\n\n public publish(buf: Uint8Array, customType: string, target: string = \"\") {\n const session = uuidv4();\n // \u6D88\u606F\u5305\u4F53\u79EF, \u5355\u4F4D kb\n const size = buf.length * Uint8Array.BYTES_PER_ELEMENT / 1024;\n if (size < 16) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf,\n length: 1,\n index: 0,\n session\n }, target, customType));\n } else {\n const chunkSize = 16 * 1024 / Uint8Array.BYTES_PER_ELEMENT;\n let len = Math.ceil(size / 16);\n let index = 0;\n while (index < len) {\n this.cachedMessages.push(ChunkedUpdateMessage.fromObject({\n buf: buf.slice(index * chunkSize, (index + 1) * chunkSize),\n length: len,\n index: index,\n session,\n }, target, customType));\n index += 1;\n }\n }\n }\n\n public async userList(): Promise<Set<string>> {\n const output = new Set<string>();\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n });\n var nextPage: string | null = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n while (nextPage) {\n const result = await this.rtmClient.presence.whoNow(this.roomChannel(), \"MESSAGE\", {\n includedState: false,\n page: nextPage,\n });\n nextPage = result.nextPage;\n result.occupants.forEach((userInfo) => {\n const { userId } = userInfo;\n output.add(userId);\n });\n }\n return output;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EventEmitter", "uuidv4", "result", "import_forge_room", "import_eventemitter3", "import_uuid", "EventEmitter", "uuidv4", "result"]
|
|
7
7
|
}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,QAAS,MAAM,0BAajC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netless/forge-rtm",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/rtm-provider.js",
|
|
6
6
|
"module": "dist/rtm-provider.esm.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"author": "",
|
|
18
18
|
"license": "ISC",
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"agora-rtm": "^2.1.
|
|
20
|
+
"agora-rtm": "^2.1.10",
|
|
21
21
|
"@hyrious/esbuild-plugin-commonjs": "^0.2.4",
|
|
22
22
|
"@types/uuid": "^9.0.8",
|
|
23
23
|
"dts-bundle-generator": "^9.5.1"
|