@stream-io/video-client 1.30.1 → 1.31.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.
@@ -1,22 +1,3 @@
1
- declare class TimerWorker {
2
- private currentTimerId;
3
- private callbacks;
4
- private worker;
5
- private fallback;
6
- setup({ useTimerWorker }?: {
7
- useTimerWorker?: boolean;
8
- }): void;
9
- destroy(): void;
10
- get ready(): boolean;
11
- setInterval(callback: () => void, timeout: number): number;
12
- clearInterval(id?: number): void;
13
- setTimeout(callback: () => void, timeout: number): number;
14
- clearTimeout(id?: number): void;
15
- private setTimer;
16
- private clearTimer;
17
- private getTimerId;
18
- private sendMessage;
19
- }
1
+ import { WorkerTimer } from '@stream-io/worker-timer';
20
2
  export declare const enableTimerWorker: () => void;
21
- export declare const getTimers: (...args: never[]) => TimerWorker;
22
- export {};
3
+ export declare const getTimers: (...args: never[]) => WorkerTimer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/video-client",
3
- "version": "1.30.1",
3
+ "version": "1.31.0",
4
4
  "main": "dist/index.cjs.js",
5
5
  "module": "dist/index.es.js",
6
6
  "browser": "dist/index.browser.es.js",
@@ -14,8 +14,7 @@
14
14
  "test": "vitest",
15
15
  "test-ci": "vitest run --coverage",
16
16
  "generate:open-api": "./generate-openapi.sh protocol",
17
- "generate:open-api:dev": "./generate-openapi.sh chat",
18
- "generate:timer-worker": "./generate-timer-worker.sh"
17
+ "generate:open-api:dev": "./generate-openapi.sh chat"
19
18
  },
20
19
  "files": [
21
20
  "dist",
@@ -30,6 +29,7 @@
30
29
  "@protobuf-ts/runtime": "^2.9.4",
31
30
  "@protobuf-ts/runtime-rpc": "^2.9.4",
32
31
  "@protobuf-ts/twirp-transport": "^2.9.4",
32
+ "@stream-io/worker-timer": "^1.2.4",
33
33
  "axios": "^1.8.1",
34
34
  "rxjs": "~7.8.1",
35
35
  "sdp-transform": "^2.15.0",
@@ -1,128 +1,5 @@
1
+ import { WorkerTimer } from '@stream-io/worker-timer';
1
2
  import { lazy } from '../helpers/lazy';
2
- import { getLogger } from '../logger';
3
- import { TimerWorkerEvent, TimerWorkerRequest } from './types';
4
- import { timerWorker } from './worker.build';
5
-
6
- class TimerWorker {
7
- private currentTimerId = 1;
8
- private callbacks = new Map<number, () => void>();
9
- private worker: Worker | undefined;
10
- private fallback = false;
11
-
12
- setup({ useTimerWorker = true }: { useTimerWorker?: boolean } = {}): void {
13
- if (!useTimerWorker) {
14
- this.fallback = true;
15
- return;
16
- }
17
-
18
- try {
19
- const source = timerWorker.src;
20
- const blob = new Blob([source], {
21
- type: 'application/javascript; charset=utf-8',
22
- });
23
- const script = URL.createObjectURL(blob);
24
- this.worker = new Worker(script, { name: 'str-timer-worker' });
25
- this.worker.addEventListener('message', (event) => {
26
- const { type, id } = event.data as TimerWorkerEvent;
27
- if (type === 'tick') {
28
- this.callbacks.get(id)?.();
29
- }
30
- });
31
- } catch (err: any) {
32
- getLogger(['timer-worker'])('error', err);
33
- this.fallback = true;
34
- }
35
- }
36
-
37
- destroy(): void {
38
- this.callbacks.clear();
39
- this.worker?.terminate();
40
- this.worker = undefined;
41
- this.fallback = false;
42
- }
43
-
44
- get ready() {
45
- return this.fallback || Boolean(this.worker);
46
- }
47
-
48
- setInterval(callback: () => void, timeout: number): number {
49
- return this.setTimer('setInterval', callback, timeout);
50
- }
51
-
52
- clearInterval(id?: number): void {
53
- this.clearTimer('clearInterval', id);
54
- }
55
-
56
- setTimeout(callback: () => void, timeout: number): number {
57
- return this.setTimer('setTimeout', callback, timeout);
58
- }
59
-
60
- clearTimeout(id?: number): void {
61
- this.clearTimer('clearTimeout', id);
62
- }
63
-
64
- private setTimer(
65
- type: 'setTimeout' | 'setInterval',
66
- callback: () => void,
67
- timeout: number,
68
- ) {
69
- if (!this.ready) {
70
- this.setup();
71
- }
72
-
73
- if (this.fallback) {
74
- return (type === 'setTimeout' ? setTimeout : setInterval)(
75
- callback,
76
- timeout,
77
- ) as unknown as number;
78
- }
79
-
80
- const id = this.getTimerId();
81
-
82
- this.callbacks.set(id, () => {
83
- callback();
84
-
85
- // Timeouts are one-off operations, so no need to keep callback reference
86
- // after timer has fired
87
- if (type === 'setTimeout') {
88
- this.callbacks.delete(id);
89
- }
90
- });
91
-
92
- this.sendMessage({ type, id, timeout });
93
- return id;
94
- }
95
-
96
- private clearTimer(type: 'clearTimeout' | 'clearInterval', id?: number) {
97
- if (!id) {
98
- return;
99
- }
100
-
101
- if (!this.ready) {
102
- this.setup();
103
- }
104
-
105
- if (this.fallback) {
106
- (type === 'clearTimeout' ? clearTimeout : clearInterval)(id);
107
- return;
108
- }
109
-
110
- this.callbacks.delete(id);
111
- this.sendMessage({ type, id });
112
- }
113
-
114
- private getTimerId() {
115
- return this.currentTimerId++;
116
- }
117
-
118
- private sendMessage(message: TimerWorkerRequest) {
119
- if (!this.worker) {
120
- throw new Error("Cannot use timer worker before it's set up");
121
- }
122
-
123
- this.worker.postMessage(message);
124
- }
125
- }
126
3
 
127
4
  let timerWorkerEnabled = false;
128
5
 
@@ -131,7 +8,5 @@ export const enableTimerWorker = () => {
131
8
  };
132
9
 
133
10
  export const getTimers = lazy(() => {
134
- const instance = new TimerWorker();
135
- instance.setup({ useTimerWorker: timerWorkerEnabled });
136
- return instance;
11
+ return new WorkerTimer({ useWorker: timerWorkerEnabled });
137
12
  });
@@ -1,12 +0,0 @@
1
- export type TimerWorkerRequest = {
2
- type: 'setInterval' | 'setTimeout';
3
- id: number;
4
- timeout: number;
5
- } | {
6
- type: 'clearInterval' | 'clearTimeout';
7
- id: number;
8
- };
9
- export type TimerWorkerEvent = {
10
- type: 'tick';
11
- id: number;
12
- };
@@ -1,3 +0,0 @@
1
- export declare const timerWorker: {
2
- src: string;
3
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,15 +0,0 @@
1
- export type TimerWorkerRequest =
2
- | {
3
- type: 'setInterval' | 'setTimeout';
4
- id: number;
5
- timeout: number;
6
- }
7
- | {
8
- type: 'clearInterval' | 'clearTimeout';
9
- id: number;
10
- };
11
-
12
- export type TimerWorkerEvent = {
13
- type: 'tick';
14
- id: number;
15
- };
@@ -1,28 +0,0 @@
1
- // Do not modify this file manually. Instead, edit worker.ts
2
- // and the run ./generate-timer-worker.sh
3
- export const timerWorker = {
4
- src: `const timerIdMapping = new Map();
5
- self.addEventListener('message', (event) => {
6
- const request = event.data;
7
- switch (request.type) {
8
- case 'setTimeout':
9
- case 'setInterval':
10
- timerIdMapping.set(request.id, (request.type === 'setTimeout' ? setTimeout : setInterval)(() => {
11
- tick(request.id);
12
- if (request.type === 'setTimeout') {
13
- timerIdMapping.delete(request.id);
14
- }
15
- }, request.timeout));
16
- break;
17
- case 'clearTimeout':
18
- case 'clearInterval':
19
- (request.type === 'clearTimeout' ? clearTimeout : clearInterval)(timerIdMapping.get(request.id));
20
- timerIdMapping.delete(request.id);
21
- break;
22
- }
23
- });
24
- function tick(id) {
25
- const message = { type: 'tick', id };
26
- self.postMessage(message);
27
- }`,
28
- };
@@ -1,36 +0,0 @@
1
- import type { TimerWorkerEvent, TimerWorkerRequest } from './types';
2
-
3
- const timerIdMapping = new Map<number, NodeJS.Timeout>();
4
-
5
- self.addEventListener('message', (event: MessageEvent) => {
6
- const request = event.data as TimerWorkerRequest;
7
-
8
- switch (request.type) {
9
- case 'setTimeout':
10
- case 'setInterval':
11
- timerIdMapping.set(
12
- request.id,
13
- (request.type === 'setTimeout' ? setTimeout : setInterval)(() => {
14
- tick(request.id);
15
-
16
- if (request.type === 'setTimeout') {
17
- timerIdMapping.delete(request.id);
18
- }
19
- }, request.timeout),
20
- );
21
- break;
22
-
23
- case 'clearTimeout':
24
- case 'clearInterval':
25
- (request.type === 'clearTimeout' ? clearTimeout : clearInterval)(
26
- timerIdMapping.get(request.id),
27
- );
28
- timerIdMapping.delete(request.id);
29
- break;
30
- }
31
- });
32
-
33
- function tick(id: number) {
34
- const message: TimerWorkerEvent = { type: 'tick', id };
35
- self.postMessage(message);
36
- }