@4players/odin-common 9.3.0 → 9.4.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.
@@ -0,0 +1,115 @@
1
+ import { z } from 'zod';
2
+ import type { RpcSchema } from './serialization.ts';
3
+ import type { PeerId, PeerPosition } from './schema/peer.ts';
4
+ import type { MediaId, MediaProperties } from './schema/media.ts';
5
+ import type { RoomId } from './schema/room.ts';
6
+ import type { WebRtcUpdate } from './schema/webrtc.ts';
7
+ export type CommandSchema = {
8
+ request: RpcSchema;
9
+ response: RpcSchema;
10
+ };
11
+ export type Commands = Record<string, CommandSchema>;
12
+ export type CommandRequest<C extends Commands, K extends keyof C> = z.infer<C[K]['request']>;
13
+ export type CommandResponse<C extends Commands, K extends keyof C> = z.infer<C[K]['response']>;
14
+ export type ParsedCommand<C extends Commands, K extends keyof C = keyof C> = {
15
+ [Name in K]: {
16
+ name: Name;
17
+ request: z.infer<C[Name]['request']>;
18
+ };
19
+ }[K];
20
+ export declare function parseCommand<C extends Commands, K extends keyof C>(name: K, request: unknown, schema: C): ParsedCommand<C, K> | undefined;
21
+ export declare function parseRequest<C extends Commands, K extends keyof C>(name: K, request: unknown, schema: C): CommandRequest<C, K>;
22
+ export declare function parseResponse<C extends Commands, K extends keyof C>(name: K, response: unknown, schema: C): CommandResponse<C, K> | undefined;
23
+ export type MainCommands = {
24
+ Hello: {
25
+ request: z.ZodType<{
26
+ stream: 'main';
27
+ }>;
28
+ response: z.ZodType<null>;
29
+ };
30
+ JoinRoom: {
31
+ request: z.ZodType<{
32
+ token: string;
33
+ room_id: RoomId;
34
+ user_data: Uint8Array;
35
+ position: PeerPosition;
36
+ }>;
37
+ response: z.ZodType<{
38
+ peer_id: PeerId;
39
+ stream_id?: number;
40
+ token?: string;
41
+ }>;
42
+ };
43
+ WebRtcUpdate: {
44
+ request: z.ZodType<WebRtcUpdate>;
45
+ response: z.ZodType<null>;
46
+ };
47
+ RequestReconnectToken: {
48
+ request: z.ZodType<{
49
+ peer_id?: PeerId;
50
+ }>;
51
+ response: z.ZodType<string>;
52
+ };
53
+ Ping: {
54
+ request: z.ZodType<Record<PropertyKey, never>>;
55
+ response: z.ZodType<null>;
56
+ };
57
+ };
58
+ export declare const MainCommandsRpc: MainCommands;
59
+ export type RoomCommands = {
60
+ Hello: {
61
+ request: z.ZodType<{
62
+ stream: 'room';
63
+ token: string;
64
+ room_id: string;
65
+ user_data: Uint8Array;
66
+ position: PeerPosition;
67
+ }>;
68
+ response: z.ZodType<null>;
69
+ };
70
+ UpdatePeer: {
71
+ request: z.ZodType<{
72
+ user_data: Uint8Array;
73
+ }>;
74
+ response: z.ZodType<null>;
75
+ };
76
+ StartMedia: {
77
+ request: z.ZodType<{
78
+ media_id: MediaId;
79
+ properties: MediaProperties;
80
+ }>;
81
+ response: z.ZodType<null>;
82
+ };
83
+ StopMedia: {
84
+ request: z.ZodType<{
85
+ media_id: MediaId;
86
+ }>;
87
+ response: z.ZodType<null>;
88
+ };
89
+ PauseMedia: {
90
+ request: z.ZodType<{
91
+ media_id: MediaId;
92
+ }>;
93
+ response: z.ZodType<null>;
94
+ };
95
+ ResumeMedia: {
96
+ request: z.ZodType<{
97
+ media_id: MediaId;
98
+ }>;
99
+ response: z.ZodType<null>;
100
+ };
101
+ SetPeerPosition: {
102
+ request: z.ZodType<{
103
+ position: PeerPosition;
104
+ }>;
105
+ response: z.ZodType<null>;
106
+ };
107
+ SendMessage: {
108
+ request: z.ZodType<{
109
+ target_peer_ids?: PeerId[];
110
+ message: Uint8Array;
111
+ }>;
112
+ response: z.ZodType<null>;
113
+ };
114
+ };
115
+ export declare const RoomCommandsRpc: RoomCommands;
package/api/mod.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ODIN API schemas for commands, events and serialization utilities.
3
+ *
4
+ * @module
5
+ */
6
+ export * from './schema/token.ts';
7
+ export * from './schema/room.ts';
8
+ export * from './schema/peer.ts';
9
+ export * from './schema/media.ts';
10
+ export * from './schema/message.ts';
11
+ export * from './schema/webrtc.ts';
12
+ export * from './commands.ts';
13
+ export * from './notifications.ts';
14
+ export * from './serialization.ts';
@@ -0,0 +1,25 @@
1
+ import type { z } from 'zod';
2
+ import type { PeerUpdate } from './schema/peer.ts';
3
+ import type { MessageReceived } from './schema/message.ts';
4
+ import type { WebRtcUpdate } from './schema/webrtc.ts';
5
+ import type { RpcSchema } from './serialization.ts';
6
+ import { RoomV1 } from './schema/room.ts';
7
+ export type Notifications = Record<string, RpcSchema>;
8
+ export type ParsedNotification<N extends Notifications, K extends keyof N = keyof N> = {
9
+ [Name in K]: {
10
+ name: Name;
11
+ properties: z.infer<N[Name]>;
12
+ };
13
+ }[K];
14
+ export declare function parseNotification<N extends Notifications, K extends keyof N>(name: K, properties: unknown, schema: N): ParsedNotification<N, K> | undefined;
15
+ export type MainNotifications = {
16
+ WebRtcUpdate: z.ZodType<WebRtcUpdate>;
17
+ };
18
+ export declare const MainNotificationsRpc: MainNotifications;
19
+ export type RoomNotifications = {
20
+ RoomStatusChanged: z.ZodType<RoomV1.RoomStatusChanged>;
21
+ RoomUpdated: z.ZodType<RoomV1.RoomUpdates>;
22
+ PeerUpdated: z.ZodType<PeerUpdate>;
23
+ MessageReceived: z.ZodType<MessageReceived>;
24
+ };
25
+ export declare const RoomNotificationsRpc: RoomNotifications;
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ export type MediaId = number;
3
+ export declare const MediaIdSchema: z.ZodNumber;
4
+ export type MediaAudioProperties = {
5
+ kind?: 'audio';
6
+ uid?: string;
7
+ customType?: string;
8
+ };
9
+ export declare const MediaAudioPropertiesSchema: z.ZodType<MediaAudioProperties>;
10
+ export type MediaVideoProperties = {
11
+ kind: 'video';
12
+ codec?: string;
13
+ uid?: string;
14
+ customType?: string;
15
+ id?: string;
16
+ };
17
+ export declare const MediaVideoPropertiesSchema: z.ZodType<MediaVideoProperties>;
18
+ export type MediaProperties = MediaAudioProperties | MediaVideoProperties;
19
+ export declare const MediaPropertiesSchema: z.ZodType<MediaProperties>;
20
+ export type Media = {
21
+ id: MediaId;
22
+ properties: MediaProperties;
23
+ paused: boolean;
24
+ };
25
+ export declare const MediaSchema: z.ZodType<Media>;
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ export type MessageReceived = {
3
+ sender_peer_id: number;
4
+ message: Uint8Array;
5
+ };
6
+ export declare const MessageReceivedSchema: z.ZodType<MessageReceived>;
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ import type { Media, MediaId } from './media.ts';
3
+ export type PeerId = number;
4
+ export declare const PeerIdSchema: z.ZodNumber;
5
+ export type PeerPosition = [number, number, number] | [number, number];
6
+ export declare const PeerPositionSchema: z.ZodType<PeerPosition>;
7
+ export type Peer = {
8
+ id: PeerId;
9
+ user_id: string;
10
+ user_data: Uint8Array;
11
+ medias: Media[];
12
+ };
13
+ export declare const PeerSchema: z.ZodType<Peer>;
14
+ export type PeerUpdate = {
15
+ kind: 'UserDataChanged';
16
+ peer_id: PeerId;
17
+ user_data: Uint8Array;
18
+ } | {
19
+ kind: 'MediaStarted';
20
+ peer_id: PeerId;
21
+ media: Media;
22
+ } | {
23
+ kind: 'MediaStopped';
24
+ peer_id: PeerId;
25
+ media_id: MediaId;
26
+ };
27
+ export declare const PeerUpdateSchema: z.ZodType<PeerUpdate>;
@@ -0,0 +1,161 @@
1
+ import { z } from 'zod';
2
+ import type { MediaId } from './media.ts';
3
+ import type { Peer, PeerId } from './peer.ts';
4
+ import type { JsonValue } from '../serialization.ts';
5
+ export type RoomId = string;
6
+ export declare const RoomIdSchema: z.ZodString;
7
+ export declare namespace RoomV1 {
8
+ type Room = {
9
+ id: RoomId;
10
+ customer: string;
11
+ user_data: Uint8Array;
12
+ peers: Peer[];
13
+ };
14
+ const RoomSchema: z.ZodType<Room>;
15
+ type RoomUpdate = {
16
+ kind: 'Joined';
17
+ room: Room;
18
+ media_ids: MediaId[];
19
+ own_peer_id: PeerId;
20
+ } | {
21
+ kind: 'Left';
22
+ reason: 'RoomClosing' | 'ServerClosing' | 'PeerKicked';
23
+ } | {
24
+ kind: 'PeerJoined';
25
+ peer: Peer;
26
+ } | {
27
+ kind: 'PeerLeft';
28
+ peer_id: PeerId;
29
+ } | {
30
+ kind: 'UserDataChanged';
31
+ user_data?: Uint8Array;
32
+ };
33
+ const RoomUpdateSchema: z.ZodType<RoomUpdate>;
34
+ type RoomUpdates = {
35
+ updates: RoomUpdate[];
36
+ };
37
+ const RoomUpdatesSchema: z.ZodType<RoomUpdates>;
38
+ type RoomStatus = 'Joining' | 'Joined' | 'Closed';
39
+ const RoomStatusSchema: z.ZodType<RoomStatus>;
40
+ type RoomStatusChanged = {
41
+ status: RoomStatus;
42
+ message?: string;
43
+ };
44
+ const RoomStatusChangedSchema: z.ZodType<RoomStatusChanged>;
45
+ }
46
+ export declare namespace RoomV2 {
47
+ type Parameters = Record<string, JsonValue>;
48
+ const ParametersSchema: z.ZodType<Parameters>;
49
+ type HelloRoom = {
50
+ token: string;
51
+ room_id?: RoomId;
52
+ user_data?: Uint8Array;
53
+ parameters?: Parameters;
54
+ };
55
+ const HelloRoomSchema: z.ZodType<HelloRoom>;
56
+ type ClientHello = {
57
+ Room: HelloRoom;
58
+ };
59
+ const ClientHelloSchema: z.ZodType<ClientHello>;
60
+ type ServerHello = {
61
+ Ok: Record<string, never>;
62
+ } | {
63
+ Rejected: {
64
+ message: string;
65
+ };
66
+ };
67
+ const ServerHelloSchema: z.ZodType<ServerHello>;
68
+ type PeerProperties = {
69
+ user_data?: Uint8Array;
70
+ tags?: string[];
71
+ audio_parameters?: Record<string, JsonValue>;
72
+ video_parameters?: Record<string, JsonValue>;
73
+ };
74
+ const PeerPropertiesSchema: z.ZodType<PeerProperties>;
75
+ type Ping = {
76
+ Ping: {
77
+ id: number;
78
+ };
79
+ };
80
+ const PingSchema: z.ZodType<Ping>;
81
+ type ChangeSelf = {
82
+ ChangeSelf: Omit<PeerProperties, 'tags'>;
83
+ };
84
+ const ChangeSelfSchema: z.ZodType<ChangeSelf>;
85
+ type SetAudioMask = {
86
+ SetAudioMask: {
87
+ peer_id: number;
88
+ mask: bigint;
89
+ };
90
+ };
91
+ const SetAudioMaskSchema: z.ZodType<SetAudioMask>;
92
+ type SendMessage = {
93
+ SendMessage: {
94
+ peer_ids: number[];
95
+ message: Uint8Array;
96
+ };
97
+ };
98
+ const SendMessageSchema: z.ZodType<SendMessage>;
99
+ type Call = Ping | ChangeSelf | SetAudioMask | SendMessage;
100
+ const CallSchema: z.ZodType<Call>;
101
+ type Pong = {
102
+ Pong: {
103
+ id: number;
104
+ };
105
+ };
106
+ const PongSchema: z.ZodType<Pong>;
107
+ type Joined = {
108
+ Joined: {
109
+ own_peer_id: number;
110
+ room_id: string;
111
+ customer: string;
112
+ };
113
+ };
114
+ const JoinedSchema: z.ZodType<Joined>;
115
+ type Left = {
116
+ Left: {
117
+ reason: 'room_closing' | 'server_closing' | 'peer_kicked';
118
+ };
119
+ };
120
+ const LeftSchema: z.ZodType<Left>;
121
+ type PeerJoined = {
122
+ PeerJoined: PeerProperties & {
123
+ peer_id: number;
124
+ user_id: string;
125
+ };
126
+ };
127
+ const PeerJoinedSchema: z.ZodType<PeerJoined>;
128
+ type PeerLeft = {
129
+ PeerLeft: {
130
+ peer_id: number;
131
+ };
132
+ };
133
+ const PeerLeftSchema: z.ZodType<PeerLeft>;
134
+ type PeerChanged = {
135
+ PeerChanged: PeerProperties & {
136
+ peer_id: number;
137
+ };
138
+ };
139
+ const PeerChangedSchema: z.ZodType<PeerChanged>;
140
+ type NewReconnectToken = {
141
+ NewReconnectToken: {
142
+ token: string;
143
+ };
144
+ };
145
+ const NewReconnectTokenSchema: z.ZodType<NewReconnectToken>;
146
+ type MessageReceived = {
147
+ MessageReceived: {
148
+ sender_peer_id: number;
149
+ message: Uint8Array;
150
+ };
151
+ };
152
+ const MessageReceivedSchema: z.ZodType<MessageReceived>;
153
+ type ServerError = {
154
+ Error: {
155
+ message: Uint8Array;
156
+ };
157
+ };
158
+ const ServerErrorSchema: z.ZodType<ServerError>;
159
+ type Event = Pong | Joined | Left | PeerJoined | PeerLeft | PeerChanged | NewReconnectToken | MessageReceived | ServerError;
160
+ const EventSchema: z.ZodType<Event>;
161
+ }
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ export type TokenAudience = 'sfu' | 'gateway';
3
+ export declare const TokenAudienceSchema: z.ZodType<TokenAudience>;
4
+ export type TokenSubject = 'connect' | 'roomclose' | 'roomupdate' | 'roombanclient' | 'roomsendmessage';
5
+ export declare const TokenSubjectSchema: z.ZodType<TokenSubject>;
6
+ export type TokenClaims = {
7
+ uid: string;
8
+ cid?: string;
9
+ rid: string[];
10
+ nsp?: string;
11
+ adr?: string;
12
+ aud?: TokenAudience[];
13
+ sub?: TokenSubject[];
14
+ exp?: number;
15
+ nbf?: number;
16
+ ups?: string;
17
+ tgs?: string[];
18
+ tsp?: number;
19
+ internal?: {
20
+ server?: string;
21
+ };
22
+ };
23
+ export declare const TokenClaimsSchema: z.ZodType<TokenClaims>;
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export type WebRtcUpdate = {
3
+ kind: 'Sdp';
4
+ type: 'Answer' | 'Offer';
5
+ sdp: string;
6
+ media_map: [number, string][];
7
+ } | {
8
+ kind: 'Trickle';
9
+ candidate: string;
10
+ spd_mid?: string;
11
+ spd_mline_index?: number;
12
+ username_fragment?: string | null;
13
+ } | {
14
+ kind: 'TrickleFinished';
15
+ };
16
+ export declare const WebRtcUpdateSchema: z.ZodType<WebRtcUpdate>;
@@ -3,14 +3,13 @@ export type RpcValue = Uint8Array | string | number | boolean | null | RpcValue[
3
3
  [key: string]: RpcValue;
4
4
  };
5
5
  export type RpcSchema = z.ZodType<RpcValue, unknown>;
6
- export declare const ByteArraySchema: z.ZodCustom<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>>;
7
- export type ByteArray = z.infer<typeof ByteArraySchema>;
8
- declare const LiteralSchema: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>;
9
- type Literal = z.infer<typeof LiteralSchema>;
10
- export type JsonValue = Literal | {
6
+ export type ByteArray = Uint8Array;
7
+ export declare const ByteArraySchema: z.ZodType<Uint8Array>;
8
+ export type JsonValue = string | number | boolean | null | {
11
9
  [key: string]: JsonValue;
12
10
  } | JsonValue[];
13
11
  export declare const JsonSchema: z.ZodType<JsonValue>;
14
- export declare const MessagePackRpcSchema: z.ZodUnion<readonly [z.ZodTuple<[z.ZodLiteral<0>, z.ZodNumber, z.ZodString, z.ZodUnknown], null>, z.ZodTuple<[z.ZodLiteral<1>, z.ZodNumber, z.ZodNullable<z.ZodString>, z.ZodUnknown], null>, z.ZodTuple<[z.ZodLiteral<2>, z.ZodString, z.ZodUnknown], null>]>;
15
- export type MessagePackRpc = z.infer<typeof MessagePackRpcSchema>;
16
- export {};
12
+ export type MessagePackRpc = [0, number, string, unknown] | [1, number, string | null, unknown] | [2, string, unknown];
13
+ export declare const MessagePackRpcSchema: z.ZodType<MessagePackRpc>;
14
+ export declare function oneOrMany<T extends z.ZodType>(type: T): z.ZodType<z.infer<T>[]>;
15
+ export type Infer<T extends RpcSchema> = z.output<T>;
package/cjs/api/mod.js ADDED
@@ -0,0 +1 @@
1
+ var C=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Y=Object.prototype.hasOwnProperty;var $=(o,i)=>{for(var l in i)C(o,l,{get:i[l],enumerable:!0})},V=(o,i,l,d)=>{if(i&&typeof i=="object"||typeof i=="function")for(let m of X(i))!Y.call(o,m)&&m!==l&&C(o,m,{get:()=>i[m],enumerable:!(d=Q(i,m))||d.enumerable});return o};var ee=o=>V(C({},"__esModule",{value:!0}),o);var ue={};$(ue,{ByteArraySchema:()=>a,JsonSchema:()=>f,MainCommandsRpc:()=>ae,MainNotificationsRpc:()=>me,MediaAudioPropertiesSchema:()=>U,MediaIdSchema:()=>g,MediaPropertiesSchema:()=>_,MediaSchema:()=>k,MediaVideoPropertiesSchema:()=>v,MessagePackRpcSchema:()=>te,MessageReceivedSchema:()=>R,PeerIdSchema:()=>y,PeerPositionSchema:()=>S,PeerSchema:()=>z,PeerUpdateSchema:()=>M,RoomCommandsRpc:()=>pe,RoomIdSchema:()=>P,RoomNotificationsRpc:()=>ce,RoomV1:()=>T,RoomV2:()=>A,TokenAudienceSchema:()=>Z,TokenClaimsSchema:()=>oe,TokenSubjectSchema:()=>j,WebRtcUpdateSchema:()=>h,oneOrMany:()=>b,parseCommand:()=>ne,parseNotification:()=>de,parseRequest:()=>ie,parseResponse:()=>se});module.exports=ee(ue);var c=require("zod");var n=require("zod"),a=n.z.custom(o=>o instanceof Uint8Array),f=n.z.lazy(()=>n.z.union([n.z.union([n.z.string(),n.z.number(),n.z.boolean(),n.z.null()]),n.z.array(f),n.z.record(n.z.string(),f)])),te=n.z.union([n.z.tuple([n.z.literal(0),n.z.number(),n.z.string(),n.z.unknown()]),n.z.tuple([n.z.literal(1),n.z.number(),n.z.nullable(n.z.string()),n.z.unknown()]),n.z.tuple([n.z.literal(2),n.z.string(),n.z.unknown()])]);function b(o){return n.z.union([o.transform(i=>[i]),n.z.array(o)])}var Z=c.z.enum(["sfu","gateway"]),j=c.z.enum(["connect","roomclose","roomupdate","roombanclient","roomsendmessage"]),oe=c.z.object({uid:c.z.string(),cid:c.z.string().optional(),rid:b(c.z.string()).refine(o=>o.length>=1,{message:"missing rid"}),nsp:c.z.string().optional(),adr:c.z.string().optional(),aud:b(Z).optional(),sub:b(j).optional(),exp:c.z.number().optional(),nbf:c.z.number().optional(),ups:c.z.string().optional(),tgs:b(c.z.string()).optional(),tsp:c.z.number().optional(),internal:c.z.object({server:c.z.string().optional()}).optional()});var e=require("zod");var u=require("zod"),g=u.z.number(),U=u.z.object({kind:u.z.literal("audio").optional(),uid:u.z.string().optional(),customType:u.z.string().optional()}),v=u.z.object({kind:u.z.literal("video"),codec:u.z.string().optional(),uid:u.z.string().optional(),customType:u.z.string().optional(),id:u.z.string().optional()}),_=u.z.union([U,v]),k=u.z.object({id:g,properties:_,paused:u.z.boolean()});var s=require("zod");var y=s.z.number(),S=s.z.union([s.z.tuple([s.z.number(),s.z.number(),s.z.number()]),s.z.tuple([s.z.number(),s.z.number()])]),z=s.z.object({id:y,user_id:s.z.string(),user_data:a,medias:s.z.array(k)}),M=s.z.discriminatedUnion("kind",[s.z.object({kind:s.z.literal("UserDataChanged"),peer_id:y,user_data:a}),s.z.object({kind:s.z.literal("MediaStarted"),peer_id:y,media:k}),s.z.object({kind:s.z.literal("MediaStopped"),peer_id:y,media_id:g})]);var P=e.z.string(),T;(x=>(x.RoomSchema=e.z.object({id:P,customer:e.z.string(),user_data:a,peers:e.z.array(z)}),x.RoomUpdateSchema=e.z.discriminatedUnion("kind",[e.z.object({kind:e.z.literal("Joined"),room:x.RoomSchema,media_ids:e.z.array(g),own_peer_id:y}),e.z.object({kind:e.z.literal("Left"),reason:e.z.enum(["RoomClosing","ServerClosing","PeerKicked"])}),e.z.object({kind:e.z.literal("PeerJoined"),peer:z}),e.z.object({kind:e.z.literal("PeerLeft"),peer_id:y}),e.z.object({kind:e.z.literal("UserDataChanged"),user_data:a.optional()})]),x.RoomUpdatesSchema=e.z.object({updates:e.z.array(x.RoomUpdateSchema)}),x.RoomStatusSchema=e.z.enum(["Joining","Joined","Closed"]),x.RoomStatusChangedSchema=e.z.object({status:x.RoomStatusSchema,message:e.z.string().optional()})))(T||={});var A;(t=>{t.ParametersSchema=e.z.record(e.z.string(),f),t.HelloRoomSchema=e.z.object({token:e.z.string(),room_id:P.optional(),user_data:a.optional(),parameters:t.ParametersSchema.optional()}),t.ClientHelloSchema=e.z.object({Room:t.HelloRoomSchema}),t.ServerHelloSchema=e.z.union([e.z.object({Ok:e.z.object({})}),e.z.object({Rejected:e.z.object({message:e.z.string()})})]);let m=e.z.object({user_data:a.optional(),tags:e.z.array(e.z.string()).optional(),audio_parameters:t.ParametersSchema.optional(),video_parameters:t.ParametersSchema.optional()});t.PeerPropertiesSchema=m,t.PingSchema=e.z.object({Ping:e.z.object({id:e.z.number()})}),t.ChangeSelfSchema=e.z.object({ChangeSelf:m.omit({tags:!0})}),t.SetAudioMaskSchema=e.z.object({SetAudioMask:e.z.object({peer_id:e.z.number(),mask:e.z.bigint().nonnegative().lte(0xFFFFFFFFFFFFFFFFn)})}),t.SendMessageSchema=e.z.object({SendMessage:e.z.object({peer_ids:e.z.number().array().default([]),message:a})}),t.CallSchema=t.PingSchema.or(t.ChangeSelfSchema).or(t.SetAudioMaskSchema).or(t.SendMessageSchema),t.PongSchema=e.z.object({Pong:e.z.object({id:e.z.number()})}),t.JoinedSchema=e.z.object({Joined:e.z.object({own_peer_id:e.z.number(),room_id:e.z.string(),customer:e.z.string()})}),t.LeftSchema=e.z.object({Left:e.z.object({reason:e.z.enum(["room_closing","server_closing","peer_kicked"])})}),t.PeerJoinedSchema=e.z.object({PeerJoined:m.extend({peer_id:e.z.number(),user_id:e.z.string()})}),t.PeerLeftSchema=e.z.object({PeerLeft:e.z.object({peer_id:e.z.number()})}),t.PeerChangedSchema=e.z.object({PeerChanged:m.extend({peer_id:e.z.number()})}),t.NewReconnectTokenSchema=e.z.object({NewReconnectToken:e.z.object({token:e.z.string()})}),t.MessageReceivedSchema=e.z.object({MessageReceived:e.z.object({sender_peer_id:e.z.number(),message:a})}),t.ServerErrorSchema=e.z.object({Error:e.z.object({message:a})}),t.EventSchema=t.PongSchema.or(t.JoinedSchema).or(t.LeftSchema).or(t.PeerJoinedSchema).or(t.PeerLeftSchema).or(t.PeerChangedSchema).or(t.NewReconnectTokenSchema).or(t.MessageReceivedSchema).or(t.ServerErrorSchema)})(A||={});var I=require("zod");var R=I.z.object({sender_peer_id:y,message:a});var p=require("zod");var h=p.z.discriminatedUnion("kind",[p.z.object({kind:p.z.literal("Sdp"),type:p.z.enum(["Answer","Offer"]),sdp:p.z.string(),media_map:p.z.array(p.z.tuple([g,p.z.string()]))}),p.z.object({kind:p.z.literal("Trickle"),candidate:p.z.string(),spd_mid:p.z.string().optional(),spd_mline_index:p.z.number().optional(),username_fragment:p.z.union([p.z.string(),p.z.null()]).optional()}),p.z.object({kind:p.z.literal("TrickleFinished")})]);var r=require("zod");function q(o,i){o||re(i)}function re(o){throw new Error(o)}function ne(o,i,l){let d=l[o];if(!d)return;let m=d.request.safeParse(i);return m.success?{name:o,request:m.data}:void 0}function ie(o,i,l){let d=l[o];return q(d!==void 0,"unknown command schema"),d.request.parse(i)}function se(o,i,l){let d=l[o]?.response.safeParse(i);return d?.success?d.data:void 0}var ae={Hello:{request:r.z.object({stream:r.z.literal("main")}),response:r.z.null()},JoinRoom:{request:r.z.object({token:r.z.string(),room_id:P,user_data:a,position:S}),response:r.z.object({peer_id:y,stream_id:r.z.number().optional(),token:r.z.string().optional()})},WebRtcUpdate:{request:h,response:r.z.null()},RequestReconnectToken:{request:r.z.object({peer_id:y.optional()}),response:r.z.string()},Ping:{request:r.z.object({}),response:r.z.null()}},pe={Hello:{request:r.z.object({stream:r.z.literal("room"),token:r.z.string(),room_id:r.z.string(),user_data:a,position:S}),response:r.z.null()},UpdatePeer:{request:r.z.object({user_data:a}),response:r.z.null()},StartMedia:{request:r.z.object({media_id:g,properties:_}),response:r.z.null()},StopMedia:{request:r.z.object({media_id:g}),response:r.z.null()},PauseMedia:{request:r.z.object({media_id:g}),response:r.z.null()},ResumeMedia:{request:r.z.object({media_id:g}),response:r.z.null()},SetPeerPosition:{request:r.z.object({position:S}),response:r.z.null()},SendMessage:{request:r.z.object({target_peer_ids:r.z.array(y).optional(),message:a}),response:r.z.null()}};function de(o,i,l){let d=l[o];if(!d)return;let m=d.safeParse(i);return m.success?{name:o,properties:m.data}:void 0}var me={WebRtcUpdate:h},ce={RoomStatusChanged:T.RoomStatusChangedSchema,RoomUpdated:T.RoomUpdatesSchema,PeerUpdated:M,MessageReceived:R};0&&(module.exports={ByteArraySchema,JsonSchema,MainCommandsRpc,MainNotificationsRpc,MediaAudioPropertiesSchema,MediaIdSchema,MediaPropertiesSchema,MediaSchema,MediaVideoPropertiesSchema,MessagePackRpcSchema,MessageReceivedSchema,PeerIdSchema,PeerPositionSchema,PeerSchema,PeerUpdateSchema,RoomCommandsRpc,RoomIdSchema,RoomNotificationsRpc,RoomV1,RoomV2,TokenAudienceSchema,TokenClaimsSchema,TokenSubjectSchema,WebRtcUpdateSchema,oneOrMany,parseCommand,parseNotification,parseRequest,parseResponse});
package/cjs/mod.js CHANGED
@@ -1 +1 @@
1
- var y=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var M=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},j=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of U(t))!N.call(e,s)&&s!==r&&y(e,s,{get:()=>t[s],enumerable:!(n=F(t,s))||n.enumerable});return e};var _=e=>j(y({},"__esModule",{value:!0}),e);var Ee={};M(Ee,{APM_DEFAULTS:()=>W,Backend:()=>P,CONNECTION_STATS_INITIAL:()=>$,ConsoleSink:()=>f,Formatter:()=>B,GLOBAL_LOGGER:()=>d,InteractiveConsoleSink:()=>C,JITTER_STATS_INITIAL:()=>J,LogLevel:()=>p,LogSymbols:()=>S,Logger:()=>c,MinDBFS:()=>Ue,Selector:()=>h,Strand:()=>L,VAD_DEFAULTS:()=>G,VideoCodec:()=>v,abortableSleep:()=>se,assert:()=>g,debug:()=>Be,error:()=>Ve,extendUrl:()=>ce,fail:()=>x,failure:()=>u,find:()=>K,fromBase64:()=>z,fromBase64Url:()=>Z,fromBytes:()=>Y,generateUUID:()=>pe,info:()=>De,isAudioCapable:()=>Q,isBlinkBrowser:()=>A,isElectronBrowser:()=>te,isFailure:()=>he,isFirefoxBrowser:()=>re,isFunction:()=>fe,isNull:()=>me,isNumber:()=>be,isObject:()=>ye,isProperty:()=>ge,isSafariBrowser:()=>ne,isSharedArrayBufferCapable:()=>ee,isString:()=>xe,isSuccess:()=>Le,isUndefined:()=>ve,log:()=>Ie,nextTick:()=>ae,normalizeUrl:()=>ue,sleep:()=>ie,success:()=>o,toBytes:()=>q,toRaw:()=>oe,tryParseLogLevel:()=>Pe,unwrap:()=>H,unwrapOr:()=>m,validateUUID:()=>de,warn:()=>Oe});module.exports=_(Ee);var Ue=-758.596,P;(t=>{let e;(a=>(a[a.InvalidPassword=-1]="InvalidPassword",a[a.Unknown=0]="Unknown",a[a.Unencrypted=1]="Unencrypted",a[a.Encrypted=2]="Encrypted"))(e=t.PeerCipherStatus||={})})(P||={});var $={bytesSent:0,bytesReceived:0,packetsSent:0,packetsReceived:0,rtt:0,packetLoss:0},J={packetsBuffered:0,packetsSeen:0,packetsProcessed:0,packetsTooEarly:0,packetsTooLate:0,packetsDropped:0,packetsInvalid:0,packetsRepeated:0,packetsLost:0},G={voiceActivity:{attackThreshold:.9,releaseThreshold:.8},volumeGate:{attackThreshold:-30,releaseThreshold:-40}},W={echoCanceller:!0,highPassFilter:!1,noiseSuppression:"Moderate",transientSuppressor:!1,gainController:!0};function g(e,t){e||x(t)}function x(e){throw new Error(e)}function o(e){return{type:"Success",value:e}}function u(e){return{type:"Failure",reason:e}}function H(e){return e.type==="Failure"&&x(e.reason),e.value}function m(e,t){return e.type==="Success"?e.value:t}function z(e){try{let t=atob(e),r=Uint8Array.from(t,s=>s.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function Z(e){try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/")),r=Uint8Array.from(t,s=>s.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function q(e){try{g(e!==void 0,"undefined cannot be converted to byte array"),g(e!==null,"null cannot be converted to byte array");let t=JSON.stringify(e),r=new TextEncoder;return o(r.encode(t))}catch(t){return u(String(t))}}function Y(e){try{g(e.length>0,"empty byte array cannot be converted to value");let t=new TextDecoder().decode(e),r=JSON.parse(t);return o(r)}catch(t){return u(String(t))}}var X=["VP8","VP9","AV1","H264"],v=class{constructor(t){this.codec=t}channels=0;clockRate=9e4;isValid(){return X.includes(this.codec)}isSupported(){if(typeof RTCRtpReceiver>"u"||typeof RTCRtpReceiver.getCapabilities>"u")return null;let t=m(this.getMimeType(),"").toLowerCase(),r=new Set(m(this.getSdpFmtpLine(),"").split(";").map(n=>n.trim().toLowerCase()));return RTCRtpReceiver.getCapabilities("video")?.codecs?.find(n=>{let s=n.mimeType.toLowerCase(),i=new Set((n.sdpFmtpLine??"").split(";").map(a=>a.trim().toLowerCase()));if(t!==s||r.size!==i.size)return!1;for(let a of r)if(!i.has(a))return!1;return!0})??null}getPayloadType(){switch(this.codec){case"VP8":return o(96);case"VP9":return o(98);case"AV1":return o(41);case"H264":return o(102);default:return u("invalid video codec")}}getMimeType(){switch(this.codec){case"VP8":return o("video/VP8");case"VP9":return o("video/VP9");case"AV1":return o("video/AV1");case"H264":return o("video/H264");default:return u("invalid video codec")}}getSdpFmtpLine(){switch(this.codec){case"VP8":return o("");case"VP9":return o("profile-id=2");case"AV1":return o("level-idx=5;profile=0;tier=0");case"H264":return o("level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f");default:return u("invalid video codec")}}};function K(e,t){for(let r of e)if(t(r))return r}function Q(){return typeof AudioContext<"u"&&typeof Worker<"u"}function ee(){return typeof SharedArrayBuffer<"u"}function A(){return/(apple)?webkit\/537\.36/i.test(globalThis.navigator.userAgent)}function te(){return/electron/i.test(globalThis.navigator.userAgent)}function re(){return/firefox|iceweasel|fxios/i.test(globalThis.navigator.userAgent)}function ne(){return A()?!1:/safari|applewebkit/i.test(globalThis.navigator.userAgent)}function oe(e){return JSON.parse(JSON.stringify(e))}var h=class e{constructor(t){this._Generators=t;this._Futures=t.map(e.addIndex)}_Futures;async next(){let[t,r]=await Promise.race(this._Futures);return this._Futures[r]=e.addIndex(this._Generators[r],r),t}static async addIndex(t,r){return[await t(),r]}};function ie(e,t){return e<=0?Promise.resolve(t):new Promise(r=>setTimeout(()=>r(t),e))}function se(e,t){return t.aborted?Promise.resolve("aborted"):new Promise(r=>{let n=()=>r("aborted");t.addEventListener("abort",n,{once:!0}),setTimeout(()=>{t.removeEventListener("abort",n),r(void 0)},e)})}function ae(){return new Promise(e=>setTimeout(e,0))}var L=class{_Tasks=[];_Running=!1;_Values;constructor(...t){this._Values=t}enqueue(t){return new Promise((r,n)=>{let s=async()=>{try{let i=await t(...this._Values);r(i)}catch(i){n(i)}};this._Tasks.push(s),this._Running||this.execute()})}async execute(){for(this._Running=!0;;){let t=this._Tasks.shift();if(t===void 0)break;await t()}this._Running=!1}};function ue(e){let t=e.trim();e.indexOf("://")===-1&&(t=`https://${t}`);try{return o(new URL(t))}catch(r){return u(String(r))}}function ce(e,t){let r=e.pathname;r.endsWith("/")===!1&&(r+="/");try{return o(new URL(r+t,e))}catch(n){return u(String(n))}}var le=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function pe(){return crypto.randomUUID()}function de(e){return le.test(e)}function ge(e,t){return t in e}function fe(e){return typeof e=="function"}function me(e){return typeof e=="object"&&e===null}function be(e){return typeof e=="number"}function ye(e){return typeof e=="object"}function xe(e){return typeof e=="string"}function ve(e){return typeof e>"u"}function he(e){return e.type==="Failure"}function Le(e){return e.type==="Success"}var{Deno:w}=globalThis,Re=typeof w?.noColor=="boolean"?w.noColor:!1,Te=!Re;function R(e,t){return{open:`\x1B[${e.join(";")}m`,close:`\x1B[${t}m`,regexp:new RegExp(`\\x1b\\[${t}m`,"g")}}function T(e,t){return Te?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function b(e){return T(e,R([0],0))}function k(e){return T(e,R([1],22))}function V(e){return T(e,R([2],22))}var rt=new RegExp(["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g");var Ce=new Date,p=(i=>(i[i.CRITICAL=0]="CRITICAL",i[i.ERROR=1]="ERROR",i[i.WARN=2]="WARN",i[i.INFO=3]="INFO",i[i.DEBUG=4]="DEBUG",i))(p||{}),S={0:"\u{1F4A5}",1:"\u{1F534}",2:"\u{1F7E1}",3:"\u{1F535}",4:"\u{1F7E3}"},Se={4:V,3:b,2:b,1:k,0:k};function Pe(e){for(let t of Object.keys(p))if(isNaN(Number(t))!==!1&&t.localeCompare(e,void 0,{sensitivity:"accent"})===0)return p[t]}function Ae({message:e}){return String(e)}function O(e){return JSON.stringify({timestamp:e.date.toISOString(),level:p[e.level],message:e.message,extra:e.extra})}function D(e){function t(a,l){return[Math.floor(a/l),a%l]}function r(){let a,l=e.date.valueOf()-Ce.valueOf();[l,a]=t(l,1e3);let[I,E]=t(l,60);return`${I.toString().padStart(4,"0")}:${E.toString().padStart(2,"0")}.${a.toString().padStart(4,"0")}`}function n(){return e.extra===void 0?"":"Deno"in globalThis?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let s=S[e.level],i=e.logger.name!==void 0?`@${e.logger}`:"";return`${b(r())}${i} ${s} ${Se[e.level](String(e.message))}${n()}`}function we(e){let t=`[${e.date.toISOString()}]`,r=`[${p[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",s=S[e.level];return`${t} ${s} ${r.padEnd(7," ")} ${n}${e.message}`}var B={sparse:Ae,json:O,pretty:D,structured:we,default:"Deno"in globalThis&&Deno.stdout.isTerminal()?D:O},f=class{formatter;consoleObject;filter;constructor(t=B.default,r=4,n=console){this.filter=r,this.formatter=t,this.consoleObject=n}handle(t){let r=this.formatter(t);switch(t.level){case 1:this.consoleObject.error(r);break;case 2:this.consoleObject.warn(r);break;case 3:this.consoleObject.info(r);break;case 4:this.consoleObject.debug(r);break}}},C=class extends f{handle(t){let r=this.formatter(t),n=t.extra!==void 0?[r,t.extra]:[r];switch(t.level){case 0:case 1:this.consoleObject.error(...n);break;case 2:this.consoleObject.warn(...n);break;case 3:this.consoleObject.info(...n);break;case 4:this.consoleObject.debug(...n);break}}},c=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(t,r=void 0,n=[],s=void 0){this.#e=r,this.sinks=n,this.filter=t,this.parent=s}log(t,r,n=void 0){let i={date:new Date,level:t,logger:this,message:r,extra:n};this.filter<t||this.insert(i)}insert(t){if(!(this.filter<t.level)){for(let r of this.sinks)r.filter>=t.level&&r.handle(t);this.parent!==void 0&&this.parent.insert(t)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},d=new c(3,void 0,[new f]),Ve=c.prototype.log.bind(d,1),Oe=c.prototype.log.bind(d,2),De=c.prototype.log.bind(d,3),Be=c.prototype.log.bind(d,4),Ie=c.prototype.log.bind(d);0&&(module.exports={APM_DEFAULTS,Backend,CONNECTION_STATS_INITIAL,ConsoleSink,Formatter,GLOBAL_LOGGER,InteractiveConsoleSink,JITTER_STATS_INITIAL,LogLevel,LogSymbols,Logger,MinDBFS,Selector,Strand,VAD_DEFAULTS,VideoCodec,abortableSleep,assert,debug,error,extendUrl,fail,failure,find,fromBase64,fromBase64Url,fromBytes,generateUUID,info,isAudioCapable,isBlinkBrowser,isElectronBrowser,isFailure,isFirefoxBrowser,isFunction,isNull,isNumber,isObject,isProperty,isSafariBrowser,isSharedArrayBufferCapable,isString,isSuccess,isUndefined,log,nextTick,normalizeUrl,sleep,success,toBytes,toRaw,tryParseLogLevel,unwrap,unwrapOr,validateUUID,warn});
1
+ var y=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var j=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},_=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of N(t))!M.call(e,s)&&s!==r&&y(e,s,{get:()=>t[s],enumerable:!(n=U(t,s))||n.enumerable});return e};var $=e=>_(y({},"__esModule",{value:!0}),e);var Ee={};j(Ee,{APM_DEFAULTS:()=>H,Backend:()=>A,CONNECTION_STATS_INITIAL:()=>G,CallbackSink:()=>S,ConsoleSink:()=>f,Formatter:()=>P,GLOBAL_LOGGER:()=>p,InteractiveConsoleSink:()=>C,JITTER_STATS_INITIAL:()=>J,LogLevel:()=>d,LogSymbols:()=>w,Logger:()=>c,MinDBFS:()=>Ne,Selector:()=>L,Strand:()=>h,VAD_DEFAULTS:()=>W,VideoCodec:()=>v,abortableSleep:()=>ae,assert:()=>g,debug:()=>Be,error:()=>Oe,extendUrl:()=>le,fail:()=>b,failure:()=>u,find:()=>Q,fromBase64:()=>Z,fromBase64Url:()=>q,fromBytes:()=>X,generateUUID:()=>pe,info:()=>De,isAudioCapable:()=>ee,isBlinkBrowser:()=>V,isElectronBrowser:()=>re,isFailure:()=>he,isFirefoxBrowser:()=>ne,isFunction:()=>me,isNull:()=>xe,isNumber:()=>ye,isObject:()=>be,isProperty:()=>fe,isSafariBrowser:()=>oe,isSharedArrayBufferCapable:()=>te,isString:()=>ve,isSuccess:()=>Re,isUndefined:()=>Le,log:()=>Ie,nextTick:()=>ue,normalizeUrl:()=>ce,sleep:()=>se,success:()=>o,toBytes:()=>Y,toRaw:()=>ie,tryParseLogLevel:()=>Pe,unwrap:()=>z,unwrapOr:()=>m,validateUUID:()=>ge,warn:()=>Fe});module.exports=$(Ee);var Ne=-758.596,A;(t=>{let e;(a=>(a[a.InvalidPassword=-1]="InvalidPassword",a[a.Unknown=0]="Unknown",a[a.Unencrypted=1]="Unencrypted",a[a.Encrypted=2]="Encrypted"))(e=t.PeerCipherStatus||={})})(A||={});var G={bytesSent:0,bytesReceived:0,packetsSent:0,packetsReceived:0,rtt:0,packetLoss:0},J={packetsBuffered:0,packetsSeen:0,packetsProcessed:0,packetsTooEarly:0,packetsTooLate:0,packetsDropped:0,packetsInvalid:0,packetsRepeated:0,packetsLost:0},W={voiceActivity:{attackThreshold:.9,releaseThreshold:.8},volumeGate:{attackThreshold:-30,releaseThreshold:-40}},H={echoCanceller:!0,highPassFilter:!1,noiseSuppression:"Moderate",transientSuppressor:!1,gainController:!0};function g(e,t){e||b(t)}function b(e){throw new Error(e)}function o(e){return{type:"Success",value:e}}function u(e){return{type:"Failure",reason:e}}function z(e){return e.type==="Failure"&&b(e.reason),e.value}function m(e,t){return e.type==="Success"?e.value:t}function Z(e){try{let t=atob(e),r=Uint8Array.from(t,s=>s.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function q(e){try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/")),r=Uint8Array.from(t,s=>s.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function Y(e){try{g(e!==void 0,"undefined cannot be converted to byte array"),g(e!==null,"null cannot be converted to byte array");let t=JSON.stringify(e),r=new TextEncoder;return o(r.encode(t))}catch(t){return u(String(t))}}function X(e){try{g(e.length>0,"empty byte array cannot be converted to value");let t=new TextDecoder().decode(e),r=JSON.parse(t);return o(r)}catch(t){return u(String(t))}}var K=["VP8","VP9","AV1","H264"],v=class{constructor(t){this.codec=t}channels=0;clockRate=9e4;isValid(){return K.includes(this.codec)}isSupported(){if(typeof RTCRtpReceiver>"u"||typeof RTCRtpReceiver.getCapabilities>"u")return null;let t=m(this.getMimeType(),"").toLowerCase(),r=new Set(m(this.getSdpFmtpLine(),"").split(";").map(n=>n.trim().toLowerCase()));return RTCRtpReceiver.getCapabilities("video")?.codecs?.find(n=>{let s=n.mimeType.toLowerCase(),i=new Set((n.sdpFmtpLine??"").split(";").map(a=>a.trim().toLowerCase()));if(t!==s||r.size!==i.size)return!1;for(let a of r)if(!i.has(a))return!1;return!0})??null}getPayloadType(){switch(this.codec){case"VP8":return o(96);case"VP9":return o(98);case"AV1":return o(41);case"H264":return o(102);default:return u("invalid video codec")}}getMimeType(){switch(this.codec){case"VP8":return o("video/VP8");case"VP9":return o("video/VP9");case"AV1":return o("video/AV1");case"H264":return o("video/H264");default:return u("invalid video codec")}}getSdpFmtpLine(){switch(this.codec){case"VP8":return o("");case"VP9":return o("profile-id=2");case"AV1":return o("level-idx=5;profile=0;tier=0");case"H264":return o("level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f");default:return u("invalid video codec")}}};function Q(e,t){for(let r of e)if(t(r))return r}function ee(){return typeof AudioContext<"u"&&typeof Worker<"u"}function te(){return typeof SharedArrayBuffer<"u"}function V(){return/(apple)?webkit\/537\.36/i.test(globalThis.navigator.userAgent)}function re(){return/electron/i.test(globalThis.navigator.userAgent)}function ne(){return/firefox|iceweasel|fxios/i.test(globalThis.navigator.userAgent)}function oe(){return V()?!1:/safari|applewebkit/i.test(globalThis.navigator.userAgent)}function ie(e){return JSON.parse(JSON.stringify(e))}var L=class e{constructor(t){this._Generators=t;this._Futures=t.map(e.addIndex)}_Futures;async next(){let[t,r]=await Promise.race(this._Futures);return this._Futures[r]=e.addIndex(this._Generators[r],r),t}static async addIndex(t,r){return[await t(),r]}};function se(e,t){return e<=0?Promise.resolve(t):new Promise(r=>setTimeout(()=>r(t),e))}function ae(e,t){return t.aborted?Promise.resolve("aborted"):new Promise(r=>{let n=()=>r("aborted");t.addEventListener("abort",n,{once:!0}),setTimeout(()=>{t.removeEventListener("abort",n),r(void 0)},e)})}function ue(){return new Promise(e=>setTimeout(e,0))}var h=class{_Tasks=[];_Running=!1;_Values;constructor(...t){this._Values=t}enqueue(t){return new Promise((r,n)=>{let s=async()=>{try{let i=await t(...this._Values);r(i)}catch(i){n(i)}};this._Tasks.push(s),this._Running||this.execute()})}async execute(){for(this._Running=!0;;){let t=this._Tasks.shift();if(t===void 0)break;await t()}this._Running=!1}};function ce(e){let t=e.trim();e.indexOf("://")===-1&&(t=`https://${t}`);try{return o(new URL(t))}catch(r){return u(String(r))}}function le(e,t){let r=e.pathname;r.endsWith("/")===!1&&(r+="/");try{return o(new URL(r+t,e))}catch(n){return u(String(n))}}var de=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function pe(){return crypto.randomUUID()}function ge(e){return de.test(e)}function fe(e,t){return t in e}function me(e){return typeof e=="function"}function xe(e){return typeof e=="object"&&e===null}function ye(e){return typeof e=="number"}function be(e){return typeof e=="object"}function ve(e){return typeof e=="string"}function Le(e){return typeof e>"u"}function he(e){return e.type==="Failure"}function Re(e){return e.type==="Success"}var{Deno:O}=globalThis,ke=typeof O?.noColor=="boolean"?O.noColor:!1,Te=!ke;function R(e,t){return{open:`\x1B[${e.join(";")}m`,close:`\x1B[${t}m`,regexp:new RegExp(`\\x1b\\[${t}m`,"g")}}function k(e,t){return Te?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function x(e){return k(e,R([0],0))}function T(e){return k(e,R([1],22))}function F(e){return k(e,R([2],22))}var nt=new RegExp(["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g");var Se=new Date,d=(i=>(i[i.CRITICAL=0]="CRITICAL",i[i.ERROR=1]="ERROR",i[i.WARN=2]="WARN",i[i.INFO=3]="INFO",i[i.DEBUG=4]="DEBUG",i))(d||{}),w={0:"\u{1F4A5}",1:"\u{1F534}",2:"\u{1F7E1}",3:"\u{1F535}",4:"\u{1F7E3}"},we={4:F,3:x,2:x,1:T,0:T};function Pe(e){for(let t of Object.keys(d))if(isNaN(Number(t))!==!1&&t.localeCompare(e,void 0,{sensitivity:"accent"})===0)return d[t]}function Ae({message:e}){return String(e)}function D(e){return JSON.stringify({timestamp:e.date.toISOString(),level:d[e.level],message:e.message,extra:e.extra})}function B(e){function t(a,l){return[Math.floor(a/l),a%l]}function r(){let a,l=e.date.valueOf()-Se.valueOf();[l,a]=t(l,1e3);let[I,E]=t(l,60);return`${I.toString().padStart(4,"0")}:${E.toString().padStart(2,"0")}.${a.toString().padStart(4,"0")}`}function n(){return e.extra===void 0?"":"Deno"in globalThis?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let s=w[e.level],i=e.logger.name!==void 0?`@${e.logger}`:"";return`${x(r())}${i} ${s} ${we[e.level](String(e.message))}${n()}`}function Ve(e){let t=`[${e.date.toISOString()}]`,r=`[${d[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",s=w[e.level];return`${t} ${s} ${r.padEnd(7," ")} ${n}${e.message}`}var P={sparse:Ae,json:D,pretty:B,structured:Ve,default:"Deno"in globalThis&&Deno.stdout.isTerminal()?B:D},f=class{formatter;consoleObject;filter;constructor(t=P.default,r=4,n=console){this.filter=r,this.formatter=t,this.consoleObject=n}handle(t){let r=this.formatter(t);switch(t.level){case 1:this.consoleObject.error(r);break;case 2:this.consoleObject.warn(r);break;case 3:this.consoleObject.info(r);break;case 4:this.consoleObject.debug(r);break}}},C=class extends f{handle(t){let r=this.formatter(t),n=t.extra!==void 0?[r,t.extra]:[r];switch(t.level){case 0:case 1:this.consoleObject.error(...n);break;case 2:this.consoleObject.warn(...n);break;case 3:this.consoleObject.info(...n);break;case 4:this.consoleObject.debug(...n);break}}},S=class{formatter;cb;filter;constructor(t,r=P.default,n=4){this.cb=t,this.formatter=r,this.filter=n}handle(t){let r=this.formatter(t);this.cb(r,t)}},c=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(t,r=void 0,n=[],s=void 0){this.#e=r,this.sinks=n,this.filter=t,this.parent=s}log(t,r,n=void 0){let i={date:new Date,level:t,logger:this,message:r,extra:n};this.filter<t||this.insert(i)}insert(t){if(!(this.filter<t.level)){for(let r of this.sinks)r.filter>=t.level&&r.handle(t);this.parent!==void 0&&this.parent.insert(t)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},p=new c(3,void 0,[new f]),Oe=c.prototype.log.bind(p,1),Fe=c.prototype.log.bind(p,2),De=c.prototype.log.bind(p,3),Be=c.prototype.log.bind(p,4),Ie=c.prototype.log.bind(p);0&&(module.exports={APM_DEFAULTS,Backend,CONNECTION_STATS_INITIAL,CallbackSink,ConsoleSink,Formatter,GLOBAL_LOGGER,InteractiveConsoleSink,JITTER_STATS_INITIAL,LogLevel,LogSymbols,Logger,MinDBFS,Selector,Strand,VAD_DEFAULTS,VideoCodec,abortableSleep,assert,debug,error,extendUrl,fail,failure,find,fromBase64,fromBase64Url,fromBytes,generateUUID,info,isAudioCapable,isBlinkBrowser,isElectronBrowser,isFailure,isFirefoxBrowser,isFunction,isNull,isNumber,isObject,isProperty,isSafariBrowser,isSharedArrayBufferCapable,isString,isSuccess,isUndefined,log,nextTick,normalizeUrl,sleep,success,toBytes,toRaw,tryParseLogLevel,unwrap,unwrapOr,validateUUID,warn});
package/esm/api/mod.js ADDED
@@ -0,0 +1 @@
1
+ import{z as d}from"zod";import{z as r}from"zod";var s=r.custom(n=>n instanceof Uint8Array),f=r.lazy(()=>r.union([r.union([r.string(),r.number(),r.boolean(),r.null()]),r.array(f),r.record(r.string(),f)])),$=r.union([r.tuple([r.literal(0),r.number(),r.string(),r.unknown()]),r.tuple([r.literal(1),r.number(),r.nullable(r.string()),r.unknown()]),r.tuple([r.literal(2),r.string(),r.unknown()])]);function b(n){return r.union([n.transform(p=>[p]),r.array(n)])}var H=d.enum(["sfu","gateway"]),W=d.enum(["connect","roomclose","roomupdate","roombanclient","roomsendmessage"]),oe=d.object({uid:d.string(),cid:d.string().optional(),rid:b(d.string()).refine(n=>n.length>=1,{message:"missing rid"}),nsp:d.string().optional(),adr:d.string().optional(),aud:b(H).optional(),sub:b(W).optional(),exp:d.number().optional(),nbf:d.number().optional(),ups:d.string().optional(),tgs:b(d.string()).optional(),tsp:d.number().optional(),internal:d.object({server:d.string().optional()}).optional()});import{z as e}from"zod";import{z as c}from"zod";var l=c.number(),E=c.object({kind:c.literal("audio").optional(),uid:c.string().optional(),customType:c.string().optional()}),B=c.object({kind:c.literal("video"),codec:c.string().optional(),uid:c.string().optional(),customType:c.string().optional(),id:c.string().optional()}),_=c.union([E,B]),k=c.object({id:l,properties:_,paused:c.boolean()});import{z as i}from"zod";var u=i.number(),S=i.union([i.tuple([i.number(),i.number(),i.number()]),i.tuple([i.number(),i.number()])]),z=i.object({id:u,user_id:i.string(),user_data:s,medias:i.array(k)}),C=i.discriminatedUnion("kind",[i.object({kind:i.literal("UserDataChanged"),peer_id:u,user_data:s}),i.object({kind:i.literal("MediaStarted"),peer_id:u,media:k}),i.object({kind:i.literal("MediaStopped"),peer_id:u,media_id:l})]);var P=e.string(),T;(x=>(x.RoomSchema=e.object({id:P,customer:e.string(),user_data:s,peers:e.array(z)}),x.RoomUpdateSchema=e.discriminatedUnion("kind",[e.object({kind:e.literal("Joined"),room:x.RoomSchema,media_ids:e.array(l),own_peer_id:u}),e.object({kind:e.literal("Left"),reason:e.enum(["RoomClosing","ServerClosing","PeerKicked"])}),e.object({kind:e.literal("PeerJoined"),peer:z}),e.object({kind:e.literal("PeerLeft"),peer_id:u}),e.object({kind:e.literal("UserDataChanged"),user_data:s.optional()})]),x.RoomUpdatesSchema=e.object({updates:e.array(x.RoomUpdateSchema)}),x.RoomStatusSchema=e.enum(["Joining","Joined","Closed"]),x.RoomStatusChangedSchema=e.object({status:x.RoomStatusSchema,message:e.string().optional()})))(T||={});var O;(t=>{t.ParametersSchema=e.record(e.string(),f),t.HelloRoomSchema=e.object({token:e.string(),room_id:P.optional(),user_data:s.optional(),parameters:t.ParametersSchema.optional()}),t.ClientHelloSchema=e.object({Room:t.HelloRoomSchema}),t.ServerHelloSchema=e.union([e.object({Ok:e.object({})}),e.object({Rejected:e.object({message:e.string()})})]);let y=e.object({user_data:s.optional(),tags:e.array(e.string()).optional(),audio_parameters:t.ParametersSchema.optional(),video_parameters:t.ParametersSchema.optional()});t.PeerPropertiesSchema=y,t.PingSchema=e.object({Ping:e.object({id:e.number()})}),t.ChangeSelfSchema=e.object({ChangeSelf:y.omit({tags:!0})}),t.SetAudioMaskSchema=e.object({SetAudioMask:e.object({peer_id:e.number(),mask:e.bigint().nonnegative().lte(0xFFFFFFFFFFFFFFFFn)})}),t.SendMessageSchema=e.object({SendMessage:e.object({peer_ids:e.number().array().default([]),message:s})}),t.CallSchema=t.PingSchema.or(t.ChangeSelfSchema).or(t.SetAudioMaskSchema).or(t.SendMessageSchema),t.PongSchema=e.object({Pong:e.object({id:e.number()})}),t.JoinedSchema=e.object({Joined:e.object({own_peer_id:e.number(),room_id:e.string(),customer:e.string()})}),t.LeftSchema=e.object({Left:e.object({reason:e.enum(["room_closing","server_closing","peer_kicked"])})}),t.PeerJoinedSchema=e.object({PeerJoined:y.extend({peer_id:e.number(),user_id:e.string()})}),t.PeerLeftSchema=e.object({PeerLeft:e.object({peer_id:e.number()})}),t.PeerChangedSchema=e.object({PeerChanged:y.extend({peer_id:e.number()})}),t.NewReconnectTokenSchema=e.object({NewReconnectToken:e.object({token:e.string()})}),t.MessageReceivedSchema=e.object({MessageReceived:e.object({sender_peer_id:e.number(),message:s})}),t.ServerErrorSchema=e.object({Error:e.object({message:s})}),t.EventSchema=t.PongSchema.or(t.JoinedSchema).or(t.LeftSchema).or(t.PeerJoinedSchema).or(t.PeerLeftSchema).or(t.PeerChangedSchema).or(t.NewReconnectTokenSchema).or(t.MessageReceivedSchema).or(t.ServerErrorSchema)})(O||={});import{z as D}from"zod";var M=D.object({sender_peer_id:u,message:s});import{z as a}from"zod";var h=a.discriminatedUnion("kind",[a.object({kind:a.literal("Sdp"),type:a.enum(["Answer","Offer"]),sdp:a.string(),media_map:a.array(a.tuple([l,a.string()]))}),a.object({kind:a.literal("Trickle"),candidate:a.string(),spd_mid:a.string().optional(),spd_mline_index:a.number().optional(),username_fragment:a.union([a.string(),a.null()]).optional()}),a.object({kind:a.literal("TrickleFinished")})]);import{z as o}from"zod";function R(n,p){n||G(p)}function G(n){throw new Error(n)}function je(n,p,g){let m=g[n];if(!m)return;let y=m.request.safeParse(p);return y.success?{name:n,request:y.data}:void 0}function Ue(n,p,g){let m=g[n];return R(m!==void 0,"unknown command schema"),m.request.parse(p)}function ve(n,p,g){let m=g[n]?.response.safeParse(p);return m?.success?m.data:void 0}var Ae={Hello:{request:o.object({stream:o.literal("main")}),response:o.null()},JoinRoom:{request:o.object({token:o.string(),room_id:P,user_data:s,position:S}),response:o.object({peer_id:u,stream_id:o.number().optional(),token:o.string().optional()})},WebRtcUpdate:{request:h,response:o.null()},RequestReconnectToken:{request:o.object({peer_id:u.optional()}),response:o.string()},Ping:{request:o.object({}),response:o.null()}},Ie={Hello:{request:o.object({stream:o.literal("room"),token:o.string(),room_id:o.string(),user_data:s,position:S}),response:o.null()},UpdatePeer:{request:o.object({user_data:s}),response:o.null()},StartMedia:{request:o.object({media_id:l,properties:_}),response:o.null()},StopMedia:{request:o.object({media_id:l}),response:o.null()},PauseMedia:{request:o.object({media_id:l}),response:o.null()},ResumeMedia:{request:o.object({media_id:l}),response:o.null()},SetPeerPosition:{request:o.object({position:S}),response:o.null()},SendMessage:{request:o.object({target_peer_ids:o.array(u).optional(),message:s}),response:o.null()}};function Fe(n,p,g){let m=g[n];if(!m)return;let y=m.safeParse(p);return y.success?{name:n,properties:y.data}:void 0}var Le={WebRtcUpdate:h},He={RoomStatusChanged:T.RoomStatusChangedSchema,RoomUpdated:T.RoomUpdatesSchema,PeerUpdated:C,MessageReceived:M};export{s as ByteArraySchema,f as JsonSchema,Ae as MainCommandsRpc,Le as MainNotificationsRpc,E as MediaAudioPropertiesSchema,l as MediaIdSchema,_ as MediaPropertiesSchema,k as MediaSchema,B as MediaVideoPropertiesSchema,$ as MessagePackRpcSchema,M as MessageReceivedSchema,u as PeerIdSchema,S as PeerPositionSchema,z as PeerSchema,C as PeerUpdateSchema,Ie as RoomCommandsRpc,P as RoomIdSchema,He as RoomNotificationsRpc,T as RoomV1,O as RoomV2,H as TokenAudienceSchema,oe as TokenClaimsSchema,W as TokenSubjectSchema,h as WebRtcUpdateSchema,b as oneOrMany,je as parseCommand,Fe as parseNotification,Ue as parseRequest,ve as parseResponse};
package/esm/mod.js CHANGED
@@ -1 +1 @@
1
- var G=-758.596,D;(t=>{let e;(s=>(s[s.InvalidPassword=-1]="InvalidPassword",s[s.Unknown=0]="Unknown",s[s.Unencrypted=1]="Unencrypted",s[s.Encrypted=2]="Encrypted"))(e=t.PeerCipherStatus||={})})(D||={});var W={bytesSent:0,bytesReceived:0,packetsSent:0,packetsReceived:0,rtt:0,packetLoss:0},H={packetsBuffered:0,packetsSeen:0,packetsProcessed:0,packetsTooEarly:0,packetsTooLate:0,packetsDropped:0,packetsInvalid:0,packetsRepeated:0,packetsLost:0},z={voiceActivity:{attackThreshold:.9,releaseThreshold:.8},volumeGate:{attackThreshold:-30,releaseThreshold:-40}},Z={echoCanceller:!0,highPassFilter:!1,noiseSuppression:"Moderate",transientSuppressor:!1,gainController:!0};function g(e,t){e||h(t)}function h(e){throw new Error(e)}function o(e){return{type:"Success",value:e}}function u(e){return{type:"Failure",reason:e}}function Y(e){return e.type==="Failure"&&h(e.reason),e.value}function b(e,t){return e.type==="Success"?e.value:t}function Q(e){try{let t=atob(e),r=Uint8Array.from(t,a=>a.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function ee(e){try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/")),r=Uint8Array.from(t,a=>a.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function ne(e){try{g(e!==void 0,"undefined cannot be converted to byte array"),g(e!==null,"null cannot be converted to byte array");let t=JSON.stringify(e),r=new TextEncoder;return o(r.encode(t))}catch(t){return u(String(t))}}function oe(e){try{g(e.length>0,"empty byte array cannot be converted to value");let t=new TextDecoder().decode(e),r=JSON.parse(t);return o(r)}catch(t){return u(String(t))}}var B=["VP8","VP9","AV1","H264"],L=class{constructor(t){this.codec=t}channels=0;clockRate=9e4;isValid(){return B.includes(this.codec)}isSupported(){if(typeof RTCRtpReceiver>"u"||typeof RTCRtpReceiver.getCapabilities>"u")return null;let t=b(this.getMimeType(),"").toLowerCase(),r=new Set(b(this.getSdpFmtpLine(),"").split(";").map(n=>n.trim().toLowerCase()));return RTCRtpReceiver.getCapabilities("video")?.codecs?.find(n=>{let a=n.mimeType.toLowerCase(),i=new Set((n.sdpFmtpLine??"").split(";").map(s=>s.trim().toLowerCase()));if(t!==a||r.size!==i.size)return!1;for(let s of r)if(!i.has(s))return!1;return!0})??null}getPayloadType(){switch(this.codec){case"VP8":return o(96);case"VP9":return o(98);case"AV1":return o(41);case"H264":return o(102);default:return u("invalid video codec")}}getMimeType(){switch(this.codec){case"VP8":return o("video/VP8");case"VP9":return o("video/VP9");case"AV1":return o("video/AV1");case"H264":return o("video/H264");default:return u("invalid video codec")}}getSdpFmtpLine(){switch(this.codec){case"VP8":return o("");case"VP9":return o("profile-id=2");case"AV1":return o("level-idx=5;profile=0;tier=0");case"H264":return o("level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f");default:return u("invalid video codec")}}};function ue(e,t){for(let r of e)if(t(r))return r}function le(){return typeof AudioContext<"u"&&typeof Worker<"u"}function pe(){return typeof SharedArrayBuffer<"u"}function I(){return/(apple)?webkit\/537\.36/i.test(globalThis.navigator.userAgent)}function de(){return/electron/i.test(globalThis.navigator.userAgent)}function ge(){return/firefox|iceweasel|fxios/i.test(globalThis.navigator.userAgent)}function fe(){return I()?!1:/safari|applewebkit/i.test(globalThis.navigator.userAgent)}function be(e){return JSON.parse(JSON.stringify(e))}var R=class e{constructor(t){this._Generators=t;this._Futures=t.map(e.addIndex)}_Futures;async next(){let[t,r]=await Promise.race(this._Futures);return this._Futures[r]=e.addIndex(this._Generators[r],r),t}static async addIndex(t,r){return[await t(),r]}};function ve(e,t){return e<=0?Promise.resolve(t):new Promise(r=>setTimeout(()=>r(t),e))}function he(e,t){return t.aborted?Promise.resolve("aborted"):new Promise(r=>{let n=()=>r("aborted");t.addEventListener("abort",n,{once:!0}),setTimeout(()=>{t.removeEventListener("abort",n),r(void 0)},e)})}function Le(){return new Promise(e=>setTimeout(e,0))}var T=class{_Tasks=[];_Running=!1;_Values;constructor(...t){this._Values=t}enqueue(t){return new Promise((r,n)=>{let a=async()=>{try{let i=await t(...this._Values);r(i)}catch(i){n(i)}};this._Tasks.push(a),this._Running||this.execute()})}async execute(){for(this._Running=!0;;){let t=this._Tasks.shift();if(t===void 0)break;await t()}this._Running=!1}};function Ce(e){let t=e.trim();e.indexOf("://")===-1&&(t=`https://${t}`);try{return o(new URL(t))}catch(r){return u(String(r))}}function Se(e,t){let r=e.pathname;r.endsWith("/")===!1&&(r+="/");try{return o(new URL(r+t,e))}catch(n){return u(String(n))}}var E=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function Ae(){return crypto.randomUUID()}function we(e){return E.test(e)}function Oe(e,t){return t in e}function De(e){return typeof e=="function"}function Be(e){return typeof e=="object"&&e===null}function Ie(e){return typeof e=="number"}function Ee(e){return typeof e=="object"}function Fe(e){return typeof e=="string"}function Ue(e){return typeof e>"u"}function Ne(e){return e.type==="Failure"}function Me(e){return e.type==="Success"}var{Deno:k}=globalThis,F=typeof k?.noColor=="boolean"?k.noColor:!1,U=!F;function y(e,t){return{open:`\x1B[${e.join(";")}m`,close:`\x1B[${t}m`,regexp:new RegExp(`\\x1b\\[${t}m`,"g")}}function x(e,t){return U?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function f(e){return x(e,y([0],0))}function v(e){return x(e,y([1],22))}function C(e){return x(e,y([2],22))}var _e=new RegExp(["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g");var M=new Date,p=(i=>(i[i.CRITICAL=0]="CRITICAL",i[i.ERROR=1]="ERROR",i[i.WARN=2]="WARN",i[i.INFO=3]="INFO",i[i.DEBUG=4]="DEBUG",i))(p||{}),w={0:"\u{1F4A5}",1:"\u{1F534}",2:"\u{1F7E1}",3:"\u{1F535}",4:"\u{1F7E3}"},j={4:C,3:f,2:f,1:v,0:v};function $e(e){for(let t of Object.keys(p))if(isNaN(Number(t))!==!1&&t.localeCompare(e,void 0,{sensitivity:"accent"})===0)return p[t]}function _({message:e}){return String(e)}function S(e){return JSON.stringify({timestamp:e.date.toISOString(),level:p[e.level],message:e.message,extra:e.extra})}function P(e){function t(s,l){return[Math.floor(s/l),s%l]}function r(){let s,l=e.date.valueOf()-M.valueOf();[l,s]=t(l,1e3);let[V,O]=t(l,60);return`${V.toString().padStart(4,"0")}:${O.toString().padStart(2,"0")}.${s.toString().padStart(4,"0")}`}function n(){return e.extra===void 0?"":"Deno"in globalThis?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let a=w[e.level],i=e.logger.name!==void 0?`@${e.logger}`:"";return`${f(r())}${i} ${a} ${j[e.level](String(e.message))}${n()}`}function $(e){let t=`[${e.date.toISOString()}]`,r=`[${p[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",a=w[e.level];return`${t} ${a} ${r.padEnd(7," ")} ${n}${e.message}`}var J={sparse:_,json:S,pretty:P,structured:$,default:"Deno"in globalThis&&Deno.stdout.isTerminal()?P:S},m=class{formatter;consoleObject;filter;constructor(t=J.default,r=4,n=console){this.filter=r,this.formatter=t,this.consoleObject=n}handle(t){let r=this.formatter(t);switch(t.level){case 1:this.consoleObject.error(r);break;case 2:this.consoleObject.warn(r);break;case 3:this.consoleObject.info(r);break;case 4:this.consoleObject.debug(r);break}}},A=class extends m{handle(t){let r=this.formatter(t),n=t.extra!==void 0?[r,t.extra]:[r];switch(t.level){case 0:case 1:this.consoleObject.error(...n);break;case 2:this.consoleObject.warn(...n);break;case 3:this.consoleObject.info(...n);break;case 4:this.consoleObject.debug(...n);break}}},c=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(t,r=void 0,n=[],a=void 0){this.#e=r,this.sinks=n,this.filter=t,this.parent=a}log(t,r,n=void 0){let i={date:new Date,level:t,logger:this,message:r,extra:n};this.filter<t||this.insert(i)}insert(t){if(!(this.filter<t.level)){for(let r of this.sinks)r.filter>=t.level&&r.handle(t);this.parent!==void 0&&this.parent.insert(t)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},d=new c(3,void 0,[new m]),Je=c.prototype.log.bind(d,1),Ge=c.prototype.log.bind(d,2),We=c.prototype.log.bind(d,3),He=c.prototype.log.bind(d,4),ze=c.prototype.log.bind(d);export{Z as APM_DEFAULTS,D as Backend,W as CONNECTION_STATS_INITIAL,m as ConsoleSink,J as Formatter,d as GLOBAL_LOGGER,A as InteractiveConsoleSink,H as JITTER_STATS_INITIAL,p as LogLevel,w as LogSymbols,c as Logger,G as MinDBFS,R as Selector,T as Strand,z as VAD_DEFAULTS,L as VideoCodec,he as abortableSleep,g as assert,He as debug,Je as error,Se as extendUrl,h as fail,u as failure,ue as find,Q as fromBase64,ee as fromBase64Url,oe as fromBytes,Ae as generateUUID,We as info,le as isAudioCapable,I as isBlinkBrowser,de as isElectronBrowser,Ne as isFailure,ge as isFirefoxBrowser,De as isFunction,Be as isNull,Ie as isNumber,Ee as isObject,Oe as isProperty,fe as isSafariBrowser,pe as isSharedArrayBufferCapable,Fe as isString,Me as isSuccess,Ue as isUndefined,ze as log,Le as nextTick,Ce as normalizeUrl,ve as sleep,o as success,ne as toBytes,be as toRaw,$e as tryParseLogLevel,Y as unwrap,b as unwrapOr,we as validateUUID,Ge as warn};
1
+ var W=-758.596,B;(t=>{let e;(s=>(s[s.InvalidPassword=-1]="InvalidPassword",s[s.Unknown=0]="Unknown",s[s.Unencrypted=1]="Unencrypted",s[s.Encrypted=2]="Encrypted"))(e=t.PeerCipherStatus||={})})(B||={});var H={bytesSent:0,bytesReceived:0,packetsSent:0,packetsReceived:0,rtt:0,packetLoss:0},z={packetsBuffered:0,packetsSeen:0,packetsProcessed:0,packetsTooEarly:0,packetsTooLate:0,packetsDropped:0,packetsInvalid:0,packetsRepeated:0,packetsLost:0},Z={voiceActivity:{attackThreshold:.9,releaseThreshold:.8},volumeGate:{attackThreshold:-30,releaseThreshold:-40}},q={echoCanceller:!0,highPassFilter:!1,noiseSuppression:"Moderate",transientSuppressor:!1,gainController:!0};function g(e,t){e||L(t)}function L(e){throw new Error(e)}function o(e){return{type:"Success",value:e}}function u(e){return{type:"Failure",reason:e}}function X(e){return e.type==="Failure"&&L(e.reason),e.value}function x(e,t){return e.type==="Success"?e.value:t}function ee(e){try{let t=atob(e),r=Uint8Array.from(t,a=>a.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function te(e){try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/")),r=Uint8Array.from(t,a=>a.codePointAt(0)),n=new TextDecoder("utf8");return o(n.decode(r))}catch(t){return u(String(t))}}function oe(e){try{g(e!==void 0,"undefined cannot be converted to byte array"),g(e!==null,"null cannot be converted to byte array");let t=JSON.stringify(e),r=new TextEncoder;return o(r.encode(t))}catch(t){return u(String(t))}}function ie(e){try{g(e.length>0,"empty byte array cannot be converted to value");let t=new TextDecoder().decode(e),r=JSON.parse(t);return o(r)}catch(t){return u(String(t))}}var I=["VP8","VP9","AV1","H264"],h=class{constructor(t){this.codec=t}channels=0;clockRate=9e4;isValid(){return I.includes(this.codec)}isSupported(){if(typeof RTCRtpReceiver>"u"||typeof RTCRtpReceiver.getCapabilities>"u")return null;let t=x(this.getMimeType(),"").toLowerCase(),r=new Set(x(this.getSdpFmtpLine(),"").split(";").map(n=>n.trim().toLowerCase()));return RTCRtpReceiver.getCapabilities("video")?.codecs?.find(n=>{let a=n.mimeType.toLowerCase(),i=new Set((n.sdpFmtpLine??"").split(";").map(s=>s.trim().toLowerCase()));if(t!==a||r.size!==i.size)return!1;for(let s of r)if(!i.has(s))return!1;return!0})??null}getPayloadType(){switch(this.codec){case"VP8":return o(96);case"VP9":return o(98);case"AV1":return o(41);case"H264":return o(102);default:return u("invalid video codec")}}getMimeType(){switch(this.codec){case"VP8":return o("video/VP8");case"VP9":return o("video/VP9");case"AV1":return o("video/AV1");case"H264":return o("video/H264");default:return u("invalid video codec")}}getSdpFmtpLine(){switch(this.codec){case"VP8":return o("");case"VP9":return o("profile-id=2");case"AV1":return o("level-idx=5;profile=0;tier=0");case"H264":return o("level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f");default:return u("invalid video codec")}}};function ce(e,t){for(let r of e)if(t(r))return r}function de(){return typeof AudioContext<"u"&&typeof Worker<"u"}function pe(){return typeof SharedArrayBuffer<"u"}function E(){return/(apple)?webkit\/537\.36/i.test(globalThis.navigator.userAgent)}function ge(){return/electron/i.test(globalThis.navigator.userAgent)}function fe(){return/firefox|iceweasel|fxios/i.test(globalThis.navigator.userAgent)}function me(){return E()?!1:/safari|applewebkit/i.test(globalThis.navigator.userAgent)}function ye(e){return JSON.parse(JSON.stringify(e))}var R=class e{constructor(t){this._Generators=t;this._Futures=t.map(e.addIndex)}_Futures;async next(){let[t,r]=await Promise.race(this._Futures);return this._Futures[r]=e.addIndex(this._Generators[r],r),t}static async addIndex(t,r){return[await t(),r]}};function Le(e,t){return e<=0?Promise.resolve(t):new Promise(r=>setTimeout(()=>r(t),e))}function he(e,t){return t.aborted?Promise.resolve("aborted"):new Promise(r=>{let n=()=>r("aborted");t.addEventListener("abort",n,{once:!0}),setTimeout(()=>{t.removeEventListener("abort",n),r(void 0)},e)})}function Re(){return new Promise(e=>setTimeout(e,0))}var k=class{_Tasks=[];_Running=!1;_Values;constructor(...t){this._Values=t}enqueue(t){return new Promise((r,n)=>{let a=async()=>{try{let i=await t(...this._Values);r(i)}catch(i){n(i)}};this._Tasks.push(a),this._Running||this.execute()})}async execute(){for(this._Running=!0;;){let t=this._Tasks.shift();if(t===void 0)break;await t()}this._Running=!1}};function Se(e){let t=e.trim();e.indexOf("://")===-1&&(t=`https://${t}`);try{return o(new URL(t))}catch(r){return u(String(r))}}function we(e,t){let r=e.pathname;r.endsWith("/")===!1&&(r+="/");try{return o(new URL(r+t,e))}catch(n){return u(String(n))}}var U=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function Ae(){return crypto.randomUUID()}function Ve(e){return U.test(e)}function Fe(e,t){return t in e}function De(e){return typeof e=="function"}function Be(e){return typeof e=="object"&&e===null}function Ie(e){return typeof e=="number"}function Ee(e){return typeof e=="object"}function Ue(e){return typeof e=="string"}function Ne(e){return typeof e>"u"}function Me(e){return e.type==="Failure"}function je(e){return e.type==="Success"}var{Deno:T}=globalThis,N=typeof T?.noColor=="boolean"?T.noColor:!1,M=!N;function y(e,t){return{open:`\x1B[${e.join(";")}m`,close:`\x1B[${t}m`,regexp:new RegExp(`\\x1b\\[${t}m`,"g")}}function b(e,t){return M?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function f(e){return b(e,y([0],0))}function v(e){return b(e,y([1],22))}function C(e){return b(e,y([2],22))}var $e=new RegExp(["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g");var _=new Date,d=(i=>(i[i.CRITICAL=0]="CRITICAL",i[i.ERROR=1]="ERROR",i[i.WARN=2]="WARN",i[i.INFO=3]="INFO",i[i.DEBUG=4]="DEBUG",i))(d||{}),V={0:"\u{1F4A5}",1:"\u{1F534}",2:"\u{1F7E1}",3:"\u{1F535}",4:"\u{1F7E3}"},$={4:C,3:f,2:f,1:v,0:v};function Ge(e){for(let t of Object.keys(d))if(isNaN(Number(t))!==!1&&t.localeCompare(e,void 0,{sensitivity:"accent"})===0)return d[t]}function G({message:e}){return String(e)}function S(e){return JSON.stringify({timestamp:e.date.toISOString(),level:d[e.level],message:e.message,extra:e.extra})}function w(e){function t(s,l){return[Math.floor(s/l),s%l]}function r(){let s,l=e.date.valueOf()-_.valueOf();[l,s]=t(l,1e3);let[F,D]=t(l,60);return`${F.toString().padStart(4,"0")}:${D.toString().padStart(2,"0")}.${s.toString().padStart(4,"0")}`}function n(){return e.extra===void 0?"":"Deno"in globalThis?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let a=V[e.level],i=e.logger.name!==void 0?`@${e.logger}`:"";return`${f(r())}${i} ${a} ${$[e.level](String(e.message))}${n()}`}function J(e){let t=`[${e.date.toISOString()}]`,r=`[${d[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",a=V[e.level];return`${t} ${a} ${r.padEnd(7," ")} ${n}${e.message}`}var O={sparse:G,json:S,pretty:w,structured:J,default:"Deno"in globalThis&&Deno.stdout.isTerminal()?w:S},m=class{formatter;consoleObject;filter;constructor(t=O.default,r=4,n=console){this.filter=r,this.formatter=t,this.consoleObject=n}handle(t){let r=this.formatter(t);switch(t.level){case 1:this.consoleObject.error(r);break;case 2:this.consoleObject.warn(r);break;case 3:this.consoleObject.info(r);break;case 4:this.consoleObject.debug(r);break}}},P=class extends m{handle(t){let r=this.formatter(t),n=t.extra!==void 0?[r,t.extra]:[r];switch(t.level){case 0:case 1:this.consoleObject.error(...n);break;case 2:this.consoleObject.warn(...n);break;case 3:this.consoleObject.info(...n);break;case 4:this.consoleObject.debug(...n);break}}},A=class{formatter;cb;filter;constructor(t,r=O.default,n=4){this.cb=t,this.formatter=r,this.filter=n}handle(t){let r=this.formatter(t);this.cb(r,t)}},c=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(t,r=void 0,n=[],a=void 0){this.#e=r,this.sinks=n,this.filter=t,this.parent=a}log(t,r,n=void 0){let i={date:new Date,level:t,logger:this,message:r,extra:n};this.filter<t||this.insert(i)}insert(t){if(!(this.filter<t.level)){for(let r of this.sinks)r.filter>=t.level&&r.handle(t);this.parent!==void 0&&this.parent.insert(t)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},p=new c(3,void 0,[new m]),Je=c.prototype.log.bind(p,1),We=c.prototype.log.bind(p,2),He=c.prototype.log.bind(p,3),ze=c.prototype.log.bind(p,4),Ze=c.prototype.log.bind(p);export{q as APM_DEFAULTS,B as Backend,H as CONNECTION_STATS_INITIAL,A as CallbackSink,m as ConsoleSink,O as Formatter,p as GLOBAL_LOGGER,P as InteractiveConsoleSink,z as JITTER_STATS_INITIAL,d as LogLevel,V as LogSymbols,c as Logger,W as MinDBFS,R as Selector,k as Strand,Z as VAD_DEFAULTS,h as VideoCodec,he as abortableSleep,g as assert,ze as debug,Je as error,we as extendUrl,L as fail,u as failure,ce as find,ee as fromBase64,te as fromBase64Url,ie as fromBytes,Ae as generateUUID,He as info,de as isAudioCapable,E as isBlinkBrowser,ge as isElectronBrowser,Me as isFailure,fe as isFirefoxBrowser,De as isFunction,Be as isNull,Ie as isNumber,Ee as isObject,Fe as isProperty,me as isSafariBrowser,pe as isSharedArrayBufferCapable,Ue as isString,je as isSuccess,Ne as isUndefined,Ze as log,Re as nextTick,Se as normalizeUrl,Le as sleep,o as success,oe as toBytes,ye as toRaw,Ge as tryParseLogLevel,X as unwrap,x as unwrapOr,Ve as validateUUID,We as warn};
package/mod.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Commonly used type definitions and utility functions across ODIN web projects.
3
+ *
4
+ * @module
5
+ */
1
6
  export * from './plugin/api.ts';
2
7
  export * from './utility/base64.ts';
3
8
  export * from './utility/bytearray.ts';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@4players/odin-common",
3
- "version": "9.3.0",
4
- "description": "A collection of commonly used type definitions and utility functions across ODIN web projects",
3
+ "version": "9.4.0",
4
+ "description": "Commonly used type definitions and utility functions across ODIN web projects",
5
5
  "author": "Josho Bleicker <josho.bleicker@4players.io> (https://www.4players.io)",
6
6
  "homepage": "https://www.4players.io",
7
7
  "keywords": [
@@ -24,6 +24,12 @@
24
24
  "require": "./cjs/mod.js",
25
25
  "default": "./esm/mod.js"
26
26
  },
27
+ "./api": {
28
+ "types": "./api/mod.d.ts",
29
+ "import": "./esm/api/mod.js",
30
+ "require": "./cjs/api/mod.js",
31
+ "default": "./esm/api/mod.js"
32
+ },
27
33
  "./zod": {
28
34
  "types": "./zod/mod.d.ts",
29
35
  "import": "./esm/zod/mod.js",
@@ -36,6 +42,9 @@
36
42
  "*": [
37
43
  "./mod.d.ts"
38
44
  ],
45
+ "api": [
46
+ "./api/mod.d.ts"
47
+ ],
39
48
  "zod": [
40
49
  "./zod/mod.d.ts"
41
50
  ]
package/utility/log.d.ts CHANGED
@@ -15,17 +15,7 @@ export interface LogSink {
15
15
  }
16
16
  export type ConsoleObject = Pick<typeof console, 'error' | 'warn' | 'info' | 'debug'>;
17
17
  export type LogFormatter = (record: LogRecord) => string;
18
- declare function sparseFormat({ message }: LogRecord): string;
19
- declare function jsonFormat(record: LogRecord): string;
20
- declare function prettyFormat(record: LogRecord): string;
21
- declare function structuredFormat(record: LogRecord): string;
22
- export declare const Formatter: {
23
- sparse: typeof sparseFormat;
24
- json: typeof jsonFormat;
25
- pretty: typeof prettyFormat;
26
- structured: typeof structuredFormat;
27
- default: typeof jsonFormat;
28
- };
18
+ export declare const Formatter: Record<string, LogFormatter>;
29
19
  export declare class ConsoleSink implements LogSink {
30
20
  protected formatter: LogFormatter;
31
21
  protected consoleObject: ConsoleObject;
@@ -36,7 +26,27 @@ export declare class ConsoleSink implements LogSink {
36
26
  export declare class InteractiveConsoleSink extends ConsoleSink {
37
27
  handle(record: LogRecord): void;
38
28
  }
39
- export declare class Logger {
29
+ export type OnLogMessage = (formattedString: string, record: LogRecord) => void;
30
+ export declare class CallbackSink implements LogSink {
31
+ protected formatter: LogFormatter;
32
+ protected cb: OnLogMessage;
33
+ filter: LogLevel;
34
+ constructor(cb: OnLogMessage, formatter?: LogFormatter, filter?: LogLevel);
35
+ handle(record: LogRecord): void;
36
+ }
37
+ export interface LoggerLike {
38
+ readonly name: string | undefined;
39
+ sinks: LogSink[];
40
+ filter: LogLevel;
41
+ parent: LoggerLike | undefined;
42
+ log(level: LogLevel, message: string, extra?: Record<string, unknown> | undefined): void;
43
+ insert(record: LogRecord): void;
44
+ readonly error: (message: string, extra?: Record<string, unknown>) => void;
45
+ readonly warn: (message: string, extra?: Record<string, unknown>) => void;
46
+ readonly info: (message: string, extra?: Record<string, unknown>) => void;
47
+ readonly debug: (message: string, extra?: Record<string, unknown>) => void;
48
+ }
49
+ export declare class Logger implements LoggerLike {
40
50
  #private;
41
51
  sinks: LogSink[];
42
52
  filter: LogLevel;
@@ -45,22 +55,23 @@ export declare class Logger {
45
55
  constructor(filter: LogLevel, name?: string | undefined, sinks?: LogSink[], parent?: Logger | undefined);
46
56
  log(level: LogLevel, message: string, extra?: Record<string, unknown> | undefined): void;
47
57
  insert(record: LogRecord): void;
48
- readonly error: (message: string, extra?: Record<string, unknown> | undefined) => void;
49
- readonly warn: (message: string, extra?: Record<string, unknown> | undefined) => void;
50
- readonly info: (message: string, extra?: Record<string, unknown> | undefined) => void;
51
- readonly debug: (message: string, extra?: Record<string, unknown> | undefined) => void;
58
+ readonly error: (message: string, extra?: Record<string, unknown>) => void;
59
+ readonly warn: (message: string, extra?: Record<string, unknown>) => void;
60
+ readonly info: (message: string, extra?: Record<string, unknown>) => void;
61
+ readonly debug: (message: string, extra?: Record<string, unknown>) => void;
52
62
  }
53
63
  export declare const GLOBAL_LOGGER: Logger;
54
- export declare const error: (message: string, extra?: Record<string, unknown> | undefined) => void;
55
- export declare const warn: (message: string, extra?: Record<string, unknown> | undefined) => void;
56
- export declare const info: (message: string, extra?: Record<string, unknown> | undefined) => void;
57
- export declare const debug: (message: string, extra?: Record<string, unknown> | undefined) => void;
58
- export declare const log: (level: LogLevel, message: string, extra?: Record<string, unknown> | undefined) => void;
64
+ export type LogFn = (message: string, extra?: Record<string, unknown> | undefined) => void;
65
+ export type LogWithLevelFn = (level: LogLevel, message: string, extra?: Record<string, unknown> | undefined) => void;
66
+ export declare const error: LogFn;
67
+ export declare const warn: LogFn;
68
+ export declare const info: LogFn;
69
+ export declare const debug: LogFn;
70
+ export declare const log: LogWithLevelFn;
59
71
  export interface LogRecord {
60
72
  readonly date: Date;
61
73
  readonly level: LogLevel;
62
- readonly logger: Logger;
74
+ readonly logger: LoggerLike;
63
75
  readonly message: string;
64
76
  readonly extra: Record<string, unknown> | undefined;
65
77
  }
66
- export {};
package/zod/mod.d.ts CHANGED
@@ -1 +1,6 @@
1
+ /**
2
+ * Re-exports the Zod validation library for use alongside ODIN schemas.
3
+ *
4
+ * @module
5
+ */
1
6
  export * as zod from 'zod';