@4players/odin-common 1.0.6

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 (37) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +7 -0
  3. package/README.md +28 -0
  4. package/lib/cjs/index.js +26 -0
  5. package/lib/cjs/plugins/api.js +2 -0
  6. package/lib/cjs/schemas/media.js +23 -0
  7. package/lib/cjs/schemas/message.js +10 -0
  8. package/lib/cjs/schemas/peer.js +34 -0
  9. package/lib/cjs/schemas/room.js +46 -0
  10. package/lib/cjs/schemas/serialization.js +15 -0
  11. package/lib/cjs/schemas/token.js +21 -0
  12. package/lib/cjs/schemas/webrtc.js +23 -0
  13. package/lib/cjs/streams/commands.js +80 -0
  14. package/lib/cjs/streams/notifications.js +16 -0
  15. package/lib/esm/index.js +10 -0
  16. package/lib/esm/plugins/api.js +1 -0
  17. package/lib/esm/schemas/media.js +20 -0
  18. package/lib/esm/schemas/message.js +7 -0
  19. package/lib/esm/schemas/peer.js +31 -0
  20. package/lib/esm/schemas/room.js +43 -0
  21. package/lib/esm/schemas/serialization.js +12 -0
  22. package/lib/esm/schemas/token.js +17 -0
  23. package/lib/esm/schemas/webrtc.js +20 -0
  24. package/lib/esm/streams/commands.js +77 -0
  25. package/lib/esm/streams/notifications.js +13 -0
  26. package/lib/types/index.d.ts +10 -0
  27. package/lib/types/plugins/api.d.ts +88 -0
  28. package/lib/types/schemas/media.d.ts +114 -0
  29. package/lib/types/schemas/message.d.ts +12 -0
  30. package/lib/types/schemas/peer.d.ts +254 -0
  31. package/lib/types/schemas/room.d.ts +1213 -0
  32. package/lib/types/schemas/serialization.d.ts +12 -0
  33. package/lib/types/schemas/token.d.ts +36 -0
  34. package/lib/types/schemas/webrtc.d.ts +42 -0
  35. package/lib/types/streams/commands.d.ts +218 -0
  36. package/lib/types/streams/notifications.d.ts +779 -0
  37. package/package.json +40 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## 1.0.4
4
+
5
+ - Initial release
package/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright (c) 2021, 4Players GmbH
2
+
3
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
4
+
5
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
6
+
7
+ Source: http://opensource.org/licenses/ISC
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @4players/odin-common
2
+
3
+ [![npm](https://img.shields.io/npm/v/@4players/odin-common.svg)][npm-badge-url]
4
+ [![npm](https://img.shields.io/npm/l/@4players/odin-common.svg)][license-url]
5
+ [![npm](https://img.shields.io/npm/dm/@4players/odin-common.svg)][npm-badge-url]
6
+
7
+ A collection of commonly used type definitions and schemas across ODIN web projects.
8
+
9
+ ## Troubleshooting
10
+
11
+ Contact us through the listed methods below to receive answers to your questions and learn more about ODIN.
12
+
13
+ ### Discord
14
+
15
+ Join our official Discord server to chat with us directly and become a part of the 4Players ODIN community.
16
+
17
+ [![Join us on Discord](https://developers.4players.io/images/join_discord.png)](https://4np.de/discord)
18
+
19
+ ### Twitter
20
+
21
+ Have a quick question? Tweet us at [@ODIN4Players](https://twitter.com/ODIN4Players) and we’ll help you resolve any issues.
22
+
23
+ ### Email
24
+
25
+ Don’t use Discord or Twitter? Send us an [email](mailto:odin@4players.io) and we’ll get back to you as soon as possible.
26
+
27
+ [npm-badge-url]: https://www.npmjs.com/package/@4players/odin-common
28
+ [license-url]: https://github.com/4Players/odin-sdk-web/blob/master/LICENSE
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./schemas/serialization"), exports);
18
+ __exportStar(require("./schemas/token"), exports);
19
+ __exportStar(require("./schemas/room"), exports);
20
+ __exportStar(require("./schemas/peer"), exports);
21
+ __exportStar(require("./schemas/media"), exports);
22
+ __exportStar(require("./schemas/message"), exports);
23
+ __exportStar(require("./schemas/webrtc"), exports);
24
+ __exportStar(require("./streams/commands"), exports);
25
+ __exportStar(require("./streams/notifications"), exports);
26
+ __exportStar(require("./plugins/api"), exports);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaSchema = exports.MediaPropertiesSchema = exports.MediaVideoPropertiesSchema = exports.MediaAudioPropertiesSchema = exports.MediaIdSchema = void 0;
4
+ const z = require("zod");
5
+ exports.MediaIdSchema = z.number();
6
+ exports.MediaAudioPropertiesSchema = z.object({
7
+ kind: z.optional(z.literal('audio')),
8
+ uid: z.optional(z.string()),
9
+ });
10
+ exports.MediaVideoPropertiesSchema = z.object({
11
+ kind: z.optional(z.literal('video')),
12
+ codec: z.optional(z.string()),
13
+ uid: z.optional(z.string()),
14
+ });
15
+ exports.MediaPropertiesSchema = z.union([
16
+ exports.MediaAudioPropertiesSchema,
17
+ exports.MediaVideoPropertiesSchema,
18
+ ]);
19
+ exports.MediaSchema = z.object({
20
+ id: exports.MediaIdSchema,
21
+ properties: exports.MediaPropertiesSchema,
22
+ paused: z.boolean(),
23
+ });
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageReceivedSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const peer_1 = require("./peer");
6
+ const serialization_1 = require("./serialization");
7
+ exports.MessageReceivedSchema = zod_1.z.object({
8
+ sender_peer_id: peer_1.PeerIdSchema,
9
+ message: serialization_1.ByteArraySchema,
10
+ });
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PeerUpdateSchema = exports.PeerSchema = exports.PeerPositionSchema = exports.PeerIdSchema = void 0;
4
+ const z = require("zod");
5
+ const media_1 = require("./media");
6
+ const serialization_1 = require("./serialization");
7
+ exports.PeerIdSchema = z.number();
8
+ exports.PeerPositionSchema = z.union([
9
+ z.tuple([z.number(), z.number(), z.number()]),
10
+ z.tuple([z.number(), z.number()]),
11
+ ]);
12
+ exports.PeerSchema = z.object({
13
+ id: exports.PeerIdSchema,
14
+ user_id: z.string(),
15
+ user_data: serialization_1.ByteArraySchema,
16
+ medias: z.array(media_1.MediaSchema),
17
+ });
18
+ exports.PeerUpdateSchema = z.discriminatedUnion('kind', [
19
+ z.object({
20
+ kind: z.literal('UserDataChanged'),
21
+ peer_id: exports.PeerIdSchema,
22
+ user_data: serialization_1.ByteArraySchema,
23
+ }),
24
+ z.object({
25
+ kind: z.literal('MediaStarted'),
26
+ peer_id: exports.PeerIdSchema,
27
+ media: media_1.MediaSchema,
28
+ }),
29
+ z.object({
30
+ kind: z.literal('MediaStopped'),
31
+ peer_id: exports.PeerIdSchema,
32
+ media_id: media_1.MediaIdSchema,
33
+ }),
34
+ ]);
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RoomStatusChangedSchema = exports.RoomStatusSchema = exports.RoomUpdatesSchema = exports.RoomUpdateSchema = exports.RoomSchema = exports.RoomIdSchema = void 0;
4
+ const z = require("zod");
5
+ const media_1 = require("./media");
6
+ const peer_1 = require("./peer");
7
+ const serialization_1 = require("./serialization");
8
+ exports.RoomIdSchema = z.string();
9
+ exports.RoomSchema = z.object({
10
+ id: exports.RoomIdSchema,
11
+ customer: z.string(),
12
+ user_data: serialization_1.ByteArraySchema,
13
+ peers: z.array(peer_1.PeerSchema),
14
+ });
15
+ exports.RoomUpdateSchema = z.discriminatedUnion('kind', [
16
+ z.object({
17
+ kind: z.literal('Joined'),
18
+ room: exports.RoomSchema,
19
+ media_ids: z.array(media_1.MediaIdSchema),
20
+ own_peer_id: peer_1.PeerIdSchema,
21
+ }),
22
+ z.object({
23
+ kind: z.literal('Left'),
24
+ reason: z.enum(['RoomClosing', 'ServerClosing', 'PeerKicked']),
25
+ }),
26
+ z.object({
27
+ kind: z.literal('UserDataChanged'),
28
+ user_data: z.optional(serialization_1.ByteArraySchema),
29
+ }),
30
+ z.object({
31
+ kind: z.literal('PeerJoined'),
32
+ peer: peer_1.PeerSchema,
33
+ }),
34
+ z.object({
35
+ kind: z.literal('PeerLeft'),
36
+ peer_id: peer_1.PeerIdSchema,
37
+ }),
38
+ ]);
39
+ exports.RoomUpdatesSchema = z.object({
40
+ updates: z.array(exports.RoomUpdateSchema),
41
+ });
42
+ exports.RoomStatusSchema = z.enum(['Joining', 'Joined', 'Closed']);
43
+ exports.RoomStatusChangedSchema = z.object({
44
+ status: exports.RoomStatusSchema,
45
+ message: z.optional(z.string()),
46
+ });
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessagePackRpcSchema = exports.JsonSchema = exports.ByteArraySchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.ByteArraySchema = zod_1.z.custom((value) => value instanceof Uint8Array);
6
+ const LiteralSchema = zod_1.z.union([zod_1.z.string(), zod_1.z.number(), zod_1.z.boolean(), zod_1.z.null()]);
7
+ exports.JsonSchema = zod_1.z.lazy(() => zod_1.z.union([LiteralSchema, zod_1.z.array(exports.JsonSchema), zod_1.z.record(exports.JsonSchema)]));
8
+ exports.MessagePackRpcSchema = zod_1.z.union([
9
+ // request with method call
10
+ zod_1.z.tuple([zod_1.z.literal(0), zod_1.z.number(), zod_1.z.string(), zod_1.z.unknown()]),
11
+ // response
12
+ zod_1.z.tuple([zod_1.z.literal(1), zod_1.z.number(), zod_1.z.nullable(zod_1.z.string()), zod_1.z.unknown()]),
13
+ // notification
14
+ zod_1.z.tuple([zod_1.z.literal(2), zod_1.z.string(), zod_1.z.unknown()]),
15
+ ]);
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.oneOrMany = exports.TokenClaimsSchema = exports.TokenAudienceSchema = exports.TokenSubjectSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.TokenSubjectSchema = zod_1.z.enum(['connect']);
6
+ exports.TokenAudienceSchema = zod_1.z.enum(['sfu', 'gateway']);
7
+ exports.TokenClaimsSchema = zod_1.z.object({
8
+ uid: zod_1.z.string(),
9
+ cid: zod_1.z.optional(zod_1.z.string()),
10
+ rid: oneOrMany(zod_1.z.string()),
11
+ nsp: zod_1.z.optional(zod_1.z.string()),
12
+ adr: zod_1.z.optional(zod_1.z.string()),
13
+ sub: zod_1.z.optional(oneOrMany(exports.TokenSubjectSchema)),
14
+ aud: zod_1.z.optional(oneOrMany(exports.TokenAudienceSchema)),
15
+ exp: zod_1.z.optional(zod_1.z.number()),
16
+ nbf: zod_1.z.optional(zod_1.z.number()),
17
+ });
18
+ function oneOrMany(type) {
19
+ return zod_1.z.union([type, zod_1.z.array(type)]);
20
+ }
21
+ exports.oneOrMany = oneOrMany;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebRtcUpdateSchema = void 0;
4
+ const z = require("zod");
5
+ const media_1 = require("./media");
6
+ exports.WebRtcUpdateSchema = z.discriminatedUnion('kind', [
7
+ z.object({
8
+ kind: z.literal('Sdp'),
9
+ type: z.enum(['Answer', 'Offer']),
10
+ sdp: z.string(),
11
+ media_map: z.array(z.tuple([media_1.MediaIdSchema, z.string()])),
12
+ }),
13
+ z.object({
14
+ kind: z.literal('Trickle'),
15
+ candidate: z.string(),
16
+ spd_mid: z.optional(z.string()),
17
+ spd_mline_index: z.optional(z.number()),
18
+ username_fragment: z.optional(z.union([z.string(), z.null()])),
19
+ }),
20
+ z.object({
21
+ kind: z.literal('TrickleFinished'),
22
+ }),
23
+ ]);
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RoomCommands = exports.MainCommands = void 0;
4
+ const z = require("zod");
5
+ const serialization_1 = require("../schemas/serialization");
6
+ const room_1 = require("../schemas/room");
7
+ const peer_1 = require("../schemas/peer");
8
+ const media_1 = require("../schemas/media");
9
+ const webrtc_1 = require("../schemas/webrtc");
10
+ exports.MainCommands = {
11
+ JoinRoom: {
12
+ request: z.object({
13
+ token: z.string(),
14
+ room_id: room_1.RoomIdSchema,
15
+ user_data: serialization_1.ByteArraySchema,
16
+ position: peer_1.PeerPositionSchema,
17
+ }),
18
+ response: z.object({
19
+ peer_id: peer_1.PeerIdSchema,
20
+ stream_id: z.optional(z.number()),
21
+ token: z.optional(z.string()),
22
+ }),
23
+ },
24
+ WebRtcUpdate: {
25
+ request: webrtc_1.WebRtcUpdateSchema,
26
+ response: z.null(),
27
+ },
28
+ RequestReconnectToken: {
29
+ request: z.object({ peer_id: z.optional(peer_1.PeerIdSchema) }),
30
+ response: z.string(),
31
+ },
32
+ Ping: {
33
+ request: z.object({}),
34
+ response: z.null(),
35
+ },
36
+ };
37
+ exports.RoomCommands = {
38
+ UpdatePeer: {
39
+ request: z.object({ user_data: serialization_1.ByteArraySchema }),
40
+ response: z.null(),
41
+ },
42
+ StartMedia: {
43
+ request: z.object({
44
+ media_id: media_1.MediaIdSchema,
45
+ properties: media_1.MediaPropertiesSchema,
46
+ }),
47
+ response: z.null(),
48
+ },
49
+ StopMedia: {
50
+ request: z.object({
51
+ media_id: media_1.MediaIdSchema,
52
+ }),
53
+ response: z.null(),
54
+ },
55
+ PauseMedia: {
56
+ request: z.object({
57
+ media_id: media_1.MediaIdSchema,
58
+ }),
59
+ response: z.null(),
60
+ },
61
+ ResumeMedia: {
62
+ request: z.object({
63
+ media_id: media_1.MediaIdSchema,
64
+ }),
65
+ response: z.null(),
66
+ },
67
+ SetPeerPosition: {
68
+ request: z.object({
69
+ position: peer_1.PeerPositionSchema,
70
+ }),
71
+ response: z.null(),
72
+ },
73
+ SendMessage: {
74
+ request: z.object({
75
+ target_peer_ids: z.optional(z.array(peer_1.PeerIdSchema)),
76
+ message: serialization_1.ByteArraySchema,
77
+ }),
78
+ response: z.null(),
79
+ },
80
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RoomNotifications = exports.MainNotifications = void 0;
4
+ const room_1 = require("../schemas/room");
5
+ const peer_1 = require("../schemas/peer");
6
+ const message_1 = require("../schemas/message");
7
+ const webrtc_1 = require("../schemas/webrtc");
8
+ exports.MainNotifications = {
9
+ WebRtcUpdate: webrtc_1.WebRtcUpdateSchema,
10
+ };
11
+ exports.RoomNotifications = {
12
+ RoomStatusChanged: room_1.RoomStatusChangedSchema,
13
+ RoomUpdated: room_1.RoomUpdatesSchema,
14
+ PeerUpdated: peer_1.PeerUpdateSchema,
15
+ MessageReceived: message_1.MessageReceivedSchema,
16
+ };
@@ -0,0 +1,10 @@
1
+ export * from './schemas/serialization';
2
+ export * from './schemas/token';
3
+ export * from './schemas/room';
4
+ export * from './schemas/peer';
5
+ export * from './schemas/media';
6
+ export * from './schemas/message';
7
+ export * from './schemas/webrtc';
8
+ export * from './streams/commands';
9
+ export * from './streams/notifications';
10
+ export * from './plugins/api';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import * as z from 'zod';
2
+ export const MediaIdSchema = z.number();
3
+ export const MediaAudioPropertiesSchema = z.object({
4
+ kind: z.optional(z.literal('audio')),
5
+ uid: z.optional(z.string()),
6
+ });
7
+ export const MediaVideoPropertiesSchema = z.object({
8
+ kind: z.optional(z.literal('video')),
9
+ codec: z.optional(z.string()),
10
+ uid: z.optional(z.string()),
11
+ });
12
+ export const MediaPropertiesSchema = z.union([
13
+ MediaAudioPropertiesSchema,
14
+ MediaVideoPropertiesSchema,
15
+ ]);
16
+ export const MediaSchema = z.object({
17
+ id: MediaIdSchema,
18
+ properties: MediaPropertiesSchema,
19
+ paused: z.boolean(),
20
+ });
@@ -0,0 +1,7 @@
1
+ import { z } from 'zod';
2
+ import { PeerIdSchema } from './peer';
3
+ import { ByteArraySchema } from './serialization';
4
+ export const MessageReceivedSchema = z.object({
5
+ sender_peer_id: PeerIdSchema,
6
+ message: ByteArraySchema,
7
+ });
@@ -0,0 +1,31 @@
1
+ import * as z from 'zod';
2
+ import { MediaIdSchema, MediaSchema } from './media';
3
+ import { ByteArraySchema } from './serialization';
4
+ export const PeerIdSchema = z.number();
5
+ export const PeerPositionSchema = z.union([
6
+ z.tuple([z.number(), z.number(), z.number()]),
7
+ z.tuple([z.number(), z.number()]),
8
+ ]);
9
+ export const PeerSchema = z.object({
10
+ id: PeerIdSchema,
11
+ user_id: z.string(),
12
+ user_data: ByteArraySchema,
13
+ medias: z.array(MediaSchema),
14
+ });
15
+ export const PeerUpdateSchema = z.discriminatedUnion('kind', [
16
+ z.object({
17
+ kind: z.literal('UserDataChanged'),
18
+ peer_id: PeerIdSchema,
19
+ user_data: ByteArraySchema,
20
+ }),
21
+ z.object({
22
+ kind: z.literal('MediaStarted'),
23
+ peer_id: PeerIdSchema,
24
+ media: MediaSchema,
25
+ }),
26
+ z.object({
27
+ kind: z.literal('MediaStopped'),
28
+ peer_id: PeerIdSchema,
29
+ media_id: MediaIdSchema,
30
+ }),
31
+ ]);
@@ -0,0 +1,43 @@
1
+ import * as z from 'zod';
2
+ import { MediaIdSchema } from './media';
3
+ import { PeerIdSchema, PeerSchema } from './peer';
4
+ import { ByteArraySchema } from './serialization';
5
+ export const RoomIdSchema = z.string();
6
+ export const RoomSchema = z.object({
7
+ id: RoomIdSchema,
8
+ customer: z.string(),
9
+ user_data: ByteArraySchema,
10
+ peers: z.array(PeerSchema),
11
+ });
12
+ export const RoomUpdateSchema = z.discriminatedUnion('kind', [
13
+ z.object({
14
+ kind: z.literal('Joined'),
15
+ room: RoomSchema,
16
+ media_ids: z.array(MediaIdSchema),
17
+ own_peer_id: PeerIdSchema,
18
+ }),
19
+ z.object({
20
+ kind: z.literal('Left'),
21
+ reason: z.enum(['RoomClosing', 'ServerClosing', 'PeerKicked']),
22
+ }),
23
+ z.object({
24
+ kind: z.literal('UserDataChanged'),
25
+ user_data: z.optional(ByteArraySchema),
26
+ }),
27
+ z.object({
28
+ kind: z.literal('PeerJoined'),
29
+ peer: PeerSchema,
30
+ }),
31
+ z.object({
32
+ kind: z.literal('PeerLeft'),
33
+ peer_id: PeerIdSchema,
34
+ }),
35
+ ]);
36
+ export const RoomUpdatesSchema = z.object({
37
+ updates: z.array(RoomUpdateSchema),
38
+ });
39
+ export const RoomStatusSchema = z.enum(['Joining', 'Joined', 'Closed']);
40
+ export const RoomStatusChangedSchema = z.object({
41
+ status: RoomStatusSchema,
42
+ message: z.optional(z.string()),
43
+ });
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ export const ByteArraySchema = z.custom((value) => value instanceof Uint8Array);
3
+ const LiteralSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);
4
+ export const JsonSchema = z.lazy(() => z.union([LiteralSchema, z.array(JsonSchema), z.record(JsonSchema)]));
5
+ export const MessagePackRpcSchema = z.union([
6
+ // request with method call
7
+ z.tuple([z.literal(0), z.number(), z.string(), z.unknown()]),
8
+ // response
9
+ z.tuple([z.literal(1), z.number(), z.nullable(z.string()), z.unknown()]),
10
+ // notification
11
+ z.tuple([z.literal(2), z.string(), z.unknown()]),
12
+ ]);
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ export const TokenSubjectSchema = z.enum(['connect']);
3
+ export const TokenAudienceSchema = z.enum(['sfu', 'gateway']);
4
+ export const TokenClaimsSchema = z.object({
5
+ uid: z.string(),
6
+ cid: z.optional(z.string()),
7
+ rid: oneOrMany(z.string()),
8
+ nsp: z.optional(z.string()),
9
+ adr: z.optional(z.string()),
10
+ sub: z.optional(oneOrMany(TokenSubjectSchema)),
11
+ aud: z.optional(oneOrMany(TokenAudienceSchema)),
12
+ exp: z.optional(z.number()),
13
+ nbf: z.optional(z.number()),
14
+ });
15
+ export function oneOrMany(type) {
16
+ return z.union([type, z.array(type)]);
17
+ }
@@ -0,0 +1,20 @@
1
+ import * as z from 'zod';
2
+ import { MediaIdSchema } from './media';
3
+ export const WebRtcUpdateSchema = z.discriminatedUnion('kind', [
4
+ z.object({
5
+ kind: z.literal('Sdp'),
6
+ type: z.enum(['Answer', 'Offer']),
7
+ sdp: z.string(),
8
+ media_map: z.array(z.tuple([MediaIdSchema, z.string()])),
9
+ }),
10
+ z.object({
11
+ kind: z.literal('Trickle'),
12
+ candidate: z.string(),
13
+ spd_mid: z.optional(z.string()),
14
+ spd_mline_index: z.optional(z.number()),
15
+ username_fragment: z.optional(z.union([z.string(), z.null()])),
16
+ }),
17
+ z.object({
18
+ kind: z.literal('TrickleFinished'),
19
+ }),
20
+ ]);
@@ -0,0 +1,77 @@
1
+ import * as z from 'zod';
2
+ import { ByteArraySchema } from '../schemas/serialization';
3
+ import { RoomIdSchema } from '../schemas/room';
4
+ import { PeerIdSchema, PeerPositionSchema } from '../schemas/peer';
5
+ import { MediaIdSchema, MediaPropertiesSchema } from '../schemas/media';
6
+ import { WebRtcUpdateSchema } from '../schemas/webrtc';
7
+ export const MainCommands = {
8
+ JoinRoom: {
9
+ request: z.object({
10
+ token: z.string(),
11
+ room_id: RoomIdSchema,
12
+ user_data: ByteArraySchema,
13
+ position: PeerPositionSchema,
14
+ }),
15
+ response: z.object({
16
+ peer_id: PeerIdSchema,
17
+ stream_id: z.optional(z.number()),
18
+ token: z.optional(z.string()),
19
+ }),
20
+ },
21
+ WebRtcUpdate: {
22
+ request: WebRtcUpdateSchema,
23
+ response: z.null(),
24
+ },
25
+ RequestReconnectToken: {
26
+ request: z.object({ peer_id: z.optional(PeerIdSchema) }),
27
+ response: z.string(),
28
+ },
29
+ Ping: {
30
+ request: z.object({}),
31
+ response: z.null(),
32
+ },
33
+ };
34
+ export const RoomCommands = {
35
+ UpdatePeer: {
36
+ request: z.object({ user_data: ByteArraySchema }),
37
+ response: z.null(),
38
+ },
39
+ StartMedia: {
40
+ request: z.object({
41
+ media_id: MediaIdSchema,
42
+ properties: MediaPropertiesSchema,
43
+ }),
44
+ response: z.null(),
45
+ },
46
+ StopMedia: {
47
+ request: z.object({
48
+ media_id: MediaIdSchema,
49
+ }),
50
+ response: z.null(),
51
+ },
52
+ PauseMedia: {
53
+ request: z.object({
54
+ media_id: MediaIdSchema,
55
+ }),
56
+ response: z.null(),
57
+ },
58
+ ResumeMedia: {
59
+ request: z.object({
60
+ media_id: MediaIdSchema,
61
+ }),
62
+ response: z.null(),
63
+ },
64
+ SetPeerPosition: {
65
+ request: z.object({
66
+ position: PeerPositionSchema,
67
+ }),
68
+ response: z.null(),
69
+ },
70
+ SendMessage: {
71
+ request: z.object({
72
+ target_peer_ids: z.optional(z.array(PeerIdSchema)),
73
+ message: ByteArraySchema,
74
+ }),
75
+ response: z.null(),
76
+ },
77
+ };
@@ -0,0 +1,13 @@
1
+ import { RoomStatusChangedSchema, RoomUpdatesSchema } from '../schemas/room';
2
+ import { PeerUpdateSchema } from '../schemas/peer';
3
+ import { MessageReceivedSchema } from '../schemas/message';
4
+ import { WebRtcUpdateSchema } from '../schemas/webrtc';
5
+ export const MainNotifications = {
6
+ WebRtcUpdate: WebRtcUpdateSchema,
7
+ };
8
+ export const RoomNotifications = {
9
+ RoomStatusChanged: RoomStatusChangedSchema,
10
+ RoomUpdated: RoomUpdatesSchema,
11
+ PeerUpdated: PeerUpdateSchema,
12
+ MessageReceived: MessageReceivedSchema,
13
+ };
@@ -0,0 +1,10 @@
1
+ export * from './schemas/serialization';
2
+ export * from './schemas/token';
3
+ export * from './schemas/room';
4
+ export * from './schemas/peer';
5
+ export * from './schemas/media';
6
+ export * from './schemas/message';
7
+ export * from './schemas/webrtc';
8
+ export * from './streams/commands';
9
+ export * from './streams/notifications';
10
+ export * from './plugins/api';