agora-electron-sdk 4.5.1 → 4.5.2-dev.2

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.
Files changed (99) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/js/Decoder/gpu-utils.js +74 -0
  3. package/js/Decoder/index.js +172 -0
  4. package/js/Private/AgoraBase.js +15 -3
  5. package/js/Private/extension/AgoraBaseExtension.js +1 -0
  6. package/js/Private/internal/IrisApiEngine.js +20 -7
  7. package/js/Private/internal/RtcEngineExInternal.js +31 -16
  8. package/js/Private/ipc/main.js +21 -0
  9. package/js/Private/ipc/renderer.js +21 -0
  10. package/js/Renderer/CapabilityManager.js +99 -0
  11. package/js/Renderer/IRenderer.js +40 -11
  12. package/js/Renderer/IRendererCache.js +75 -0
  13. package/js/Renderer/RendererCache.js +26 -63
  14. package/js/Renderer/RendererManager.js +259 -38
  15. package/js/Renderer/WebCodecsRenderer/index.js +109 -0
  16. package/js/Renderer/WebCodecsRendererCache.js +115 -0
  17. package/js/Renderer/WebGLRenderer/index.js +115 -67
  18. package/js/Renderer/YUVCanvasRenderer/index.js +5 -3
  19. package/js/Renderer/index.js +0 -1
  20. package/js/Types.js +51 -1
  21. package/js/Utils.js +47 -7
  22. package/package.json +28 -11
  23. package/scripts/checkElectron.js +4 -2
  24. package/scripts/download.js +102 -0
  25. package/scripts/downloadPrebuild.js +2 -1
  26. package/scripts/synclib.js +2 -2
  27. package/ts/Decoder/gpu-utils.ts +92 -0
  28. package/ts/Decoder/index.ts +206 -0
  29. package/ts/Private/AgoraBase.ts +18 -4
  30. package/ts/Private/IAgoraRtcEngine.ts +6 -7
  31. package/ts/Private/IAgoraRtcEngineEx.ts +2 -1
  32. package/ts/Private/extension/AgoraBaseExtension.ts +14 -1
  33. package/ts/Private/internal/IrisApiEngine.ts +21 -7
  34. package/ts/Private/internal/RtcEngineExInternal.ts +27 -8
  35. package/ts/Private/ipc/main.ts +22 -0
  36. package/ts/Private/ipc/renderer.ts +21 -0
  37. package/ts/Renderer/CapabilityManager.ts +126 -0
  38. package/ts/Renderer/IRenderer.ts +52 -17
  39. package/ts/Renderer/IRendererCache.ts +96 -0
  40. package/ts/Renderer/RendererCache.ts +42 -85
  41. package/ts/Renderer/RendererManager.ts +342 -52
  42. package/ts/Renderer/WebCodecsRenderer/index.ts +145 -0
  43. package/ts/Renderer/WebCodecsRendererCache.ts +137 -0
  44. package/ts/Renderer/WebGLRenderer/index.ts +153 -107
  45. package/ts/Renderer/YUVCanvasRenderer/index.ts +24 -22
  46. package/ts/Renderer/index.ts +0 -1
  47. package/ts/Types.ts +130 -7
  48. package/ts/Utils.ts +53 -7
  49. package/types/Decoder/gpu-utils.d.ts +21 -0
  50. package/types/Decoder/gpu-utils.d.ts.map +1 -0
  51. package/types/Decoder/index.d.ts +26 -0
  52. package/types/Decoder/index.d.ts.map +1 -0
  53. package/types/Private/AgoraBase.d.ts +18 -4
  54. package/types/Private/AgoraBase.d.ts.map +1 -1
  55. package/types/Private/IAgoraRtcEngine.d.ts +6 -7
  56. package/types/Private/IAgoraRtcEngine.d.ts.map +1 -1
  57. package/types/Private/IAgoraRtcEngineEx.d.ts +2 -1
  58. package/types/Private/IAgoraRtcEngineEx.d.ts.map +1 -1
  59. package/types/Private/extension/AgoraBaseExtension.d.ts +13 -1
  60. package/types/Private/extension/AgoraBaseExtension.d.ts.map +1 -1
  61. package/types/Private/internal/IrisApiEngine.d.ts +2 -0
  62. package/types/Private/internal/IrisApiEngine.d.ts.map +1 -1
  63. package/types/Private/internal/RtcEngineExInternal.d.ts +2 -0
  64. package/types/Private/internal/RtcEngineExInternal.d.ts.map +1 -1
  65. package/types/Private/ipc/main.d.ts +2 -0
  66. package/types/Private/ipc/main.d.ts.map +1 -0
  67. package/types/Private/ipc/renderer.d.ts +3 -0
  68. package/types/Private/ipc/renderer.d.ts.map +1 -0
  69. package/types/Renderer/CapabilityManager.d.ts +20 -0
  70. package/types/Renderer/CapabilityManager.d.ts.map +1 -0
  71. package/types/Renderer/IRenderer.d.ts +8 -7
  72. package/types/Renderer/IRenderer.d.ts.map +1 -1
  73. package/types/Renderer/IRendererCache.d.ts +26 -0
  74. package/types/Renderer/IRendererCache.d.ts.map +1 -0
  75. package/types/Renderer/RendererCache.d.ts +6 -18
  76. package/types/Renderer/RendererCache.d.ts.map +1 -1
  77. package/types/Renderer/RendererManager.d.ts +49 -15
  78. package/types/Renderer/RendererManager.d.ts.map +1 -1
  79. package/types/Renderer/WebCodecsRenderer/index.d.ts +14 -0
  80. package/types/Renderer/WebCodecsRenderer/index.d.ts.map +1 -0
  81. package/types/Renderer/WebCodecsRendererCache.d.ts +15 -0
  82. package/types/Renderer/WebCodecsRendererCache.d.ts.map +1 -0
  83. package/types/Renderer/WebGLRenderer/index.d.ts +5 -3
  84. package/types/Renderer/WebGLRenderer/index.d.ts.map +1 -1
  85. package/types/Renderer/YUVCanvasRenderer/index.d.ts +1 -1
  86. package/types/Renderer/YUVCanvasRenderer/index.d.ts.map +1 -1
  87. package/types/Renderer/index.d.ts +0 -1
  88. package/types/Renderer/index.d.ts.map +1 -1
  89. package/types/Types.d.ts +99 -8
  90. package/types/Types.d.ts.map +1 -1
  91. package/types/Utils.d.ts +4 -0
  92. package/types/Utils.d.ts.map +1 -1
  93. package/js/Renderer/IRendererManager.js +0 -229
  94. package/scripts/publishCN/common.sh +0 -19
  95. package/scripts/publishCN/rewrite-dep.sh +0 -22
  96. package/scripts/publishCN/rewrite-example.sh +0 -22
  97. package/ts/Renderer/IRendererManager.ts +0 -316
  98. package/types/Renderer/IRendererManager.d.ts +0 -56
  99. package/types/Renderer/IRendererManager.d.ts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
 
2
2
 
3
+ ## [4.5.2-dev.2](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.2-dev.1...v4.5.2-dev.2) (2025-03-14)
4
+
5
+ ## [4.5.2-dev.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v0.0.0-dev.1...v4.5.2-dev.1) (2025-03-12)
6
+
7
+ # [0.0.0-dev.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.2...v0.0.0-dev.1) (2025-03-12)
8
+
9
+
10
+ ### Features
11
+
12
+ * downlaod.js ([7e49fa6](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/7e49fa659c11f219e3d333112c9ae515651ee8f4))
13
+ * remove pwd ([37e5d44](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/37e5d446542a42509f87e571142da93082751df2))
14
+ * roll back example ([b0e7948](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/b0e79486d51629228465ad81c0e66ee65d3f3bdb))
15
+ * update dependencies ([33cf7f6](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/33cf7f683e437484c67a0835222f37bf324f0f0e))
16
+
17
+ ## [4.5.2](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.1...v4.5.2) (2025-03-11)
18
+
19
+
20
+ ### Features
21
+
22
+ * support native 4.5.2 ([#1265](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1265)) ([bb9ed89](https://github.com/AgoraIO-Extensions/Electron-SDK/commit/bb9ed89234a4c732998a67cb2022032afcbcd06b)), closes [#1257](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1257) [#1261](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1261) [#1262](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1262) [#1269](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1269) [#1270](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1270) [#1273](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1273) [#1274](https://github.com/AgoraIO-Extensions/Electron-SDK/issues/1274)
23
+
24
+ ## [4.5.1-build.1-rc.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.1...v4.5.1-build.1-rc.1) (2025-01-15)
25
+
3
26
  ## [4.5.1](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.5.0...v4.5.1) (2025-01-03)
4
27
 
5
28
  # [4.5.0](https://github.com/AgoraIO-Extensions/Electron-SDK/compare/v4.4.0...v4.5.0) (2024-12-10)
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGpuInfoInternal = exports.GpuInfo = void 0;
4
+ //@ts-ignore
5
+ const electron_1 = require("electron");
6
+ /**
7
+ * @ignore
8
+ */
9
+ class GpuInfo {
10
+ constructor() {
11
+ this.videoDecodeAcceleratorSupportedProfile = [];
12
+ }
13
+ }
14
+ exports.GpuInfo = GpuInfo;
15
+ /**
16
+ * @ignore
17
+ */
18
+ const getGpuInfoInternal = (callback) => {
19
+ //@ts-ignore
20
+ if (process.type === 'renderer') {
21
+ console.error('getGpuInfoInternal should be called in main process');
22
+ return;
23
+ }
24
+ const gpuPage = new electron_1.BrowserWindow({
25
+ show: false,
26
+ webPreferences: { offscreen: true },
27
+ });
28
+ gpuPage.loadURL('chrome://gpu');
29
+ let executeJavaScriptText = `` +
30
+ `let videoAccelerationInfo = [];` +
31
+ `let nodeList = document.querySelector('info-view')?.shadowRoot?.querySelector('#video-acceleration-info info-view-table')?.shadowRoot?.querySelectorAll('#info-view-table info-view-table-row') || [];` +
32
+ `for (node of nodeList) {` +
33
+ ` videoAccelerationInfo.push({` +
34
+ ` title: node.shadowRoot.querySelector('#title')?.innerText,` +
35
+ ` value: node.shadowRoot.querySelector('#value')?.innerText,` +
36
+ ` })` +
37
+ `}` +
38
+ `JSON.stringify(videoAccelerationInfo)`;
39
+ gpuPage.webContents
40
+ .executeJavaScript(executeJavaScriptText)
41
+ .then((result) => {
42
+ if (!result) {
43
+ console.error('Failed to get GPU info, chrome://gpu is not available in this environment.');
44
+ }
45
+ let filterResult = JSON.parse(result).filter((item) => {
46
+ return item.title.indexOf('Decode') !== -1;
47
+ });
48
+ let convertResult = [];
49
+ const resolutionPattern = /(\d+)x(\d+) to (\d+)x(\d+)/;
50
+ for (const profile of filterResult) {
51
+ const match = profile.value.match(resolutionPattern);
52
+ if (!match) {
53
+ continue;
54
+ }
55
+ const [_resolution, minWidth, minHeight, maxWidth, maxHeight] = match;
56
+ convertResult.push({
57
+ codec: profile.title,
58
+ minWidth: minWidth ? Number(minWidth) : 0,
59
+ maxWidth: maxWidth ? Number(maxWidth) : 0,
60
+ minHeight: minHeight ? Number(minHeight) : 0,
61
+ maxHeight: maxHeight ? Number(maxHeight) : 0,
62
+ });
63
+ }
64
+ typeof callback === 'function' && callback(convertResult);
65
+ })
66
+ .catch((error) => {
67
+ console.error('Failed to get GPU info, please import agora-electron-sdk in main process', error);
68
+ typeof callback === 'function' && callback(error);
69
+ })
70
+ .finally(() => {
71
+ gpuPage.close();
72
+ });
73
+ };
74
+ exports.getGpuInfoInternal = getGpuInfoInternal;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebCodecsDecoder = void 0;
4
+ const AgoraBase_1 = require("../Private/AgoraBase");
5
+ const Types_1 = require("../Types");
6
+ const Utils_1 = require("../Utils");
7
+ const frameTypeMapping = {
8
+ [AgoraBase_1.VideoFrameType.VideoFrameTypeDeltaFrame]: 'delta',
9
+ [AgoraBase_1.VideoFrameType.VideoFrameTypeKeyFrame]: 'key',
10
+ [AgoraBase_1.VideoFrameType.VideoFrameTypeDroppableFrame]: 'delta', // this is a workaround for the issue that the frameType is not correct
11
+ };
12
+ class WebCodecsDecoder {
13
+ constructor(renders, onError, context) {
14
+ this.renderers = [];
15
+ // eslint-disable-next-line auto-import/auto-import
16
+ this.pendingFrame = null;
17
+ this._currentCodecConfig = null;
18
+ this._base_ts = 0;
19
+ this._base_ts_ntp = 1;
20
+ this._last_ts_ntp = 1;
21
+ this._decode_retry_count = 0;
22
+ this.renderers = renders;
23
+ this._cacheContext = context;
24
+ this._decoder = new VideoDecoder({
25
+ // @ts-ignore
26
+ output: this._output.bind(this),
27
+ error: (e) => {
28
+ onError(e);
29
+ },
30
+ });
31
+ }
32
+ // eslint-disable-next-line auto-import/auto-import
33
+ _output(frame) {
34
+ // Schedule the frame to be rendered.
35
+ this._renderFrame(frame);
36
+ }
37
+ // eslint-disable-next-line auto-import/auto-import
38
+ _renderFrame(frame) {
39
+ if (!this.pendingFrame) {
40
+ // Schedule rendering in the next animation frame.
41
+ // eslint-disable-next-line auto-import/auto-import
42
+ requestAnimationFrame(this.renderAnimationFrame.bind(this));
43
+ }
44
+ else {
45
+ // Close the current pending frame before replacing it.
46
+ this.pendingFrame.close();
47
+ }
48
+ // Set or replace the pending frame.
49
+ this.pendingFrame = frame;
50
+ }
51
+ renderAnimationFrame() {
52
+ for (let renderer of this.renderers) {
53
+ if (renderer.rendererType !== Types_1.RendererType.WEBCODECSRENDERER) {
54
+ continue;
55
+ }
56
+ renderer.drawFrame(this.pendingFrame, this._currentCodecConfig);
57
+ this.pendingFrame = null;
58
+ }
59
+ }
60
+ decoderConfigure(frameInfo) {
61
+ this.pendingFrame = null;
62
+ // @ts-ignore
63
+ let codec = Utils_1.AgoraEnv.CapabilityManager?.frameCodecMapping[frameInfo.codecType]
64
+ ?.codec;
65
+ if (!codec) {
66
+ Utils_1.AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this._cacheContext);
67
+ throw new Error(`codec ${frameInfo.codecType} is not in frameCodecMapping,failed to configure decoder, fallback to native decoder`);
68
+ }
69
+ this._currentCodecConfig = {
70
+ codecType: frameInfo.codecType,
71
+ codedWidth: frameInfo.width,
72
+ codedHeight: frameInfo.height,
73
+ rotation: frameInfo.rotation,
74
+ };
75
+ this._decoder.configure({
76
+ codec: codec,
77
+ codedWidth: frameInfo.width,
78
+ codedHeight: frameInfo.height,
79
+ });
80
+ (0, Utils_1.logInfo)(`configure decoder: codedWidth: ${frameInfo.width}, codedHeight: ${frameInfo.height},codec: ${codec}`);
81
+ }
82
+ updateTimestamps(ts) {
83
+ if (this._base_ts !== 0) {
84
+ if (ts > this._base_ts) {
85
+ this._last_ts_ntp =
86
+ this._base_ts_ntp + Math.floor(((ts - this._base_ts) * 1000) / 90);
87
+ }
88
+ else {
89
+ this._base_ts = ts;
90
+ this._last_ts_ntp++;
91
+ this._base_ts_ntp = this._last_ts_ntp;
92
+ }
93
+ }
94
+ else {
95
+ this._base_ts = ts;
96
+ this._last_ts_ntp = 1;
97
+ }
98
+ }
99
+ handleCodecIsChanged(frameInfo) {
100
+ if (this._currentCodecConfig?.codecType !== frameInfo.codecType ||
101
+ this._currentCodecConfig?.codedWidth !== frameInfo.width ||
102
+ this._currentCodecConfig?.codedHeight !== frameInfo.height ||
103
+ this._currentCodecConfig?.rotation !== frameInfo.rotation) {
104
+ (0, Utils_1.logInfo)('frameInfo has changed, reconfigure decoder');
105
+ this._decoder.reset();
106
+ this.decoderConfigure(frameInfo);
107
+ }
108
+ }
109
+ // @ts-ignore
110
+ decodeFrame(imageBuffer, frameInfo, ts) {
111
+ try {
112
+ this.handleCodecIsChanged(frameInfo);
113
+ }
114
+ catch (error) {
115
+ (0, Utils_1.logInfo)(error);
116
+ return;
117
+ }
118
+ if (!imageBuffer) {
119
+ (0, Utils_1.logDebug)('imageBuffer is empty, skip decode frame');
120
+ return;
121
+ }
122
+ let frameType;
123
+ if (frameInfo.frameType !== undefined) {
124
+ // @ts-ignore
125
+ frameType = frameTypeMapping[frameInfo.frameType];
126
+ }
127
+ if (!frameType) {
128
+ (0, Utils_1.logDebug)('frameType is not in frameTypeMapping, skip decode frame');
129
+ return;
130
+ }
131
+ this.updateTimestamps(ts);
132
+ try {
133
+ this._decoder.decode(new EncodedVideoChunk({
134
+ data: imageBuffer,
135
+ timestamp: this._last_ts_ntp,
136
+ // @ts-ignore
137
+ type: frameType,
138
+ // @ts-ignore
139
+ transfer: [imageBuffer.buffer],
140
+ }));
141
+ this._decode_retry_count = 0;
142
+ }
143
+ catch (e) {
144
+ /// There are some cases that the decoder failed to decode the frame, we will retry for a few times
145
+ /// If the decoder still failed to decode the frame, we will fallback to native decoder
146
+ /// The retry count is defined in AgoraEnv.maxDecodeRetryCount
147
+ /// The retry count will be reset to 0 when the decoder successfully decode a frame
148
+ if (this._decode_retry_count >= Utils_1.AgoraEnv.maxDecodeRetryCount) {
149
+ Utils_1.AgoraEnv.AgoraRendererManager?.handleWebCodecsFallback(this._cacheContext);
150
+ throw new Error(`failed to decode frame over ${this._decode_retry_count} times, fallback to native decoder`);
151
+ }
152
+ this._decode_retry_count++;
153
+ }
154
+ }
155
+ reset() {
156
+ this._base_ts = 0;
157
+ this._base_ts_ntp = 1;
158
+ this._last_ts_ntp = 1;
159
+ this._decoder.reset();
160
+ }
161
+ release() {
162
+ try {
163
+ if (this.pendingFrame) {
164
+ this.pendingFrame.close();
165
+ }
166
+ this._decoder.close();
167
+ }
168
+ catch (e) { }
169
+ this.pendingFrame = null;
170
+ }
171
+ }
172
+ exports.WebCodecsDecoder = WebCodecsDecoder;
@@ -148,6 +148,10 @@ var WarnCodeType;
148
148
  * @ignore
149
149
  */
150
150
  WarnCodeType[WarnCodeType["WarnAdmImproperSettings"] = 1053] = "WarnAdmImproperSettings";
151
+ /**
152
+ * @ignore
153
+ */
154
+ WarnCodeType[WarnCodeType["WarnAdmPopState"] = 1055] = "WarnAdmPopState";
151
155
  /**
152
156
  * @ignore
153
157
  */
@@ -1559,7 +1563,7 @@ var AudioProfileType;
1559
1563
  */
1560
1564
  AudioProfileType[AudioProfileType["AudioProfileMusicHighQualityStereo"] = 5] = "AudioProfileMusicHighQualityStereo";
1561
1565
  /**
1562
- * 6: A sample rate of 16 kHz, audio encoding, mono, and Acoustic Echo Cancellation (AES) enabled.
1566
+ * 6: A sample rate of 16 kHz, audio encoding, mono, and Acoustic Echo Cancellation (AEC) enabled.
1563
1567
  */
1564
1568
  AudioProfileType[AudioProfileType["AudioProfileIot"] = 6] = "AudioProfileIot";
1565
1569
  /**
@@ -1592,10 +1596,18 @@ var AudioScenarioType;
1592
1596
  * 8: Meeting scenario that mainly contains the human voice.
1593
1597
  */
1594
1598
  AudioScenarioType[AudioScenarioType["AudioScenarioMeeting"] = 8] = "AudioScenarioMeeting";
1599
+ /**
1600
+ * @ignore
1601
+ */
1602
+ AudioScenarioType[AudioScenarioType["AudioScenarioAiServer"] = 9] = "AudioScenarioAiServer";
1603
+ /**
1604
+ * 10: AI conversation scenario, which is only applicable to scenarios where the user interacts with the conversational AI agent created by.
1605
+ */
1606
+ AudioScenarioType[AudioScenarioType["AudioScenarioAiClient"] = 10] = "AudioScenarioAiClient";
1595
1607
  /**
1596
1608
  * The number of enumerations.
1597
1609
  */
1598
- AudioScenarioType[AudioScenarioType["AudioScenarioNum"] = 9] = "AudioScenarioNum";
1610
+ AudioScenarioType[AudioScenarioType["AudioScenarioNum"] = 11] = "AudioScenarioNum";
1599
1611
  })(AudioScenarioType = exports.AudioScenarioType || (exports.AudioScenarioType = {}));
1600
1612
  /**
1601
1613
  * The format of the video frame.
@@ -1959,7 +1971,7 @@ var LocalVideoStreamReason;
1959
1971
  */
1960
1972
  LocalVideoStreamReason[LocalVideoStreamReason["LocalVideoStreamReasonScreenCaptureResumed"] = 29] = "LocalVideoStreamReasonScreenCaptureResumed";
1961
1973
  /**
1962
- * 30: The displayer used for screen capture is disconnected.
1974
+ * 30: The displayer used for screen capture is disconnected. The current screen sharing has been paused. Prompt the user to restart the screen sharing.
1963
1975
  */
1964
1976
  LocalVideoStreamReason[LocalVideoStreamReason["LocalVideoStreamReasonScreenCaptureDisplayDisconnected"] = 30] = "LocalVideoStreamReasonScreenCaptureDisplayDisconnected";
1965
1977
  })(LocalVideoStreamReason = exports.LocalVideoStreamReason || (exports.LocalVideoStreamReason = {}));
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("../AgoraBase");
@@ -3,10 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.emitEvent = exports.callIrisApi = exports.EVENT_PROCESSORS = exports.EVENT_TYPE = exports.isDebuggable = exports.setDebuggable = exports.DeviceEventEmitter = void 0;
6
+ exports.emitEvent = exports.callIrisApi = exports.EVENT_PROCESSORS = exports.EVENT_TYPE = exports.isDebuggable = exports.setDebuggable = exports.AgoraElectronBridge = exports.DeviceEventEmitter = void 0;
7
7
  const eventemitter3_1 = __importDefault(require("eventemitter3"));
8
8
  const json_bigint_1 = __importDefault(require("json-bigint"));
9
9
  const JSON = (0, json_bigint_1.default)({ storeAsString: true });
10
+ const AgoraSdk_1 = __importDefault(require("../../AgoraSdk"));
10
11
  const Utils_1 = require("../../Utils");
11
12
  const AgoraBaseImpl_1 = require("../impl/AgoraBaseImpl");
12
13
  const AgoraMediaBaseImpl_1 = require("../impl/AgoraMediaBaseImpl");
@@ -24,8 +25,9 @@ const MusicContentCenterInternal_1 = require("./MusicContentCenterInternal");
24
25
  const RtcEngineExInternal_1 = require("./RtcEngineExInternal");
25
26
  // @ts-ignore
26
27
  exports.DeviceEventEmitter = new eventemitter3_1.default();
27
- const AgoraRtcNg = Utils_1.AgoraEnv.AgoraElectronBridge;
28
- AgoraRtcNg.OnEvent('call_back_with_buffer', (...params) => {
28
+ const AgoraNode = require('../../../build/Release/agora_node_ext');
29
+ exports.AgoraElectronBridge = new AgoraNode.AgoraElectronBridge();
30
+ exports.AgoraElectronBridge.OnEvent('call_back_with_buffer', (...params) => {
29
31
  try {
30
32
  handleEvent(...params);
31
33
  }
@@ -285,6 +287,7 @@ function handleEvent(...[event, data, buffers]) {
285
287
  function callIrisApi(funcName, params) {
286
288
  try {
287
289
  const buffers = [];
290
+ const rtcEngine = (0, AgoraSdk_1.default)();
288
291
  if (funcName.startsWith('MediaEngine_')) {
289
292
  switch (funcName) {
290
293
  case 'MediaEngine_pushAudioFrame_c71f4ab':
@@ -329,11 +332,11 @@ function callIrisApi(funcName, params) {
329
332
  else if (funcName.startsWith('RtcEngine_')) {
330
333
  switch (funcName) {
331
334
  case 'RtcEngine_initialize_0320339':
332
- AgoraRtcNg.InitializeEnv();
335
+ exports.AgoraElectronBridge.InitializeEnv();
333
336
  break;
334
337
  case 'RtcEngine_release':
335
- AgoraRtcNg.CallApi(funcName, JSON.stringify(params), buffers, buffers.length);
336
- AgoraRtcNg.ReleaseEnv();
338
+ exports.AgoraElectronBridge.CallApi(funcName, JSON.stringify(params), buffers, buffers.length);
339
+ exports.AgoraElectronBridge.ReleaseEnv();
337
340
  return;
338
341
  case 'RtcEngine_sendMetaData':
339
342
  // metadata.buffer
@@ -359,7 +362,17 @@ function callIrisApi(funcName, params) {
359
362
  break;
360
363
  }
361
364
  }
362
- let { callApiReturnCode, callApiResult } = AgoraRtcNg.CallApi(funcName, JSON.stringify(params), buffers, buffers.length);
365
+ if (funcName.indexOf('joinChannel') != -1) {
366
+ if (Utils_1.AgoraEnv.CapabilityManager?.webCodecsDecoderEnabled) {
367
+ rtcEngine.getMediaEngine().registerVideoEncodedFrameObserver({});
368
+ }
369
+ }
370
+ else if (funcName.indexOf('leaveChannel') != -1) {
371
+ if (Utils_1.AgoraEnv.CapabilityManager?.webCodecsDecoderEnabled) {
372
+ rtcEngine.getMediaEngine().unregisterVideoEncodedFrameObserver({});
373
+ }
374
+ }
375
+ let { callApiReturnCode, callApiResult } = exports.AgoraElectronBridge.CallApi(funcName, JSON.stringify(params), buffers, buffers.length);
363
376
  let ret = callApiResult;
364
377
  if (ret !== undefined && ret !== null && ret !== '' && ret !== 'null') {
365
378
  const retObj = JSON.parse(ret);
@@ -5,13 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RtcEngineExInternal = void 0;
7
7
  const ts_interface_checker_1 = require("ts-interface-checker");
8
+ const IrisApiEngine_1 = require("../../Private/internal/IrisApiEngine");
8
9
  const Utils_1 = require("../../Utils");
9
10
  let RendererManager;
10
- if (typeof window !== 'undefined') {
11
+ let CapabilityManager;
12
+ //@ts-ignore
13
+ if (process.type === 'renderer') {
11
14
  RendererManager = require('../../Renderer/RendererManager').RendererManager;
15
+ CapabilityManager =
16
+ require('../../Renderer/CapabilityManager').CapabilityManager;
12
17
  }
13
18
  else {
14
19
  RendererManager = undefined;
20
+ CapabilityManager = undefined;
15
21
  }
16
22
  const AgoraBase_1 = require("../AgoraBase");
17
23
  const AgoraMediaBase_1 = require("../AgoraMediaBase");
@@ -22,7 +28,7 @@ const AgoraMediaBase_ti_1 = __importDefault(require("../ti/AgoraMediaBase-ti"));
22
28
  const IAgoraRtcEngine_ti_1 = __importDefault(require("../ti/IAgoraRtcEngine-ti"));
23
29
  const AgoraH265TranscoderInternal_1 = require("./AgoraH265TranscoderInternal");
24
30
  const AudioDeviceManagerInternal_1 = require("./AudioDeviceManagerInternal");
25
- const IrisApiEngine_1 = require("./IrisApiEngine");
31
+ const IrisApiEngine_2 = require("./IrisApiEngine");
26
32
  const LocalSpatialAudioEngineInternal_1 = require("./LocalSpatialAudioEngineInternal");
27
33
  const MediaEngineInternal_1 = require("./MediaEngineInternal");
28
34
  const MediaPlayerInternal_1 = require("./MediaPlayerInternal");
@@ -40,21 +46,24 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
40
46
  this._h265_transcoder = new AgoraH265TranscoderInternal_1.H265TranscoderInternal();
41
47
  }
42
48
  initialize(context) {
49
+ const ret = super.initialize(context);
50
+ IrisApiEngine_2.callIrisApi.call(this, 'RtcEngine_setAppType', {
51
+ appType: 3,
52
+ });
43
53
  if (Utils_1.AgoraEnv.webEnvReady) {
44
54
  // @ts-ignore
45
55
  window.AgoraEnv = Utils_1.AgoraEnv;
46
56
  if (Utils_1.AgoraEnv.AgoraRendererManager === undefined && RendererManager) {
47
57
  Utils_1.AgoraEnv.AgoraRendererManager = new RendererManager();
48
58
  }
59
+ if (Utils_1.AgoraEnv.CapabilityManager === undefined && CapabilityManager) {
60
+ Utils_1.AgoraEnv.CapabilityManager = new CapabilityManager();
61
+ }
49
62
  }
50
- const ret = super.initialize(context);
51
- IrisApiEngine_1.callIrisApi.call(this, 'RtcEngine_setAppType', {
52
- appType: 3,
53
- });
54
63
  return ret;
55
64
  }
56
65
  release(sync = false) {
57
- Utils_1.AgoraEnv.AgoraElectronBridge.ReleaseRenderer();
66
+ IrisApiEngine_1.AgoraElectronBridge.ReleaseRenderer();
58
67
  Utils_1.AgoraEnv.AgoraRendererManager?.release();
59
68
  Utils_1.AgoraEnv.AgoraRendererManager = undefined;
60
69
  this._media_engine.release();
@@ -74,6 +83,8 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
74
83
  MediaRecorderInternal_1.MediaRecorderInternal._observers.clear();
75
84
  this._h265_transcoder.release();
76
85
  this.removeAllListeners();
86
+ Utils_1.AgoraEnv.CapabilityManager?.release();
87
+ Utils_1.AgoraEnv.CapabilityManager = undefined;
77
88
  super.release(sync);
78
89
  }
79
90
  _addListenerPreCheck(eventType) {
@@ -118,7 +129,7 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
118
129
  addListener(eventType, listener) {
119
130
  this._addListenerPreCheck(eventType);
120
131
  const callback = (eventProcessor, data) => {
121
- if (eventProcessor.type(data) !== IrisApiEngine_1.EVENT_TYPE.IRtcEngine) {
132
+ if (eventProcessor.type(data) !== IrisApiEngine_2.EVENT_TYPE.IRtcEngine) {
122
133
  return;
123
134
  }
124
135
  eventProcessor.func.map((it) => {
@@ -127,20 +138,20 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
127
138
  };
128
139
  // @ts-ignore
129
140
  listener.agoraCallback = callback;
130
- IrisApiEngine_1.DeviceEventEmitter.addListener(eventType, callback);
141
+ IrisApiEngine_2.DeviceEventEmitter.addListener(eventType, callback);
131
142
  }
132
143
  removeListener(eventType, listener) {
133
- IrisApiEngine_1.DeviceEventEmitter.removeListener(eventType,
144
+ IrisApiEngine_2.DeviceEventEmitter.removeListener(eventType,
134
145
  // @ts-ignore
135
146
  listener?.agoraCallback ?? listener);
136
147
  }
137
148
  removeAllListeners(eventType) {
138
- IrisApiEngine_1.DeviceEventEmitter.removeAllListeners(eventType);
149
+ IrisApiEngine_2.DeviceEventEmitter.removeAllListeners(eventType);
139
150
  }
140
151
  getVersion() {
141
152
  const apiType = 'RtcEngine_getVersion_915cb25';
142
153
  const jsonParams = {};
143
- const jsonResults = IrisApiEngine_1.callIrisApi.call(this, apiType, jsonParams);
154
+ const jsonResults = IrisApiEngine_2.callIrisApi.call(this, apiType, jsonParams);
144
155
  return {
145
156
  build: jsonResults.build,
146
157
  version: jsonResults.result,
@@ -198,6 +209,10 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
198
209
  RtcEngineExInternal._metadata_observer.filter((value) => value !== observer);
199
210
  return super.unregisterMediaMetadataObserver(observer, type);
200
211
  }
212
+ setVideoEncoderConfiguration(config) {
213
+ Utils_1.AgoraEnv.encodeAlpha = config?.advanceOptions?.encodeAlpha ?? false;
214
+ return super.setVideoEncoderConfiguration(config);
215
+ }
201
216
  getApiTypeFromJoinChannel(token, channelId, uid, options) {
202
217
  if (Utils_1.AgoraEnv.AgoraRendererManager) {
203
218
  Utils_1.AgoraEnv.AgoraRendererManager.defaultChannelId = channelId;
@@ -297,24 +312,24 @@ class RtcEngineExInternal extends IAgoraRtcEngineExImpl_1.IRtcEngineExImpl {
297
312
  };
298
313
  },
299
314
  };
300
- const { result, sources } = IrisApiEngine_1.callIrisApi.call(this, apiType, jsonParams);
315
+ const { result, sources } = IrisApiEngine_2.callIrisApi.call(this, apiType, jsonParams);
301
316
  const screenCaptureSources = result.map((value) => {
302
317
  if (!value.thumbImage?.buffer || !value.thumbImage?.length) {
303
318
  value.thumbImage.buffer = undefined;
304
319
  }
305
320
  else {
306
- value.thumbImage.buffer = Utils_1.AgoraEnv.AgoraElectronBridge.GetBuffer(value.thumbImage.buffer, value.thumbImage.length);
321
+ value.thumbImage.buffer = IrisApiEngine_1.AgoraElectronBridge.GetBuffer(value.thumbImage.buffer, value.thumbImage.length);
307
322
  }
308
323
  if (!value.iconImage?.buffer || !value.iconImage?.length) {
309
324
  value.iconImage.buffer = undefined;
310
325
  }
311
326
  else {
312
- value.iconImage.buffer = Utils_1.AgoraEnv.AgoraElectronBridge.GetBuffer(value.iconImage.buffer, value.iconImage.length);
327
+ value.iconImage.buffer = IrisApiEngine_1.AgoraElectronBridge.GetBuffer(value.iconImage.buffer, value.iconImage.length);
313
328
  }
314
329
  value.sourceDisplayId = (0, Utils_1.parseIntPtr2Number)(value.sourceDisplayId);
315
330
  return value;
316
331
  });
317
- IrisApiEngine_1.callIrisApi.call(this, 'RtcEngine_releaseScreenCaptureSources', {
332
+ IrisApiEngine_2.callIrisApi.call(this, 'RtcEngine_releaseScreenCaptureSources', {
318
333
  sources,
319
334
  });
320
335
  return screenCaptureSources;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //@ts-ignore
4
+ const electron_1 = require("electron");
5
+ const gpu_utils_1 = require("../../Decoder/gpu-utils");
6
+ const Types_1 = require("../../Types");
7
+ //@ts-ignore
8
+ if (process.type !== 'renderer') {
9
+ electron_1.ipcMain.handle(Types_1.IPCMessageType.AGORA_IPC_GET_GPU_INFO, () => {
10
+ return new Promise((resolve) => {
11
+ (0, gpu_utils_1.getGpuInfoInternal)((result) => {
12
+ resolve(result);
13
+ });
14
+ });
15
+ });
16
+ console.log('[agora-electron] main process AgoraIPCMain handler registered');
17
+ electron_1.app.on('quit', () => {
18
+ electron_1.ipcMain.removeHandler(Types_1.IPCMessageType.AGORA_IPC_GET_GPU_INFO);
19
+ console.log('[agora-electron] main process AgoraIPCMain handler removed');
20
+ });
21
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ipcSend = void 0;
4
+ //@ts-ignore
5
+ const electron_1 = require("electron");
6
+ const Types_1 = require("../../Types");
7
+ const Utils_1 = require("../../Utils");
8
+ async function ipcSend(channel, ...args) {
9
+ if (!Object.values(Types_1.IPCMessageType).includes(channel)) {
10
+ (0, Utils_1.logError)('Invalid IPCMessageType');
11
+ return;
12
+ }
13
+ //@ts-ignore
14
+ if (process.type === 'renderer') {
15
+ return await electron_1.ipcRenderer.invoke(channel, ...args);
16
+ }
17
+ else {
18
+ (0, Utils_1.logError)('Not in renderer process, cannot send ipc message');
19
+ }
20
+ }
21
+ exports.ipcSend = ipcSend;