reactor-effect-native 0.0.0-reserved.0 → 0.2.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.
Files changed (111) hide show
  1. package/Dockerfile +38 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +28 -0
  4. package/README.md +106 -2
  5. package/dist/_internal/bridge.d.ts +49 -0
  6. package/dist/_internal/bridge.d.ts.map +1 -0
  7. package/dist/_internal/bridge.js +452 -0
  8. package/dist/_internal/bridge.js.map +1 -0
  9. package/dist/_internal/peer.d.ts +57 -0
  10. package/dist/_internal/peer.d.ts.map +1 -0
  11. package/dist/_internal/peer.js +479 -0
  12. package/dist/_internal/peer.js.map +1 -0
  13. package/dist/index.d.ts +25 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +41 -0
  16. package/dist/index.js.map +1 -0
  17. package/lib/darwin-arm64/libreactor_effect_native.dylib +0 -0
  18. package/lib/darwin-arm64/native-identity.json +18 -0
  19. package/lib/linux-x64/libreactor_effect_native.so +0 -0
  20. package/lib/linux-x64/native-identity.json +20 -0
  21. package/notices/effect-LICENSE +21 -0
  22. package/notices/native-rust/NOTICE.md +27 -0
  23. package/notices/native-rust/bytes-1.12.1-LICENSE +25 -0
  24. package/notices/native-rust/itoa-1.0.18-LICENSE-APACHE +176 -0
  25. package/notices/native-rust/memchr-2.8.3-LICENSE-MIT +21 -0
  26. package/notices/native-rust/prost-0.13.5-LICENSE +201 -0
  27. package/notices/native-rust/serde-1.0.229-LICENSE-APACHE +176 -0
  28. package/notices/native-rust/serde_json-1.0.151-LICENSE-APACHE +176 -0
  29. package/notices/native-rust/zmij-1.0.23-LICENSE-MIT +23 -0
  30. package/notices/reactor-webrtc/WebRTC-LICENSE +29 -0
  31. package/notices/reactor-webrtc/WebRTC-PATENTS +24 -0
  32. package/notices/reactor-webrtc/reactor-webrtc-linux-x64-release.sbom.json +660 -0
  33. package/notices/reactor-webrtc/reactor-webrtc-mac-arm64-release.sbom.json +631 -0
  34. package/notices/reactor-webrtc/third-party/README.md +58 -0
  35. package/notices/reactor-webrtc/third-party/abseil-cpp/LICENSE +203 -0
  36. package/notices/reactor-webrtc/third-party/abseil-cpp/README.chromium +55 -0
  37. package/notices/reactor-webrtc/third-party/boringssl/LICENSE +238 -0
  38. package/notices/reactor-webrtc/third-party/boringssl/README.chromium +15 -0
  39. package/notices/reactor-webrtc/third-party/compiler-rt/LICENSE.TXT +311 -0
  40. package/notices/reactor-webrtc/third-party/compiler-rt/README.chromium +15 -0
  41. package/notices/reactor-webrtc/third-party/cpuinfo/LICENSE +27 -0
  42. package/notices/reactor-webrtc/third-party/cpuinfo/README.chromium +15 -0
  43. package/notices/reactor-webrtc/third-party/dav1d/LICENSE +23 -0
  44. package/notices/reactor-webrtc/third-party/dav1d/README.chromium +40 -0
  45. package/notices/reactor-webrtc/third-party/farmhash/LICENSE +19 -0
  46. package/notices/reactor-webrtc/third-party/farmhash/README.chromium +21 -0
  47. package/notices/reactor-webrtc/third-party/fft2d/LICENSE +3 -0
  48. package/notices/reactor-webrtc/third-party/fft2d/README.chromium +24 -0
  49. package/notices/reactor-webrtc/third-party/flatbuffers/LICENSE +202 -0
  50. package/notices/reactor-webrtc/third-party/flatbuffers/README.chromium +18 -0
  51. package/notices/reactor-webrtc/third-party/fp16/LICENSE +12 -0
  52. package/notices/reactor-webrtc/third-party/fp16/README.chromium +16 -0
  53. package/notices/reactor-webrtc/third-party/fxdiv/LICENSE +10 -0
  54. package/notices/reactor-webrtc/third-party/fxdiv/README.chromium +16 -0
  55. package/notices/reactor-webrtc/third-party/gemmlowp/LICENSE +202 -0
  56. package/notices/reactor-webrtc/third-party/gemmlowp/README.chromium +14 -0
  57. package/notices/reactor-webrtc/third-party/grpc/LICENSE +610 -0
  58. package/notices/reactor-webrtc/third-party/grpc/README.chromium +30 -0
  59. package/notices/reactor-webrtc/third-party/jsoncpp/LICENSE +55 -0
  60. package/notices/reactor-webrtc/third-party/jsoncpp/README.chromium +20 -0
  61. package/notices/reactor-webrtc/third-party/libaom/LICENSE +27 -0
  62. package/notices/reactor-webrtc/third-party/libaom/PATENTS +108 -0
  63. package/notices/reactor-webrtc/third-party/libaom/README.chromium +61 -0
  64. package/notices/reactor-webrtc/third-party/libgav1/LICENSE +202 -0
  65. package/notices/reactor-webrtc/third-party/libgav1/README.chromium +33 -0
  66. package/notices/reactor-webrtc/third-party/libjpeg_turbo/LICENSE.md.chromium +236 -0
  67. package/notices/reactor-webrtc/third-party/libjpeg_turbo/README.chromium +66 -0
  68. package/notices/reactor-webrtc/third-party/libsrtp/LICENSE +35 -0
  69. package/notices/reactor-webrtc/third-party/libsrtp/README.chromium +17 -0
  70. package/notices/reactor-webrtc/third-party/libvpx/LICENSE +31 -0
  71. package/notices/reactor-webrtc/third-party/libvpx/PATENTS +23 -0
  72. package/notices/reactor-webrtc/third-party/libvpx/README.chromium +73 -0
  73. package/notices/reactor-webrtc/third-party/libyuv/LICENSE +29 -0
  74. package/notices/reactor-webrtc/third-party/libyuv/README.chromium +13 -0
  75. package/notices/reactor-webrtc/third-party/neon_2_sse/LICENSE +29 -0
  76. package/notices/reactor-webrtc/third-party/neon_2_sse/README.chromium +21 -0
  77. package/notices/reactor-webrtc/third-party/opus/COPYING +44 -0
  78. package/notices/reactor-webrtc/third-party/opus/README.chromium +41 -0
  79. package/notices/reactor-webrtc/third-party/perfetto/LICENSE +285 -0
  80. package/notices/reactor-webrtc/third-party/perfetto/README.chromium +12 -0
  81. package/notices/reactor-webrtc/third-party/pffft/LICENSE +45 -0
  82. package/notices/reactor-webrtc/third-party/pffft/README.chromium +43 -0
  83. package/notices/reactor-webrtc/third-party/protobuf/LICENSE +32 -0
  84. package/notices/reactor-webrtc/third-party/protobuf/README.chromium +325 -0
  85. package/notices/reactor-webrtc/third-party/pthreadpool/LICENSE +26 -0
  86. package/notices/reactor-webrtc/third-party/pthreadpool/README.chromium +19 -0
  87. package/notices/reactor-webrtc/third-party/re2/LICENSE +27 -0
  88. package/notices/reactor-webrtc/third-party/re2/README.chromium +15 -0
  89. package/notices/reactor-webrtc/third-party/rnnoise/COPYING +31 -0
  90. package/notices/reactor-webrtc/third-party/rnnoise/README.chromium +30 -0
  91. package/notices/reactor-webrtc/third-party/ruy/LICENSE +202 -0
  92. package/notices/reactor-webrtc/third-party/ruy/README.chromium +20 -0
  93. package/notices/reactor-webrtc/third-party/tflite/LICENSE +203 -0
  94. package/notices/reactor-webrtc/third-party/tflite/README.chromium +22 -0
  95. package/notices/reactor-webrtc/third-party/xnnpack/LICENSE +31 -0
  96. package/notices/reactor-webrtc/third-party/xnnpack/README.chromium +18 -0
  97. package/notices/reactor-webrtc/third-party/zlib/LICENSE +22 -0
  98. package/notices/reactor-webrtc/third-party/zlib/README.chromium +38 -0
  99. package/notices/reactor-webrtc-LICENSE +201 -0
  100. package/notices/reactor-webrtc-NOTICE.md +32 -0
  101. package/package.json +54 -4
  102. package/rust/.cargo/config.toml +5 -0
  103. package/rust/Cargo.lock +208 -0
  104. package/rust/Cargo.toml +19 -0
  105. package/rust/build.rs +159 -0
  106. package/rust/include/reactor_effect_native.h +118 -0
  107. package/rust/src/lib.rs +2343 -0
  108. package/scripts/build.sh +35 -0
  109. package/scripts/install-linux-toolchain.sh +47 -0
  110. package/scripts/stage.mjs +107 -0
  111. package/scripts/stage.sh +31 -0
@@ -0,0 +1,479 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import * as Stream from "effect/Stream";
4
+ import { ReactorError, ErrorCode } from "reactor-effect-client";
5
+ import { Observations, errorOf } from "reactor-effect-client/host";
6
+ import { encodeNativeJson, encodeNativeText, NativeBridge, NativeCall, } from "./bridge.js";
7
+ const stateValues = new Set([
8
+ "new",
9
+ "connecting",
10
+ "connected",
11
+ "disconnected",
12
+ "failed",
13
+ "closed",
14
+ ]);
15
+ const isErrorCode = Schema.is(ErrorCode);
16
+ const statsBigInts = new Set([
17
+ "bytesSent",
18
+ "bytesReceived",
19
+ "packetsSent",
20
+ "packetsReceived",
21
+ "retransmittedPacketsSent",
22
+ "priority",
23
+ ]);
24
+ const validateNativeTracks = (tracks) => {
25
+ const incomingVideo = tracks.filter((track) => track.direction === "recvonly" && track.kind === "video").length;
26
+ const incomingAudio = tracks.filter((track) => track.direction === "recvonly" && track.kind === "audio").length;
27
+ if (incomingVideo > 1 || incomingAudio > 1) {
28
+ throw new ReactorError("UnsupportedCapability", "native WebRTC currently supports at most one incoming video and one incoming audio track because reactor-webrtc does not expose the remote track MID to its observer", { outcome: "not-submitted" });
29
+ }
30
+ };
31
+ const record = (value, what) => {
32
+ if (value === null || typeof value !== "object" || Array.isArray(value))
33
+ throw new ReactorError("Protocol", `native ${what} is not an object`);
34
+ return value;
35
+ };
36
+ const string = (value, what) => {
37
+ if (typeof value !== "string")
38
+ throw new ReactorError("Protocol", `native ${what} is not a string`);
39
+ return value;
40
+ };
41
+ const integer = (value, what) => {
42
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)
43
+ throw new ReactorError("Protocol", `native ${what} is not a nonnegative safe integer`);
44
+ return value;
45
+ };
46
+ const bigint = (value, what) => {
47
+ if (typeof value !== "string" || !/^[0-9]+$/.test(value))
48
+ throw new ReactorError("Protocol", `native ${what} is not an unsigned integer string`);
49
+ return BigInt(value);
50
+ };
51
+ const nativeError = (cause, operation) => cause instanceof ReactorError ? cause : errorOf(cause, "Native", operation);
52
+ const parseMapping = (value) => {
53
+ if (!Array.isArray(value) || value.length > 64)
54
+ throw new ReactorError("Protocol", "native prepare returned an invalid mapping list");
55
+ return Object.freeze(value.map((item) => {
56
+ const entry = record(item, "mapping");
57
+ const name = string(entry.name, "mapping.name"), kind = string(entry.kind, "mapping.kind"), direction = string(entry.direction, "mapping.direction"), mid = string(entry.mid, "mapping.mid");
58
+ if (kind !== "audio" && kind !== "video")
59
+ throw new ReactorError("Protocol", "native mapping has an unknown track kind");
60
+ if (direction !== "recvonly" && direction !== "sendonly")
61
+ throw new ReactorError("Protocol", "native mapping has an unknown direction");
62
+ return Object.freeze({ name, kind, direction, mid });
63
+ }));
64
+ };
65
+ const parsePrepared = (value) => {
66
+ const response = record(value, "prepare response"), sdp = string(response.sdp, "prepare.sdp"), mapping = parseMapping(response.mapping);
67
+ if (sdp.length === 0)
68
+ throw new ReactorError("Protocol", "native prepare returned an empty SDP offer");
69
+ return Object.freeze({ sdp, mapping });
70
+ };
71
+ const iceServers = (servers) => servers.map((server) => {
72
+ const urls = typeof server.urls === "string" ? [server.urls] : [...server.urls];
73
+ if (urls.length === 0 || urls.some((url) => typeof url !== "string" || url.length === 0))
74
+ throw new ReactorError("InvalidInput", "native ICE server has no usable URL", {
75
+ outcome: "not-submitted",
76
+ });
77
+ if (server.credential !== undefined && typeof server.credential !== "string")
78
+ throw new ReactorError("UnsupportedCapability", "native ICE supports password credentials, not OAuth credential objects", { outcome: "not-submitted" });
79
+ return Object.freeze({
80
+ urls: Object.freeze(urls),
81
+ username: server.username ?? "",
82
+ credential: server.credential ?? "",
83
+ });
84
+ });
85
+ const bridgeEffect = (operation, body) => Effect.tryPromise({ try: body, catch: (cause) => nativeError(cause, operation) });
86
+ const parseEvent = (packet) => {
87
+ const header = packet.header, type = string(header.type, "event.type");
88
+ switch (type) {
89
+ case "state": {
90
+ const state = string(header.state, "state");
91
+ if (!stateValues.has(state))
92
+ throw new ReactorError("Protocol", `native peer reported unknown state ${state}`);
93
+ return { type: "state", state: state };
94
+ }
95
+ case "channel": {
96
+ const channel = string(header.channel, "channel");
97
+ if (channel !== "control" && channel !== "data")
98
+ throw new ReactorError("Protocol", "native peer reported an unknown data channel");
99
+ if (typeof header.open !== "boolean")
100
+ throw new ReactorError("Protocol", "native channel event omitted its open state");
101
+ return { type: "channel", channel, open: header.open };
102
+ }
103
+ case "message": {
104
+ const channel = string(header.channel, "message.channel");
105
+ if (channel !== "control" && channel !== "data")
106
+ throw new ReactorError("Protocol", "native peer message named an unknown channel");
107
+ return { type: "message", channel, bytes: packet.payload };
108
+ }
109
+ case "ice": {
110
+ if (header.candidate === undefined || header.candidate === null)
111
+ return { type: "ice" };
112
+ const value = record(header.candidate, "ICE candidate"), candidate = { candidate: string(value.candidate, "candidate.candidate") };
113
+ if (value.sdp_mid !== null && value.sdp_mid !== undefined)
114
+ Object.assign(candidate, { sdp_mid: string(value.sdp_mid, "candidate.sdp_mid") });
115
+ if (value.sdp_mline_index !== null && value.sdp_mline_index !== undefined)
116
+ Object.assign(candidate, {
117
+ sdp_mline_index: integer(value.sdp_mline_index, "candidate.sdp_mline_index"),
118
+ });
119
+ return { type: "ice", candidate };
120
+ }
121
+ case "track":
122
+ return {
123
+ type: "track",
124
+ name: string(header.name, "track.name"),
125
+ mid: string(header.mid, "track.mid"),
126
+ };
127
+ case "decoded": {
128
+ const kind = string(header.kind, "decoded.kind");
129
+ if (kind !== "video" && kind !== "audio")
130
+ throw new ReactorError("Protocol", "native decoded event has unknown media kind");
131
+ return {
132
+ type: "decoded",
133
+ kind,
134
+ name: string(header.name, "decoded.name"),
135
+ mid: string(header.mid, "decoded.mid"),
136
+ };
137
+ }
138
+ case "error": {
139
+ const rawCode = string(header.code, "error.code"), code = isErrorCode(rawCode) ? rawCode : "Native";
140
+ string(header.message, "error.message");
141
+ return {
142
+ type: "error",
143
+ error: new ReactorError(code, `native peer failed (${code})`, { detail: header }),
144
+ };
145
+ }
146
+ default:
147
+ throw new ReactorError("Protocol", `native peer emitted unknown event type ${type}`);
148
+ }
149
+ };
150
+ const parseVideo = (packet) => {
151
+ const h = packet.header;
152
+ if (h.type !== "video" || h.format !== "BGRA")
153
+ throw new ReactorError("Protocol", "native video packet has an unsupported format");
154
+ const width = integer(h.width, "video.width"), height = integer(h.height, "video.height"), dataLength = integer(h.dataLength, "video.dataLength"), metadataLength = integer(h.metadataLength, "video.metadataLength");
155
+ if (width === 0 ||
156
+ height === 0 ||
157
+ dataLength !== width * height * 4 ||
158
+ dataLength + metadataLength !== packet.payload.length)
159
+ throw new ReactorError("Protocol", "native BGRA frame dimensions do not match its payload");
160
+ return Object.freeze({
161
+ _tag: "VideoFrame",
162
+ track: string(h.track, "video.track"),
163
+ width,
164
+ height,
165
+ frameId: bigint(h.frameId, "video.frameId"),
166
+ timestampMicros: bigint(h.timestampMicros, "video.timestampMicros"),
167
+ data: Uint8Array.from(packet.payload.subarray(0, dataLength)),
168
+ metadata: Uint8Array.from(packet.payload.subarray(dataLength)),
169
+ });
170
+ };
171
+ const parseAudio = (packet) => {
172
+ const h = packet.header;
173
+ if (h.type !== "audio" || h.format !== "s16le")
174
+ throw new ReactorError("Protocol", "native audio packet has an unsupported format");
175
+ const sampleRate = integer(h.sampleRate, "audio.sampleRate"), channels = integer(h.channels, "audio.channels"), samples = integer(h.samples, "audio.samples");
176
+ if (sampleRate === 0 ||
177
+ channels === 0 ||
178
+ samples % channels !== 0 ||
179
+ packet.payload.length !== samples * 2)
180
+ throw new ReactorError("Protocol", "native PCM format does not match its payload");
181
+ const view = new DataView(packet.payload.buffer, packet.payload.byteOffset, packet.payload.byteLength), pcm = new Int16Array(samples);
182
+ for (let index = 0; index < samples; index++)
183
+ pcm[index] = view.getInt16(index * 2, true);
184
+ return Object.freeze({
185
+ _tag: "AudioFrame",
186
+ track: string(h.track, "audio.track"),
187
+ sampleRate,
188
+ channels,
189
+ samples: pcm,
190
+ });
191
+ };
192
+ const parseSnapshot = (value) => {
193
+ const s = record(value, "media snapshot");
194
+ if (typeof s.closed !== "boolean")
195
+ throw new ReactorError("Protocol", "native media snapshot omitted closed state");
196
+ return Object.freeze({
197
+ closed: s.closed,
198
+ queuedControl: integer(s.queuedControl, "snapshot.queuedControl"),
199
+ queuedVideo: integer(s.queuedVideo, "snapshot.queuedVideo"),
200
+ queuedAudio: integer(s.queuedAudio, "snapshot.queuedAudio"),
201
+ queuedBytes: integer(s.queuedBytes, "snapshot.queuedBytes"),
202
+ droppedVideo: bigint(s.droppedVideo, "snapshot.droppedVideo"),
203
+ droppedAudio: bigint(s.droppedAudio, "snapshot.droppedAudio"),
204
+ pendingRequests: integer(s.pendingRequests, "snapshot.pendingRequests"),
205
+ deliveredVideo: bigint(s.deliveredVideo, "snapshot.deliveredVideo"),
206
+ deliveredAudio: bigint(s.deliveredAudio, "snapshot.deliveredAudio"),
207
+ });
208
+ };
209
+ const statsValue = (value) => {
210
+ if (Array.isArray(value))
211
+ return value.map(statsValue);
212
+ if (value === null || typeof value !== "object")
213
+ return value;
214
+ const output = {};
215
+ for (const [key, entry] of Object.entries(value))
216
+ output[key] =
217
+ statsBigInts.has(key) && typeof entry === "string" && /^-?[0-9]+$/.test(entry)
218
+ ? BigInt(entry)
219
+ : statsValue(entry);
220
+ return output;
221
+ };
222
+ const pollPacket = (poll) => bridgeEffect("poll native WebRTC", async () => {
223
+ const result = await poll();
224
+ return result._tag === "Packet" ? result.packet : result._tag === "Closed" ? null : undefined;
225
+ });
226
+ export class NativePeer {
227
+ nativeTracks = false;
228
+ rawMedia;
229
+ bridge;
230
+ video = new Map();
231
+ audio = new Map();
232
+ incoming = new Map();
233
+ emit;
234
+ closed = false;
235
+ failureEmitted = false;
236
+ failure;
237
+ constructor(libraryPath) {
238
+ this.bridge = new NativeBridge(libraryPath);
239
+ this.rawMedia = Object.freeze({
240
+ video: (name) => Stream.unwrap(Effect.try({
241
+ try: () => {
242
+ this.requireIncoming(name, "video");
243
+ return this.videoFeed(name).stream({ capacity: 4, maxBytes: 64 * 1024 * 1024 });
244
+ },
245
+ catch: (cause) => nativeError(cause, "native video track"),
246
+ })),
247
+ audio: (name) => Stream.unwrap(Effect.try({
248
+ try: () => {
249
+ this.requireIncoming(name, "audio");
250
+ return this.audioFeed(name).stream({ capacity: 128, maxBytes: 4 * 1024 * 1024 });
251
+ },
252
+ catch: (cause) => nativeError(cause, "native audio track"),
253
+ })),
254
+ snapshot: Effect.suspend(() => this.mediaSnapshot()),
255
+ });
256
+ }
257
+ requireIncoming(name, kind) {
258
+ if (this.incoming.get(name) !== kind)
259
+ throw new ReactorError("InvalidInput", "native media requires a declared receive track of the requested kind", { outcome: "not-submitted" });
260
+ }
261
+ videoFeed(name) {
262
+ let feed = this.video.get(name);
263
+ if (feed === undefined) {
264
+ feed = new Observations();
265
+ this.video.set(name, feed);
266
+ if (this.failure !== undefined)
267
+ feed.fail(this.failure);
268
+ else if (this.closed)
269
+ feed.end();
270
+ }
271
+ return feed;
272
+ }
273
+ audioFeed(name) {
274
+ let feed = this.audio.get(name);
275
+ if (feed === undefined) {
276
+ feed = new Observations();
277
+ this.audio.set(name, feed);
278
+ if (this.failure !== undefined)
279
+ feed.fail(this.failure);
280
+ else if (this.closed)
281
+ feed.end();
282
+ }
283
+ return feed;
284
+ }
285
+ fail(error) {
286
+ if (this.closed)
287
+ return;
288
+ this.failure = error;
289
+ // Queue failure may resume subscribers synchronously. Publish the source
290
+ // diagnostic first; any reentrant close still sees failure and fails every
291
+ // feed, rather than converting a terminal error into successful EOF.
292
+ try {
293
+ if (!this.failureEmitted) {
294
+ this.failureEmitted = true;
295
+ this.emit?.({ type: "error", error });
296
+ }
297
+ }
298
+ finally {
299
+ this.close();
300
+ }
301
+ }
302
+ pumpEvents() {
303
+ const self = this;
304
+ return Effect.gen(function* () {
305
+ while (!self.closed) {
306
+ const packet = yield* pollPacket(() => self.bridge.pollEvent());
307
+ if (self.closed)
308
+ return;
309
+ if (packet === null)
310
+ return;
311
+ if (packet === undefined)
312
+ continue;
313
+ const event = yield* Effect.try({
314
+ try: () => parseEvent(packet),
315
+ catch: (cause) => nativeError(cause, "decode native event"),
316
+ });
317
+ if (event.type === "error") {
318
+ self.fail(event.error);
319
+ return;
320
+ }
321
+ self.emit?.(event);
322
+ }
323
+ }).pipe(Effect.catch((error) => Effect.sync(() => self.fail(error))));
324
+ }
325
+ pumpVideo() {
326
+ const self = this;
327
+ return Effect.gen(function* () {
328
+ while (!self.closed) {
329
+ const packet = yield* pollPacket(() => self.bridge.pollVideo());
330
+ if (self.closed)
331
+ return;
332
+ if (packet === null)
333
+ return;
334
+ if (packet === undefined)
335
+ continue;
336
+ const frame = yield* Effect.try({
337
+ try: () => {
338
+ const frame = parseVideo(packet);
339
+ if (self.incoming.get(frame.track) !== "video")
340
+ throw new ReactorError("Protocol", "native video was delivered without its declared receive mapping");
341
+ return frame;
342
+ },
343
+ catch: (cause) => nativeError(cause, "decode native video"),
344
+ });
345
+ self
346
+ .videoFeed(frame.track)
347
+ .emit(frame, frame.data.byteLength + frame.metadata.byteLength + frame.track.length * 2);
348
+ }
349
+ }).pipe(Effect.catch((error) => Effect.sync(() => self.fail(error))));
350
+ }
351
+ pumpAudio() {
352
+ const self = this;
353
+ return Effect.gen(function* () {
354
+ while (!self.closed) {
355
+ const packet = yield* pollPacket(() => self.bridge.pollAudio());
356
+ if (self.closed)
357
+ return;
358
+ if (packet === null)
359
+ return;
360
+ if (packet === undefined)
361
+ continue;
362
+ const frame = yield* Effect.try({
363
+ try: () => {
364
+ const frame = parseAudio(packet);
365
+ if (self.incoming.get(frame.track) !== "audio")
366
+ throw new ReactorError("Protocol", "native audio was delivered without its declared receive mapping");
367
+ return frame;
368
+ },
369
+ catch: (cause) => nativeError(cause, "decode native audio"),
370
+ });
371
+ self.audioFeed(frame.track).emit(frame, frame.samples.byteLength + frame.track.length * 2);
372
+ }
373
+ }).pipe(Effect.catch((error) => Effect.sync(() => self.fail(error))));
374
+ }
375
+ prepare(servers, tracks, emit) {
376
+ const self = this;
377
+ return Effect.gen(function* () {
378
+ yield* Effect.try({
379
+ try: () => validateNativeTracks(tracks),
380
+ catch: (cause) => nativeError(cause, "validate native tracks"),
381
+ });
382
+ for (const track of tracks)
383
+ if (track.direction === "recvonly")
384
+ self.incoming.set(track.name, track.kind);
385
+ self.emit = emit;
386
+ const request = yield* Effect.try({
387
+ try: () => encodeNativeJson({ servers: iceServers(servers), tracks }),
388
+ catch: (cause) => nativeError(cause, "encode native prepare"),
389
+ });
390
+ const prepared = yield* bridgeEffect("prepare native WebRTC", () => self.bridge.call(NativeCall.Prepare, request)).pipe(Effect.flatMap((value) => Effect.try({
391
+ try: () => parsePrepared(value),
392
+ catch: (cause) => nativeError(cause, "decode native prepare"),
393
+ })));
394
+ yield* Effect.forkScoped(self.pumpEvents());
395
+ yield* Effect.forkScoped(self.pumpVideo());
396
+ yield* Effect.forkScoped(self.pumpAudio());
397
+ return prepared;
398
+ });
399
+ }
400
+ answer(sdp) {
401
+ return bridgeEffect("apply native SDP answer", () => this.bridge.call(NativeCall.Answer, encodeNativeText(sdp))).pipe(Effect.asVoid);
402
+ }
403
+ send(channel, bytes) {
404
+ return bridgeEffect(`send native ${channel}`, () => this.bridge.send(channel, bytes));
405
+ }
406
+ direction(name, active) {
407
+ return bridgeEffect("set native transceiver direction", () => this.bridge.call(NativeCall.Direction, encodeNativeJson({ name, active }))).pipe(Effect.asVoid);
408
+ }
409
+ maxBitrate(name, bitsPerSecond) {
410
+ if (!Number.isSafeInteger(bitsPerSecond) || bitsPerSecond < 1 || bitsPerSecond > 0x7fffffff)
411
+ return Effect.fail(new ReactorError("InvalidInput", "native max bitrate must be an integer in 1..2147483647", {
412
+ outcome: "not-submitted",
413
+ }));
414
+ return bridgeEffect("set native sender bitrate", () => this.bridge.call(NativeCall.MaxBitrate, encodeNativeJson({ name, bitsPerSecond }))).pipe(Effect.asVoid);
415
+ }
416
+ stats() {
417
+ return bridgeEffect("native WebRTC statistics", () => this.bridge.call(NativeCall.Stats)).pipe(Effect.flatMap((value) => Effect.try({
418
+ try: () => {
419
+ if (!Array.isArray(value))
420
+ throw new ReactorError("Protocol", "native stats response is not an array");
421
+ return Object.freeze(statsValue(value));
422
+ },
423
+ catch: (cause) => nativeError(cause, "decode native stats"),
424
+ })));
425
+ }
426
+ mediaSnapshot() {
427
+ return bridgeEffect("native media snapshot", () => this.bridge.call(NativeCall.MediaSnapshot)).pipe(Effect.flatMap((value) => Effect.try({
428
+ try: () => parseSnapshot(value),
429
+ catch: (cause) => nativeError(cause, "decode native media snapshot"),
430
+ })));
431
+ }
432
+ lease() {
433
+ throw new ReactorError("UnsupportedCapability", "native WebRTC exposes owned decoded samples, not browser MediaStreamTrack leases", { outcome: "not-submitted" });
434
+ }
435
+ release() {
436
+ /* lease never succeeds on this host. */
437
+ }
438
+ replace() {
439
+ return Effect.fail(new ReactorError("UnsupportedCapability", "native WebRTC does not accept browser MediaStreamTrack publication", { outcome: "not-submitted" }));
440
+ }
441
+ close() {
442
+ if (this.closed)
443
+ return;
444
+ this.closed = true;
445
+ this.emit = undefined;
446
+ this.bridge.close();
447
+ for (const feed of this.video.values()) {
448
+ if (this.failure === undefined)
449
+ feed.end();
450
+ else
451
+ feed.fail(this.failure);
452
+ }
453
+ for (const feed of this.audio.values()) {
454
+ if (this.failure === undefined)
455
+ feed.end();
456
+ else
457
+ feed.fail(this.failure);
458
+ }
459
+ }
460
+ shutdown() {
461
+ return bridgeEffect("shutdown native WebRTC", () => {
462
+ this.close();
463
+ return this.bridge.shutdown();
464
+ }).pipe(Effect.mapError((error) => error.code === "Shutdown"
465
+ ? error
466
+ : new ReactorError("Shutdown", error.message, error.context)), Effect.uninterruptible);
467
+ }
468
+ }
469
+ /** Internal test surface. This module is not a package export. */
470
+ export const nativePeerTesting = Object.freeze({
471
+ parsePrepared,
472
+ parseEvent,
473
+ parseVideo,
474
+ parseAudio,
475
+ parseSnapshot,
476
+ statsValue,
477
+ validateNativeTracks,
478
+ });
479
+ //# sourceMappingURL=peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer.js","sourceRoot":"","sources":["../../src/_internal/peer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import type * as Crypto from "effect/Crypto";
4
+ import type * as Http from "effect/unstable/http/HttpClient";
5
+ import { PeerFactory, ReactorError } from "reactor-effect-client";
6
+ import type { Configuration, Factory, Session } from "reactor-effect-client";
7
+ import type { MediaGeneration } from "reactor-effect-client/host";
8
+ export interface NativeOptions {
9
+ /** Override the reactor-effect-native shared library path. */
10
+ readonly libraryPath?: string;
11
+ }
12
+ /**
13
+ * Native transport capability for the portable Client. Koffi and the shared
14
+ * library are loaded only when PeerFactory.check runs, so merely importing
15
+ * this module remains safe when the optional native dependency is absent.
16
+ */
17
+ export declare const layer: (options?: NativeOptions) => Layer.Layer<PeerFactory>;
18
+ /** Select the native peer while retaining the same scoped session contract. */
19
+ export declare const make: (configuration?: Configuration, options?: NativeOptions) => Effect.Effect<Factory, never, Http.HttpClient | Crypto.Crypto>;
20
+ /** Acquire the current decoded-media generation after session.connect succeeds. */
21
+ export declare const media: (session: Session) => Effect.Effect<MediaGeneration, ReactorError>;
22
+ export type { VideoFrame, AudioFrame, MediaGeneration, MediaPressure, } from "reactor-effect-client/host";
23
+ export { uploadFile } from "reactor-effect-client/host";
24
+ export type { FileUploadOptions } from "reactor-effect-client/host";
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAoB,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlE,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA2BD;;;;GAIG;AACH,eAAO,MAAM,KAAK,aAAa,aAAa,KAAQ,KAAK,CAAC,KAAK,CAAC,WAAW,CAC7B,CAAC;AAE/C,+EAA+E;AAC/E,eAAO,MAAM,IAAI,mBACA,aAAa,YACnB,aAAa,KACrB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CACA,CAAC;AAEjE,mFAAmF;AACnF,eAAO,MAAM,KAAK,YAAa,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAC1D,CAAC;AAE3B,YAAY,EACV,UAAU,EACV,UAAU,EACV,eAAe,EACf,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import { PeerFactory, ReactorError, make as makeClient } from "reactor-effect-client";
4
+ import { mediaGeneration } from "reactor-effect-client/host";
5
+ import { resolveNativeBridge } from "./_internal/bridge.js";
6
+ import { NativePeer } from "./_internal/peer.js";
7
+ const factory = (options) => {
8
+ let resolved = options.libraryPath;
9
+ return {
10
+ check: Effect.tryPromise({
11
+ try: async () => {
12
+ resolved = await resolveNativeBridge(options.libraryPath);
13
+ },
14
+ catch: (cause) => cause instanceof ReactorError
15
+ ? cause
16
+ : new ReactorError("Native", "native WebRTC preflight failed", {
17
+ detail: cause,
18
+ outcome: "not-submitted",
19
+ }),
20
+ }),
21
+ make: () => {
22
+ if (resolved === undefined)
23
+ throw new ReactorError("InvalidState", "native WebRTC factory was not preflighted", {
24
+ outcome: "not-submitted",
25
+ });
26
+ return new NativePeer(resolved);
27
+ },
28
+ };
29
+ };
30
+ /**
31
+ * Native transport capability for the portable Client. Koffi and the shared
32
+ * library are loaded only when PeerFactory.check runs, so merely importing
33
+ * this module remains safe when the optional native dependency is absent.
34
+ */
35
+ export const layer = (options = {}) => Layer.succeed(PeerFactory, factory(options));
36
+ /** Select the native peer while retaining the same scoped session contract. */
37
+ export const make = (configuration = {}, options = {}) => makeClient(configuration).pipe(Effect.provide(layer(options)));
38
+ /** Acquire the current decoded-media generation after session.connect succeeds. */
39
+ export const media = (session) => mediaGeneration(session);
40
+ export { uploadFile } from "reactor-effect-client/host";
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEtF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAOjD,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAoB,EAAE;IAC3D,IAAI,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IACnC,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;YACvB,GAAG,EAAE,KAAK,IAAI,EAAE;gBACd,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC5D,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,YAAY,YAAY;gBAC3B,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,gCAAgC,EAAE;oBAC3D,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,eAAe;iBACzB,CAAC;SACT,CAAC;QACF,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,QAAQ,KAAK,SAAS;gBACxB,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,2CAA2C,EAAE;oBAClF,OAAO,EAAE,eAAe;iBACzB,CAAC,CAAC;YACL,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,GAAkB,EAAE,EAA4B,EAAE,CAC7E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,aAAa,GAAkB,EAAE,EACjC,OAAO,GAAkB,EAAE,EACqC,EAAE,CAClE,UAAU,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjE,mFAAmF;AACnF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAgD,EAAE,CACtF,eAAe,CAAC,OAAO,CAAC,CAAC;AAQ3B,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "platform": "darwin-arm64",
4
+ "library": "libreactor_effect_native.dylib",
5
+ "sha256": "47092f2f2b139a74ddebbc9b1e3ab826814e68f3b80ac4b80777060af714e8be",
6
+ "build": {
7
+ "schemaVersion": 1,
8
+ "abiVersion": 2,
9
+ "sourceSha256": "d2584076f542ea12a964eecf8384c8b93b013672388351e1998571b0b3c69d37",
10
+ "target": "aarch64-apple-darwin",
11
+ "profile": "release",
12
+ "rustc": "rustc 1.90.0 (1159e78c4 2025-09-14)",
13
+ "cc": "Apple clang version 17.0.0 (clang-1700.0.13.5)",
14
+ "cxx": "Apple clang version 17.0.0 (clang-1700.0.13.5)",
15
+ "CARGO_ENCODED_RUSTFLAGS": "",
16
+ "MACOSX_DEPLOYMENT_TARGET": "13.0"
17
+ }
18
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "platform": "linux-x64",
4
+ "library": "libreactor_effect_native.so",
5
+ "sha256": "07f3bcb7e0a0c003e0a1b457e602ef416db4f51329c486e429a1a307d1ce9e65",
6
+ "build": {
7
+ "schemaVersion": 1,
8
+ "abiVersion": 2,
9
+ "sourceSha256": "d2584076f542ea12a964eecf8384c8b93b013672388351e1998571b0b3c69d37",
10
+ "target": "x86_64-unknown-linux-gnu",
11
+ "profile": "release",
12
+ "rustc": "rustc 1.90.0 (1159e78c4 2025-09-14)",
13
+ "cc": "Ubuntu clang version 21.1.8 (++20251221032922+2078da43e25a-1~exp1~20251221153059.70)",
14
+ "cxx": "Ubuntu clang version 21.1.8 (++20251221032922+2078da43e25a-1~exp1~20251221153059.70)",
15
+ "CC": "clang-21",
16
+ "CXX": "clang++-21",
17
+ "CARGO_ENCODED_RUSTFLAGS": "",
18
+ "MACOSX_DEPLOYMENT_TARGET": "13.0"
19
+ }
20
+ }