werift 0.18.8 → 0.18.10

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.
@@ -84,22 +84,27 @@ class StunProtocol {
84
84
  this.closed.complete();
85
85
  }
86
86
  datagramReceived(data, addr) {
87
- if (!this.localCandidate)
88
- throw new Error("not exist");
89
- const message = (0, message_1.parseMessage)(data);
90
- if (!message) {
91
- this.receiver.dataReceived(data, this.localCandidate.component);
92
- return;
93
- }
94
- // log("parseMessage", addr, message);
95
- if ((message.messageClass === const_1.classes.RESPONSE ||
96
- message.messageClass === const_1.classes.ERROR) &&
97
- this.transactionsKeys.includes(message.transactionIdHex)) {
98
- const transaction = this.transactions[message.transactionIdHex];
99
- transaction.responseReceived(message, addr);
87
+ try {
88
+ if (!this.localCandidate)
89
+ throw new Error("not exist");
90
+ const message = (0, message_1.parseMessage)(data);
91
+ if (!message) {
92
+ this.receiver.dataReceived(data, this.localCandidate.component);
93
+ return;
94
+ }
95
+ // log("parseMessage", addr, message);
96
+ if ((message.messageClass === const_1.classes.RESPONSE ||
97
+ message.messageClass === const_1.classes.ERROR) &&
98
+ this.transactionsKeys.includes(message.transactionIdHex)) {
99
+ const transaction = this.transactions[message.transactionIdHex];
100
+ transaction.responseReceived(message, addr);
101
+ }
102
+ else if (message.messageClass === const_1.classes.REQUEST) {
103
+ this.receiver.requestReceived(message, addr, this, data);
104
+ }
100
105
  }
101
- else if (message.messageClass === const_1.classes.REQUEST) {
102
- this.receiver.requestReceived(message, addr, this, data);
106
+ catch (error) {
107
+ log("datagramReceived error", error);
103
108
  }
104
109
  }
105
110
  getExtraInfo() {
@@ -130,6 +135,9 @@ class StunProtocol {
130
135
  try {
131
136
  return await transaction.run();
132
137
  }
138
+ catch (e) {
139
+ throw e;
140
+ }
133
141
  finally {
134
142
  delete this.transactions[request.transactionIdHex];
135
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/stun/protocol.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,qCAAgC;AAKhC,4CAA4C;AAE5C,mCAAkC;AAClC,uCAAkD;AAClD,+CAA4C;AAE5C,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,mCAAmC,CAAC,CAAC;AAEvD,MAAa,YAAY;IAIvB,IAAI,gBAAgB;QAClB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAOD,YAAmB,QAAoB;;;;;mBAApB;;QAZnB;;;;mBAAgB,MAAM;WAAC;QACvB;;;;;WAAyB;QACzB;;;;mBAA+C,EAAE;WAAC;QAIlD;;;;;WAA2B;QAC3B;;;;;WAAsB;QACtB;;;;;WAAsB;QAEtB;;;;mBAA0B,IAAI,eAAK,EAAE;WAAC;QAStC;;;;mBAAiB,KAAK,EACpB,OAAgB,EAChB,SAA4B,EAC5B,kBAAuC,EACvC,EAAE;gBACF,IAAI,OAAO,EAAE;oBACX,IAAI,CAAC,SAAS,GAAG,MAAM,wBAAY,CAAC,IAAI,CACtC,MAAM,EACN,SAAS,EACT,kBAAkB,CACnB,CAAC;iBACH;qBAAM;oBACL,IAAI,CAAC,SAAS,GAAG,MAAM,wBAAY,CAAC,IAAI,CACtC,MAAM,EACN,SAAS,EACT,kBAAkB,CACnB,CAAC;iBACH;gBAED,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5E,CAAC;WAAC;IA3BwC,CAAC;IAE3C,cAAc;QACZ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAwBO,gBAAgB,CAAC,IAAY,EAAE,IAAa;QAClD,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAChE,OAAO;SACR;QACD,sCAAsC;QACtC,IACE,CAAC,OAAO,CAAC,YAAY,KAAK,eAAO,CAAC,QAAQ;YACxC,OAAO,CAAC,YAAY,KAAK,eAAO,CAAC,KAAK,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,EACxD;YACA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAChE,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SAC7C;aAAM,IAAI,OAAO,CAAC,YAAY,KAAK,eAAO,CAAC,OAAO,EAAE;YACnD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SAC1D;IACH,CAAC;IAED,YAAY;QACV,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAgB,EAAE,IAAa;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/C,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAa;QACxC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAgB,EAChB,IAAa,EACb,YAAqB,EACrB,eAAwB;QAExB,MAAM;QACN,sDAAsD;QACtD,MAAM;QACN,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAExC,IAAI,YAAY,EAAE;YAChB,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAC1C,OAAO,CAAC,cAAc,EAAE,CAAC;SAC1B;QAED,MAAM,WAAW,GAAgB,IAAI,yBAAW,CAC9C,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,eAAe,CAChB,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC;QAE1D,IAAI;YACF,OAAO,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC;SAChC;gBAAS;YACR,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;SACpD;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACvD,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF;AArHD,oCAqHC","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { InterfaceAddresses } from \"../../../common/src/network\";\nimport { Candidate } from \"../candidate\";\nimport { Connection } from \"../ice\";\nimport { UdpTransport } from \"../transport\";\nimport { Address, Protocol } from \"../types/model\";\nimport { classes } from \"./const\";\nimport { Message, parseMessage } from \"./message\";\nimport { Transaction } from \"./transaction\";\n\nconst log = debug(\"packages/ice/src/stun/protocol.ts\");\n\nexport class StunProtocol implements Protocol {\n readonly type = \"stun\";\n transport!: UdpTransport;\n transactions: { [key: string]: Transaction } = {};\n get transactionsKeys() {\n return Object.keys(this.transactions);\n }\n localCandidate?: Candidate;\n sentMessage?: Message;\n localAddress?: string;\n\n private readonly closed = new Event();\n\n constructor(public receiver: Connection) {}\n\n connectionLost() {\n this.closed.execute();\n this.closed.complete();\n }\n\n connectionMade = async (\n useIpv4: boolean,\n portRange?: [number, number],\n interfaceAddresses?: InterfaceAddresses\n ) => {\n if (useIpv4) {\n this.transport = await UdpTransport.init(\n \"udp4\",\n portRange,\n interfaceAddresses\n );\n } else {\n this.transport = await UdpTransport.init(\n \"udp6\",\n portRange,\n interfaceAddresses\n );\n }\n\n this.transport.onData = (data, addr) => this.datagramReceived(data, addr);\n };\n\n private datagramReceived(data: Buffer, addr: Address) {\n if (!this.localCandidate) throw new Error(\"not exist\");\n\n const message = parseMessage(data);\n if (!message) {\n this.receiver.dataReceived(data, this.localCandidate.component);\n return;\n }\n // log(\"parseMessage\", addr, message);\n if (\n (message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR) &&\n this.transactionsKeys.includes(message.transactionIdHex)\n ) {\n const transaction = this.transactions[message.transactionIdHex];\n transaction.responseReceived(message, addr);\n } else if (message.messageClass === classes.REQUEST) {\n this.receiver.requestReceived(message, addr, this, data);\n }\n }\n\n getExtraInfo(): Address {\n const { address: host, port } = this.transport.address();\n return [host, port];\n }\n\n async sendStun(message: Message, addr: Address) {\n const data = message.bytes;\n await this.transport.send(data, addr).catch(() => {\n log(\"sendStun failed\", addr, message);\n });\n }\n\n async sendData(data: Buffer, addr: Address) {\n await this.transport.send(data, addr);\n }\n\n async request(\n request: Message,\n addr: Address,\n integrityKey?: Buffer,\n retransmissions?: number\n ) {\n // \"\"\"\n // Execute a STUN transaction and return the response.\n // \"\"\"\n if (this.transactionsKeys.includes(request.transactionIdHex))\n throw new Error(\"already request ed\");\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction: Transaction = new Transaction(\n request,\n addr,\n this,\n retransmissions\n );\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async close() {\n Object.values(this.transactions).forEach((transaction) => {\n transaction.cancel();\n });\n await this.transport.close();\n }\n}\n"]}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/stun/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { InterfaceAddresses } from \"../../../common/src/network\";\nimport { Candidate } from \"../candidate\";\nimport { Connection } from \"../ice\";\nimport { UdpTransport } from \"../transport\";\nimport { Address, Protocol } from \"../types/model\";\nimport { classes } from \"./const\";\nimport { Message, parseMessage } from \"./message\";\nimport { Transaction } from \"./transaction\";\n\nconst log = debug(\"packages/ice/src/stun/protocol.ts\");\n\nexport class StunProtocol implements Protocol {\n readonly type = \"stun\";\n transport!: UdpTransport;\n transactions: { [key: string]: Transaction } = {};\n get transactionsKeys() {\n return Object.keys(this.transactions);\n }\n localCandidate?: Candidate;\n sentMessage?: Message;\n localAddress?: string;\n\n private readonly closed = new Event();\n\n constructor(public receiver: Connection) {}\n\n connectionLost() {\n this.closed.execute();\n this.closed.complete();\n }\n\n connectionMade = async (\n useIpv4: boolean,\n portRange?: [number, number],\n interfaceAddresses?: InterfaceAddresses\n ) => {\n if (useIpv4) {\n this.transport = await UdpTransport.init(\n \"udp4\",\n portRange,\n interfaceAddresses\n );\n } else {\n this.transport = await UdpTransport.init(\n \"udp6\",\n portRange,\n interfaceAddresses\n );\n }\n\n this.transport.onData = (data, addr) => this.datagramReceived(data, addr);\n };\n\n private datagramReceived(data: Buffer, addr: Address) {\n try {\n if (!this.localCandidate) throw new Error(\"not exist\");\n\n const message = parseMessage(data);\n if (!message) {\n this.receiver.dataReceived(data, this.localCandidate.component);\n return;\n }\n // log(\"parseMessage\", addr, message);\n if (\n (message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR) &&\n this.transactionsKeys.includes(message.transactionIdHex)\n ) {\n const transaction = this.transactions[message.transactionIdHex];\n transaction.responseReceived(message, addr);\n } else if (message.messageClass === classes.REQUEST) {\n this.receiver.requestReceived(message, addr, this, data);\n }\n } catch (error) {\n log(\"datagramReceived error\", error);\n }\n }\n\n getExtraInfo(): Address {\n const { address: host, port } = this.transport.address();\n return [host, port];\n }\n\n async sendStun(message: Message, addr: Address) {\n const data = message.bytes;\n await this.transport.send(data, addr).catch(() => {\n log(\"sendStun failed\", addr, message);\n });\n }\n\n async sendData(data: Buffer, addr: Address) {\n await this.transport.send(data, addr);\n }\n\n async request(\n request: Message,\n addr: Address,\n integrityKey?: Buffer,\n retransmissions?: number\n ) {\n // \"\"\"\n // Execute a STUN transaction and return the response.\n // \"\"\"\n if (this.transactionsKeys.includes(request.transactionIdHex))\n throw new Error(\"already request ed\");\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction: Transaction = new Transaction(\n request,\n addr,\n this,\n retransmissions\n );\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async close() {\n Object.values(this.transactions).forEach((transaction) => {\n transaction.cancel();\n });\n await this.transport.close();\n }\n}\n"]}
@@ -90,6 +90,10 @@ class Transaction {
90
90
  this.retry();
91
91
  return await this.onResponse.asPromise();
92
92
  }
93
+ catch (error) {
94
+ log("transaction run failed", error, this.protocol.type, this.request.toJSON());
95
+ throw error;
96
+ }
93
97
  finally {
94
98
  if (this.timeoutHandle) {
95
99
  clearTimeout(this.timeoutHandle);
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,qCAAgC;AAEhC,8CAAsE;AAEtE,mCAAwD;AAGxD,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,iDAAiD,CAAC,CAAC;AAErE,MAAa,WAAW;IAOtB,YACU,OAAgB,EAChB,IAAa,EACb,QAAkB,EAClB,eAAwB;;;;;mBAHxB;;;;;;mBACA;;;;;;mBACA;;;;;;mBACA;;QAVV;;;;mBAAuB,iBAAS;WAAC;QACjC;;;;;WAA4B;QAC5B;;;;mBAAgB,CAAC;WAAC;QAClB;;;;;WAAkC;QAClC;;;;mBAA8B,IAAI,eAAK,EAAsB;WAAC;QAY9D;;;;mBAAmB,CAAC,OAAgB,EAAE,IAAa,EAAE,EAAE;gBACrD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC9B,IAAI,OAAO,CAAC,YAAY,KAAK,eAAO,CAAC,QAAQ,EAAE;wBAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;qBAC5B;yBAAM;wBACL,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,8BAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;qBAC7D;iBACF;YACH,CAAC;WAAC;QAEF;;;;mBAAM,KAAK,IAAI,EAAE;gBACf,IAAI;oBACF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;iBAC1C;wBAAS;oBACR,IAAI,IAAI,CAAC,aAAa,EAAE;wBACtB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;qBAClC;iBACF;YACH,CAAC;WAAC;QAEF;;;;mBAAgB,GAAG,EAAE;gBACnB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAC/B,GAAG,CAAC,sBAAsB,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAClE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,+BAAkB,EAAE,CAAC,CAAC;oBAChD,OAAO;iBACR;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/D,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;gBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;WAAC;QApCA,IAAI,CAAC,QAAQ;YACX,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAS,CAAC,CAAC;IAClE,CAAC;IAoCD,MAAM;QACJ,IAAI,IAAI,CAAC,aAAa;YAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;CACF;AAtDD,kCAsDC","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { TransactionFailed, TransactionTimeout } from \"../exceptions\";\nimport { Address, Protocol } from \"../types/model\";\nimport { classes, RETRY_MAX, RETRY_RTO } from \"./const\";\nimport { Message } from \"./message\";\n\nconst log = debug(\"werift-ice:packages/ice/src/stun/transaction.ts\");\n\nexport class Transaction {\n private timeoutDelay = RETRY_RTO;\n private timeoutHandle?: any;\n private tries = 0;\n private readonly triesMax: number;\n private readonly onResponse = new Event<[Message, Address]>();\n\n constructor(\n private request: Message,\n private addr: Address,\n private protocol: Protocol,\n private retransmissions?: number\n ) {\n this.triesMax =\n 1 + (this.retransmissions ? this.retransmissions : RETRY_MAX);\n }\n\n responseReceived = (message: Message, addr: Address) => {\n if (this.onResponse.length > 0) {\n if (message.messageClass === classes.RESPONSE) {\n this.onResponse.execute(message, addr);\n this.onResponse.complete();\n } else {\n this.onResponse.error(new TransactionFailed(message, addr));\n }\n }\n };\n\n run = async () => {\n try {\n this.retry();\n return await this.onResponse.asPromise();\n } finally {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n }\n }\n };\n\n private retry = () => {\n if (this.tries >= this.triesMax) {\n log(`retry failed times:${this.tries} maxLimit:${this.triesMax}`);\n this.onResponse.error(new TransactionTimeout());\n return;\n }\n this.protocol.sendStun(this.request, this.addr);\n this.timeoutHandle = setTimeout(this.retry, this.timeoutDelay);\n this.timeoutDelay *= 2;\n this.tries++;\n };\n\n cancel() {\n if (this.timeoutHandle) clearTimeout(this.timeoutHandle);\n }\n}\n"]}
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,qCAAgC;AAEhC,8CAAsE;AAEtE,mCAAwD;AAGxD,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,iDAAiD,CAAC,CAAC;AAErE,MAAa,WAAW;IAOtB,YACU,OAAgB,EAChB,IAAa,EACb,QAAkB,EAClB,eAAwB;;;;;mBAHxB;;;;;;mBACA;;;;;;mBACA;;;;;;mBACA;;QAVV;;;;mBAAuB,iBAAS;WAAC;QACjC;;;;;WAA4B;QAC5B;;;;mBAAgB,CAAC;WAAC;QAClB;;;;;WAAkC;QAClC;;;;mBAA8B,IAAI,eAAK,EAAsB;WAAC;QAY9D;;;;mBAAmB,CAAC,OAAgB,EAAE,IAAa,EAAE,EAAE;gBACrD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC9B,IAAI,OAAO,CAAC,YAAY,KAAK,eAAO,CAAC,QAAQ,EAAE;wBAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;qBAC5B;yBAAM;wBACL,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,8BAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;qBAC7D;iBACF;YACH,CAAC;WAAC;QAEF;;;;mBAAM,KAAK,IAAI,EAAE;gBACf,IAAI;oBACF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;iBAC1C;gBAAC,OAAO,KAAK,EAAE;oBACd,GAAG,CACD,wBAAwB,EACxB,KAAK,EACL,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CACtB,CAAC;oBAEF,MAAM,KAAK,CAAC;iBACb;wBAAS;oBACR,IAAI,IAAI,CAAC,aAAa,EAAE;wBACtB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;qBAClC;iBACF;YACH,CAAC;WAAC;QAEF;;;;mBAAgB,GAAG,EAAE;gBACnB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAC/B,GAAG,CAAC,sBAAsB,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAClE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,+BAAkB,EAAE,CAAC,CAAC;oBAChD,OAAO;iBACR;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/D,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;gBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;WAAC;QA7CA,IAAI,CAAC,QAAQ;YACX,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAS,CAAC,CAAC;IAClE,CAAC;IA6CD,MAAM;QACJ,IAAI,IAAI,CAAC,aAAa;YAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;CACF;AA/DD,kCA+DC","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { TransactionFailed, TransactionTimeout } from \"../exceptions\";\nimport { Address, Protocol } from \"../types/model\";\nimport { classes, RETRY_MAX, RETRY_RTO } from \"./const\";\nimport { Message } from \"./message\";\n\nconst log = debug(\"werift-ice:packages/ice/src/stun/transaction.ts\");\n\nexport class Transaction {\n private timeoutDelay = RETRY_RTO;\n private timeoutHandle?: any;\n private tries = 0;\n private readonly triesMax: number;\n private readonly onResponse = new Event<[Message, Address]>();\n\n constructor(\n private request: Message,\n private addr: Address,\n private protocol: Protocol,\n private retransmissions?: number\n ) {\n this.triesMax =\n 1 + (this.retransmissions ? this.retransmissions : RETRY_MAX);\n }\n\n responseReceived = (message: Message, addr: Address) => {\n if (this.onResponse.length > 0) {\n if (message.messageClass === classes.RESPONSE) {\n this.onResponse.execute(message, addr);\n this.onResponse.complete();\n } else {\n this.onResponse.error(new TransactionFailed(message, addr));\n }\n }\n };\n\n run = async () => {\n try {\n this.retry();\n return await this.onResponse.asPromise();\n } catch (error) {\n log(\n \"transaction run failed\",\n error,\n this.protocol.type,\n this.request.toJSON()\n );\n\n throw error;\n } finally {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n }\n }\n };\n\n private retry = () => {\n if (this.tries >= this.triesMax) {\n log(`retry failed times:${this.tries} maxLimit:${this.triesMax}`);\n this.onResponse.error(new TransactionTimeout());\n return;\n }\n this.protocol.sendStun(this.request, this.addr);\n this.timeoutHandle = setTimeout(this.retry, this.timeoutDelay);\n this.timeoutDelay *= 2;\n this.tries++;\n };\n\n cancel() {\n if (this.timeoutHandle) clearTimeout(this.timeoutHandle);\n }\n}\n"]}
@@ -49,19 +49,24 @@ class TurnTransport {
49
49
  configurable: true,
50
50
  writable: true,
51
51
  value: (data, addr) => {
52
- const message = (0, message_1.parseMessage)(data);
53
- if (!message) {
54
- this.receiver?.dataReceived(data, this.localCandidate.component);
55
- return;
52
+ try {
53
+ const message = (0, message_1.parseMessage)(data);
54
+ if (!message) {
55
+ this.receiver?.dataReceived(data, this.localCandidate.component);
56
+ return;
57
+ }
58
+ if ((message?.messageClass === const_1.classes.RESPONSE ||
59
+ message?.messageClass === const_1.classes.ERROR) &&
60
+ this.turn.transactions[message.transactionIdHex]) {
61
+ const transaction = this.turn.transactions[message.transactionIdHex];
62
+ transaction.responseReceived(message, addr);
63
+ }
64
+ else if (message?.messageClass === const_1.classes.REQUEST) {
65
+ this.receiver?.requestReceived(message, addr, this, data);
66
+ }
56
67
  }
57
- if ((message?.messageClass === const_1.classes.RESPONSE ||
58
- message?.messageClass === const_1.classes.ERROR) &&
59
- this.turn.transactions[message.transactionIdHex]) {
60
- const transaction = this.turn.transactions[message.transactionIdHex];
61
- transaction.responseReceived(message, addr);
62
- }
63
- else if (message?.messageClass === const_1.classes.REQUEST) {
64
- this.receiver?.requestReceived(message, addr, this, data);
68
+ catch (error) {
69
+ log("datagramReceived error", error);
65
70
  }
66
71
  }
67
72
  });
@@ -79,6 +84,9 @@ class TurnTransport {
79
84
  try {
80
85
  return await transaction.run();
81
86
  }
87
+ catch (e) {
88
+ throw e;
89
+ }
82
90
  finally {
83
91
  delete this.turn.transactions[request.transactionIdHex];
84
92
  }
@@ -211,7 +219,7 @@ class TurnClient {
211
219
  enumerable: true,
212
220
  configurable: true,
213
221
  writable: true,
214
- value: () => new p_cancelable_1.default(async (r, f, onCancel) => {
222
+ value: () => new p_cancelable_1.default(async (_, f, onCancel) => {
215
223
  let run = true;
216
224
  onCancel(() => {
217
225
  run = false;
@@ -322,6 +330,9 @@ class TurnClient {
322
330
  try {
323
331
  return await transaction.run();
324
332
  }
333
+ catch (e) {
334
+ throw e;
335
+ }
325
336
  finally {
326
337
  delete this.transactions[request.transactionIdHex];
327
338
  }
@@ -351,7 +362,7 @@ class TurnClient {
351
362
  .setAttribute("XOR-PEER-ADDRESS", addr);
352
363
  const [response] = await this.request(request, this.server);
353
364
  if (response.messageMethod !== const_1.methods.CHANNEL_BIND) {
354
- throw new Error();
365
+ throw new Error("should be CHANNEL_BIND");
355
366
  }
356
367
  }
357
368
  sendStun(message, addr) {
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/turn/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport PCancelable from \"p-cancelable\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\n\nimport { InterfaceAddresses } from \"../../../common/src/network\";\nimport { Candidate } from \"../candidate\";\nimport { TransactionFailed } from \"../exceptions\";\nimport { Future, future } from \"../helper\";\nimport { Connection } from \"../ice\";\nimport { classes, methods } from \"../stun/const\";\nimport { Message, parseMessage } from \"../stun/message\";\nimport { Transaction } from \"../stun/transaction\";\nimport { Transport, UdpTransport } from \"../transport\";\nimport { Address, Protocol } from \"../types/model\";\n\nconst log = debug(\"werift-ice:packages/ice/src/turn/protocol.ts\");\n\nconst TCP_TRANSPORT = 0x06000000;\nconst UDP_TRANSPORT = 0x11000000;\n\nclass TurnTransport implements Protocol {\n readonly type = \"turn\";\n localCandidate!: Candidate;\n receiver?: Connection;\n\n constructor(public turn: TurnClient) {\n turn.onDatagramReceived = this.datagramReceived;\n }\n\n private datagramReceived = (data: Buffer, addr: Address) => {\n const message = parseMessage(data);\n if (!message) {\n this.receiver?.dataReceived(data, this.localCandidate.component);\n return;\n }\n\n if (\n (message?.messageClass === classes.RESPONSE ||\n message?.messageClass === classes.ERROR) &&\n this.turn.transactions[message.transactionIdHex]\n ) {\n const transaction = this.turn.transactions[message.transactionIdHex];\n transaction.responseReceived(message, addr);\n } else if (message?.messageClass === classes.REQUEST) {\n this.receiver?.requestReceived(message, addr, this, data);\n }\n };\n\n async request(request: Message, addr: Address, integrityKey?: Buffer) {\n if (this.turn.transactions[request.transactionIdHex])\n throw new Error(\"exist\");\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.turn.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } finally {\n delete this.turn.transactions[request.transactionIdHex];\n }\n }\n async connectionMade() {}\n async sendData(data: Buffer, addr: Address) {\n await this.turn.sendData(data, addr);\n }\n async sendStun(message: Message, addr: Address) {\n await this.turn.sendData(message.bytes, addr);\n }\n}\n\nclass TurnClient implements Protocol {\n type = \"inner_turn\";\n readonly onData = new Event<[Buffer, Address]>();\n transactions: { [hexId: string]: Transaction } = {};\n integrityKey?: Buffer;\n nonce?: Buffer;\n realm?: string;\n relayedAddress!: Address;\n mappedAddress!: Address;\n refreshHandle?: Future;\n channelNumber = 0x4000;\n channel?: { number: number; address: Address };\n localCandidate!: Candidate;\n\n onDatagramReceived: (data: Buffer, addr: Address) => void = () => {};\n\n private channelBinding?: Promise<void>;\n\n constructor(\n public server: Address,\n public username: string,\n public password: string,\n public lifetime: number,\n public transport: Transport\n ) {}\n\n async connectionMade() {\n this.transport.onData = (data, addr) => {\n this.datagramReceived(data, addr);\n };\n }\n\n private handleChannelData(data: Buffer) {\n const [, length] = jspack.Unpack(\"!HH\", data.slice(0, 4));\n\n if (this.channel?.address) {\n const payload = data.slice(4, 4 + length);\n this.onDatagramReceived(payload, this.channel.address);\n }\n }\n\n private handleSTUNMessage(data: Buffer, addr: Address) {\n try {\n const message = parseMessage(data);\n if (!message) throw new Error(\"not stun message\");\n if (\n message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR\n ) {\n const transaction = this.transactions[message.transactionIdHex];\n if (transaction) transaction.responseReceived(message, addr);\n } else if (message.messageClass === classes.REQUEST) {\n this.onDatagramReceived(data, addr);\n }\n\n if (message.getAttributeValue(\"DATA\")) {\n const buf: Buffer = message.getAttributeValue(\"DATA\");\n this.onDatagramReceived(buf, addr);\n }\n } catch (error) {\n log(\"parse error\", data.toString());\n }\n }\n\n private datagramReceived(data: Buffer, addr: Address) {\n if (data.length >= 4 && isChannelData(data)) {\n this.handleChannelData(data);\n } else {\n this.handleSTUNMessage(data, addr);\n }\n }\n\n async connect() {\n const withoutCred = new Message(methods.ALLOCATE, classes.REQUEST);\n withoutCred\n .setAttribute(\"LIFETIME\", this.lifetime)\n .setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const err: TransactionFailed = await this.request(\n withoutCred,\n this.server\n ).catch((e) => e);\n\n // resolve dns address\n this.server = err.addr;\n\n if (err.response.getAttributeValue(\"NONCE\")) {\n this.nonce = err.response.getAttributeValue(\"NONCE\");\n }\n if (err.response.getAttributeValue(\"REALM\")) {\n this.realm = err.response.getAttributeValue(\"REALM\");\n }\n this.integrityKey = makeIntegrityKey(\n this.username,\n this.realm!,\n this.password\n );\n\n const request = new Message(methods.ALLOCATE, classes.REQUEST);\n request.setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const [response] = await this.request(request, this.server);\n this.relayedAddress = response.getAttributeValue(\"XOR-RELAYED-ADDRESS\");\n this.mappedAddress = response.getAttributeValue(\"XOR-MAPPED-ADDRESS\");\n\n this.refreshHandle = future(this.refresh());\n }\n\n async createPermission(peerAddress: Address) {\n const request = new Message(methods.CREATE_PERMISSION, classes.REQUEST);\n request\n .setAttribute(\"XOR-PEER-ADDRESS\", peerAddress)\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce);\n const [response] = await this.request(request, this.server).catch((e) => {\n request;\n throw e;\n });\n return response;\n }\n\n refresh = () =>\n new PCancelable(async (r, f, onCancel) => {\n let run = true;\n onCancel(() => {\n run = false;\n f(\"cancel\");\n });\n\n while (run) {\n // refresh before expire\n await setTimeout((5 / 6) * this.lifetime * 1000);\n\n const request = new Message(methods.REFRESH, classes.REQUEST);\n request.setAttribute(\"LIFETIME\", this.lifetime);\n\n await this.request(request, this.server);\n }\n });\n\n async request(request: Message, addr: Address): Promise<[Message, Address]> {\n if (this.transactions[request.transactionIdHex]) {\n throw new Error(\"exist\");\n }\n if (this.integrityKey) {\n request\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce)\n .addMessageIntegrity(this.integrityKey)\n .addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async sendData(data: Buffer, addr: Address) {\n const channel = await this.getChannel(addr);\n\n const header = jspack.Pack(\"!HH\", [channel.number, data.length]);\n this.transport.send(\n Buffer.concat([Buffer.from(header), data]),\n this.server\n );\n }\n\n private async getChannel(addr: Address) {\n if (this.channelBinding) {\n await this.channelBinding;\n }\n if (!this.channel) {\n this.channel = { number: this.channelNumber++, address: addr };\n\n this.channelBinding = this.channelBind(this.channel.number, addr);\n await this.channelBinding;\n this.channelBinding = undefined;\n log(\"channelBind\", this.channel);\n }\n return this.channel;\n }\n\n private async channelBind(channelNumber: number, addr: Address) {\n const request = new Message(methods.CHANNEL_BIND, classes.REQUEST);\n request\n .setAttribute(\"CHANNEL-NUMBER\", channelNumber)\n .setAttribute(\"XOR-PEER-ADDRESS\", addr);\n const [response] = await this.request(request, this.server);\n if (response.messageMethod !== methods.CHANNEL_BIND) {\n throw new Error();\n }\n }\n\n sendStun(message: Message, addr: Address) {\n this.transport.send(message.bytes, addr);\n }\n}\n\nexport async function createTurnEndpoint(\n serverAddr: Address,\n username: string,\n password: string,\n {\n lifetime,\n portRange,\n interfaceAddresses,\n }: {\n lifetime?: number;\n ssl?: boolean;\n transport?: \"udp\";\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n }\n) {\n if (lifetime == undefined) {\n lifetime = 600;\n }\n\n const transport = await UdpTransport.init(\n \"udp4\",\n portRange,\n interfaceAddresses\n );\n\n const turnClient = new TurnClient(\n serverAddr,\n username,\n password,\n lifetime,\n transport\n );\n\n await turnClient.connectionMade();\n await turnClient.connect();\n const turnTransport = new TurnTransport(turnClient);\n\n return turnTransport;\n}\n\nexport function makeIntegrityKey(\n username: string,\n realm: string,\n password: string\n) {\n return createHash(\"md5\")\n .update(Buffer.from([username, realm, password].join(\":\")))\n .digest();\n}\n\nfunction isChannelData(data: Buffer) {\n return (data[0] & 0xc0) == 0x40;\n}\n"]}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/turn/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport PCancelable from \"p-cancelable\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\n\nimport { InterfaceAddresses } from \"../../../common/src/network\";\nimport { Candidate } from \"../candidate\";\nimport { TransactionFailed } from \"../exceptions\";\nimport { Future, future } from \"../helper\";\nimport { Connection } from \"../ice\";\nimport { classes, methods } from \"../stun/const\";\nimport { Message, parseMessage } from \"../stun/message\";\nimport { Transaction } from \"../stun/transaction\";\nimport { Transport, UdpTransport } from \"../transport\";\nimport { Address, Protocol } from \"../types/model\";\n\nconst log = debug(\"werift-ice:packages/ice/src/turn/protocol.ts\");\n\nconst TCP_TRANSPORT = 0x06000000;\nconst UDP_TRANSPORT = 0x11000000;\n\nclass TurnTransport implements Protocol {\n readonly type = \"turn\";\n localCandidate!: Candidate;\n receiver?: Connection;\n\n constructor(public turn: TurnClient) {\n turn.onDatagramReceived = this.datagramReceived;\n }\n\n private datagramReceived = (data: Buffer, addr: Address) => {\n try {\n const message = parseMessage(data);\n if (!message) {\n this.receiver?.dataReceived(data, this.localCandidate.component);\n return;\n }\n\n if (\n (message?.messageClass === classes.RESPONSE ||\n message?.messageClass === classes.ERROR) &&\n this.turn.transactions[message.transactionIdHex]\n ) {\n const transaction = this.turn.transactions[message.transactionIdHex];\n transaction.responseReceived(message, addr);\n } else if (message?.messageClass === classes.REQUEST) {\n this.receiver?.requestReceived(message, addr, this, data);\n }\n } catch (error) {\n log(\"datagramReceived error\", error);\n }\n };\n\n async request(request: Message, addr: Address, integrityKey?: Buffer) {\n if (this.turn.transactions[request.transactionIdHex])\n throw new Error(\"exist\");\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.turn.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.turn.transactions[request.transactionIdHex];\n }\n }\n async connectionMade() {}\n async sendData(data: Buffer, addr: Address) {\n await this.turn.sendData(data, addr);\n }\n async sendStun(message: Message, addr: Address) {\n await this.turn.sendData(message.bytes, addr);\n }\n}\n\nclass TurnClient implements Protocol {\n type = \"inner_turn\";\n readonly onData = new Event<[Buffer, Address]>();\n transactions: { [hexId: string]: Transaction } = {};\n integrityKey?: Buffer;\n nonce?: Buffer;\n realm?: string;\n relayedAddress!: Address;\n mappedAddress!: Address;\n refreshHandle?: Future;\n channelNumber = 0x4000;\n channel?: { number: number; address: Address };\n localCandidate!: Candidate;\n\n onDatagramReceived: (data: Buffer, addr: Address) => void = () => {};\n\n private channelBinding?: Promise<void>;\n\n constructor(\n public server: Address,\n public username: string,\n public password: string,\n public lifetime: number,\n public transport: Transport\n ) {}\n\n async connectionMade() {\n this.transport.onData = (data, addr) => {\n this.datagramReceived(data, addr);\n };\n }\n\n private handleChannelData(data: Buffer) {\n const [, length] = jspack.Unpack(\"!HH\", data.slice(0, 4));\n\n if (this.channel?.address) {\n const payload = data.slice(4, 4 + length);\n this.onDatagramReceived(payload, this.channel.address);\n }\n }\n\n private handleSTUNMessage(data: Buffer, addr: Address) {\n try {\n const message = parseMessage(data);\n if (!message) throw new Error(\"not stun message\");\n if (\n message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR\n ) {\n const transaction = this.transactions[message.transactionIdHex];\n if (transaction) transaction.responseReceived(message, addr);\n } else if (message.messageClass === classes.REQUEST) {\n this.onDatagramReceived(data, addr);\n }\n\n if (message.getAttributeValue(\"DATA\")) {\n const buf: Buffer = message.getAttributeValue(\"DATA\");\n this.onDatagramReceived(buf, addr);\n }\n } catch (error) {\n log(\"parse error\", data.toString());\n }\n }\n\n private datagramReceived(data: Buffer, addr: Address) {\n if (data.length >= 4 && isChannelData(data)) {\n this.handleChannelData(data);\n } else {\n this.handleSTUNMessage(data, addr);\n }\n }\n\n async connect() {\n const withoutCred = new Message(methods.ALLOCATE, classes.REQUEST);\n withoutCred\n .setAttribute(\"LIFETIME\", this.lifetime)\n .setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const err: TransactionFailed = await this.request(\n withoutCred,\n this.server\n ).catch((e) => e);\n\n // resolve dns address\n this.server = err.addr;\n\n if (err.response.getAttributeValue(\"NONCE\")) {\n this.nonce = err.response.getAttributeValue(\"NONCE\");\n }\n if (err.response.getAttributeValue(\"REALM\")) {\n this.realm = err.response.getAttributeValue(\"REALM\");\n }\n this.integrityKey = makeIntegrityKey(\n this.username,\n this.realm!,\n this.password\n );\n\n const request = new Message(methods.ALLOCATE, classes.REQUEST);\n request.setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const [response] = await this.request(request, this.server);\n this.relayedAddress = response.getAttributeValue(\"XOR-RELAYED-ADDRESS\");\n this.mappedAddress = response.getAttributeValue(\"XOR-MAPPED-ADDRESS\");\n\n this.refreshHandle = future(this.refresh());\n }\n\n async createPermission(peerAddress: Address) {\n const request = new Message(methods.CREATE_PERMISSION, classes.REQUEST);\n request\n .setAttribute(\"XOR-PEER-ADDRESS\", peerAddress)\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce);\n const [response] = await this.request(request, this.server).catch((e) => {\n request;\n throw e;\n });\n return response;\n }\n\n refresh = () =>\n new PCancelable(async (_, f, onCancel) => {\n let run = true;\n onCancel(() => {\n run = false;\n f(\"cancel\");\n });\n\n while (run) {\n // refresh before expire\n await setTimeout((5 / 6) * this.lifetime * 1000);\n\n const request = new Message(methods.REFRESH, classes.REQUEST);\n request.setAttribute(\"LIFETIME\", this.lifetime);\n\n await this.request(request, this.server);\n }\n });\n\n async request(request: Message, addr: Address): Promise<[Message, Address]> {\n if (this.transactions[request.transactionIdHex]) {\n throw new Error(\"exist\");\n }\n if (this.integrityKey) {\n request\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce)\n .addMessageIntegrity(this.integrityKey)\n .addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async sendData(data: Buffer, addr: Address) {\n const channel = await this.getChannel(addr);\n\n const header = jspack.Pack(\"!HH\", [channel.number, data.length]);\n this.transport.send(\n Buffer.concat([Buffer.from(header), data]),\n this.server\n );\n }\n\n private async getChannel(addr: Address) {\n if (this.channelBinding) {\n await this.channelBinding;\n }\n if (!this.channel) {\n this.channel = { number: this.channelNumber++, address: addr };\n\n this.channelBinding = this.channelBind(this.channel.number, addr);\n await this.channelBinding;\n this.channelBinding = undefined;\n log(\"channelBind\", this.channel);\n }\n return this.channel;\n }\n\n private async channelBind(channelNumber: number, addr: Address) {\n const request = new Message(methods.CHANNEL_BIND, classes.REQUEST);\n request\n .setAttribute(\"CHANNEL-NUMBER\", channelNumber)\n .setAttribute(\"XOR-PEER-ADDRESS\", addr);\n const [response] = await this.request(request, this.server);\n if (response.messageMethod !== methods.CHANNEL_BIND) {\n throw new Error(\"should be CHANNEL_BIND\");\n }\n }\n\n sendStun(message: Message, addr: Address) {\n this.transport.send(message.bytes, addr);\n }\n}\n\nexport async function createTurnEndpoint(\n serverAddr: Address,\n username: string,\n password: string,\n {\n lifetime,\n portRange,\n interfaceAddresses,\n }: {\n lifetime?: number;\n ssl?: boolean;\n transport?: \"udp\";\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n }\n) {\n if (lifetime == undefined) {\n lifetime = 600;\n }\n\n const transport = await UdpTransport.init(\n \"udp4\",\n portRange,\n interfaceAddresses\n );\n\n const turnClient = new TurnClient(\n serverAddr,\n username,\n password,\n lifetime,\n transport\n );\n\n await turnClient.connectionMade();\n await turnClient.connect();\n const turnTransport = new TurnTransport(turnClient);\n\n return turnTransport;\n}\n\nexport function makeIntegrityKey(\n username: string,\n realm: string,\n password: string\n) {\n return createHash(\"md5\")\n .update(Buffer.from([username, realm, password].join(\":\")))\n .digest();\n}\n\nfunction isChannelData(data: Buffer) {\n return (data[0] & 0xc0) == 0x40;\n}\n"]}
@@ -23,3 +23,4 @@ export * from "./rtp/rtp";
23
23
  export * from "./rtp/rtx";
24
24
  export * from "./srtp/srtcp";
25
25
  export * from "./srtp/srtp";
26
+ export * from "./util";
@@ -39,4 +39,5 @@ __exportStar(require("./rtp/rtp"), exports);
39
39
  __exportStar(require("./rtp/rtx"), exports);
40
40
  __exportStar(require("./srtp/srtcp"), exports);
41
41
  __exportStar(require("./srtp/srtp"), exports);
42
+ __exportStar(require("./util"), exports);
42
43
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kBAAgB;AAChB,mDAAiC;AACjC,0CAAwB;AACxB,8CAA4B;AAC5B,2CAAyB;AACzB,8CAA4B;AAC5B,gDAA8B;AAC9B,8CAA4B;AAC5B,oEAAkD;AAClD,mDAAiC;AACjC,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B;AAC7B,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,4CAA0B;AAC1B,wDAAsC;AACtC,oDAAkC;AAClC,oDAAkC;AAClC,mDAAiC;AACjC,4CAA0B;AAC1B,4CAA0B;AAC1B,+CAA6B;AAC7B,8CAA4B","sourcesContent":["import \"buffer\";\nexport * from \"../../common/src\";\nexport * from \"./codec\";\nexport * from \"./container\";\nexport * from \"./helper\";\nexport * from \"./processor\";\nexport * from \"./rtcp/header\";\nexport * from \"./rtcp/psfb\";\nexport * from \"./rtcp/psfb/pictureLossIndication\";\nexport * from \"./rtcp/psfb/remb\";\nexport * from \"./rtcp/rr\";\nexport * from \"./rtcp/rtcp\";\nexport * from \"./rtcp/rtpfb\";\nexport * from \"./rtcp/rtpfb/nack\";\nexport * from \"./rtcp/rtpfb/twcc\";\nexport * from \"./rtcp/sdes\";\nexport * from \"./rtcp/sr\";\nexport * from \"./rtp/headerExtension\";\nexport * from \"./rtp/red/encoder\";\nexport * from \"./rtp/red/handler\";\nexport * from \"./rtp/red/packet\";\nexport * from \"./rtp/rtp\";\nexport * from \"./rtp/rtx\";\nexport * from \"./srtp/srtcp\";\nexport * from \"./srtp/srtp\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kBAAgB;AAChB,mDAAiC;AACjC,0CAAwB;AACxB,8CAA4B;AAC5B,2CAAyB;AACzB,8CAA4B;AAC5B,gDAA8B;AAC9B,8CAA4B;AAC5B,oEAAkD;AAClD,mDAAiC;AACjC,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B;AAC7B,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,4CAA0B;AAC1B,wDAAsC;AACtC,oDAAkC;AAClC,oDAAkC;AAClC,mDAAiC;AACjC,4CAA0B;AAC1B,4CAA0B;AAC1B,+CAA6B;AAC7B,8CAA4B;AAC5B,yCAAuB","sourcesContent":["import \"buffer\";\nexport * from \"../../common/src\";\nexport * from \"./codec\";\nexport * from \"./container\";\nexport * from \"./helper\";\nexport * from \"./processor\";\nexport * from \"./rtcp/header\";\nexport * from \"./rtcp/psfb\";\nexport * from \"./rtcp/psfb/pictureLossIndication\";\nexport * from \"./rtcp/psfb/remb\";\nexport * from \"./rtcp/rr\";\nexport * from \"./rtcp/rtcp\";\nexport * from \"./rtcp/rtpfb\";\nexport * from \"./rtcp/rtpfb/nack\";\nexport * from \"./rtcp/rtpfb/twcc\";\nexport * from \"./rtcp/sdes\";\nexport * from \"./rtcp/sr\";\nexport * from \"./rtp/headerExtension\";\nexport * from \"./rtp/red/encoder\";\nexport * from \"./rtp/red/handler\";\nexport * from \"./rtp/red/packet\";\nexport * from \"./rtp/rtp\";\nexport * from \"./rtp/rtx\";\nexport * from \"./srtp/srtcp\";\nexport * from \"./srtp/srtp\";\nexport * from \"./util\";\n"]}
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import { RtpPacket } from "./rtp/rtp";
3
+ export declare class RtpBuilder {
4
+ private props;
5
+ sequenceNumber: number;
6
+ timestamp: number;
7
+ constructor(props: {
8
+ between: number;
9
+ clockRate: number;
10
+ });
11
+ create(payload: Buffer): RtpPacket;
12
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RtpBuilder = void 0;
4
+ const src_1 = require("../../common/src");
5
+ const rtp_1 = require("./rtp/rtp");
6
+ class RtpBuilder {
7
+ constructor(props) {
8
+ Object.defineProperty(this, "props", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: props
13
+ });
14
+ Object.defineProperty(this, "sequenceNumber", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: (0, src_1.random16)()
19
+ });
20
+ Object.defineProperty(this, "timestamp", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: (0, src_1.random32)()
25
+ });
26
+ }
27
+ create(payload) {
28
+ this.sequenceNumber = (0, src_1.uint16Add)(this.sequenceNumber, 1);
29
+ const elapsed = (this.props.between * this.props.clockRate) / 1000;
30
+ this.timestamp = (0, src_1.uint32Add)(this.timestamp, elapsed);
31
+ const header = new rtp_1.RtpHeader({
32
+ sequenceNumber: this.sequenceNumber,
33
+ timestamp: Number(this.timestamp),
34
+ payloadType: 96,
35
+ extension: true,
36
+ marker: false,
37
+ padding: false,
38
+ });
39
+ const rtp = new rtp_1.RtpPacket(header, payload);
40
+ return rtp;
41
+ }
42
+ }
43
+ exports.RtpBuilder = RtpBuilder;
44
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../rtp/src/util.ts"],"names":[],"mappings":";;;AAAA,0CAA4E;AAC5E,mCAAiD;AAEjD,MAAa,UAAU;IAIrB,YACU,KAGP;;;;;mBAHO;;QAJV;;;;mBAAiB,IAAA,cAAQ,GAAE;WAAC;QAC5B;;;;mBAAY,IAAA,cAAQ,GAAE;WAAC;IAOpB,CAAC;IAEJ,MAAM,CAAC,OAAe;QACpB,IAAI,CAAC,cAAc,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QACnE,IAAI,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,eAAS,CAAC;YAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACjC,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,eAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA3BD,gCA2BC","sourcesContent":["import { random16, random32, uint16Add, uint32Add } from \"../../common/src\";\nimport { RtpHeader, RtpPacket } from \"./rtp/rtp\";\n\nexport class RtpBuilder {\n sequenceNumber = random16();\n timestamp = random32();\n\n constructor(\n private props: {\n between: number;\n clockRate: number;\n }\n ) {}\n\n create(payload: Buffer) {\n this.sequenceNumber = uint16Add(this.sequenceNumber, 1);\n const elapsed = (this.props.between * this.props.clockRate) / 1000;\n this.timestamp = uint32Add(this.timestamp, elapsed);\n\n const header = new RtpHeader({\n sequenceNumber: this.sequenceNumber,\n timestamp: Number(this.timestamp),\n payloadType: 96,\n extension: true,\n marker: false,\n padding: false,\n });\n const rtp = new RtpPacket(header, payload);\n return rtp;\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
- import { RtpPacket } from "../../rtp/src";
3
2
  import { Direction } from "./media/rtpTransceiver";
3
+ import { MediaStreamTrack } from "./media/track";
4
4
  import { RTCIceServer } from "./peerConnection";
5
5
  export declare function fingerprint(file: Buffer, hashName: string): any;
6
6
  export declare function isDtls(buf: Buffer): boolean;
@@ -24,11 +24,6 @@ export declare function parseIceServers(iceServers: RTCIceServer[]): {
24
24
  turnUsername: string | undefined;
25
25
  turnPassword: string | undefined;
26
26
  };
27
- export declare class RtpBuilder {
28
- sequenceNumber: number;
29
- timestamp: number;
30
- create(payload: Buffer): RtpPacket;
31
- }
32
27
  /**
33
28
  *
34
29
  * @param signatureHash
@@ -39,3 +34,9 @@ export declare const createSelfSignedCertificate: (signatureHash: import(".").Si
39
34
  keyPem: string;
40
35
  signatureHash: import(".").SignatureHash;
41
36
  }>;
37
+ export declare class MediaStreamTrackFactory {
38
+ static rtpSource({ port, kind, }: {
39
+ port?: number;
40
+ kind: "audio" | "video";
41
+ }): Promise<readonly [MediaStreamTrack, number, () => void]>;
42
+ }
@@ -3,15 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createSelfSignedCertificate = exports.RtpBuilder = exports.parseIceServers = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.milliTime = exports.microTime = exports.reverseDirection = exports.andDirection = exports.reverseSimulcastDirection = exports.isDtls = exports.fingerprint = void 0;
6
+ exports.MediaStreamTrackFactory = exports.createSelfSignedCertificate = exports.parseIceServers = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.milliTime = exports.microTime = exports.reverseDirection = exports.andDirection = exports.reverseSimulcastDirection = exports.isDtls = exports.fingerprint = void 0;
7
7
  /* eslint-disable prefer-const */
8
8
  const crypto_1 = require("crypto");
9
9
  const debug_1 = __importDefault(require("debug"));
10
+ const dgram_1 = require("dgram");
10
11
  const perf_hooks_1 = require("perf_hooks");
11
12
  const src_1 = require("../../common/src");
12
13
  const cipher_1 = require("../../dtls/src/context/cipher");
13
- const src_2 = require("../../rtp/src");
14
14
  const rtpTransceiver_1 = require("./media/rtpTransceiver");
15
+ const track_1 = require("./media/track");
15
16
  const now = require("nano-time");
16
17
  const log = (0, debug_1.default)("werift:packages/webrtc/src/utils.ts");
17
18
  function fingerprint(file, hashName) {
@@ -88,41 +89,28 @@ function parseIceServers(iceServers) {
88
89
  return options;
89
90
  }
90
91
  exports.parseIceServers = parseIceServers;
91
- class RtpBuilder {
92
- constructor() {
93
- Object.defineProperty(this, "sequenceNumber", {
94
- enumerable: true,
95
- configurable: true,
96
- writable: true,
97
- value: (0, src_1.random16)()
98
- });
99
- Object.defineProperty(this, "timestamp", {
100
- enumerable: true,
101
- configurable: true,
102
- writable: true,
103
- value: (0, src_1.random32)()
104
- });
105
- }
106
- create(payload) {
107
- this.sequenceNumber = (0, src_1.uint16Add)(this.sequenceNumber, 1);
108
- this.timestamp = (0, src_1.uint32Add)(this.timestamp, 960);
109
- const header = new src_2.RtpHeader({
110
- sequenceNumber: this.sequenceNumber,
111
- timestamp: Number(this.timestamp),
112
- payloadType: 96,
113
- extension: true,
114
- marker: false,
115
- padding: false,
116
- });
117
- const rtp = new src_2.RtpPacket(header, payload);
118
- return rtp;
119
- }
120
- }
121
- exports.RtpBuilder = RtpBuilder;
122
92
  /**
123
93
  *
124
94
  * @param signatureHash
125
95
  * @param namedCurveAlgorithm necessary when use ecdsa
126
96
  */
127
97
  exports.createSelfSignedCertificate = cipher_1.CipherContext.createSelfSignedCertificateWithKey;
98
+ class MediaStreamTrackFactory {
99
+ static async rtpSource({ port, kind, }) {
100
+ port ?? (port = await (0, src_1.randomPort)());
101
+ const track = new track_1.MediaStreamTrack({ kind });
102
+ const udp = (0, dgram_1.createSocket)("udp4");
103
+ udp.bind(port);
104
+ const onMessage = (msg, rinfo) => {
105
+ track.writeRtp(msg);
106
+ };
107
+ udp.addListener("message", onMessage);
108
+ const dispose = () => {
109
+ udp.removeListener("message", onMessage);
110
+ udp.close();
111
+ };
112
+ return [track, port, dispose];
113
+ }
114
+ }
115
+ exports.MediaStreamTrackFactory = MediaStreamTrackFactory;
128
116
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { performance } from \"perf_hooks\";\n\nimport {\n bufferReader,\n bufferWriter,\n random16,\n random32,\n uint16Add,\n uint32Add,\n} from \"../../common/src\";\nimport { CipherContext } from \"../../dtls/src/context/cipher\";\nimport { Address } from \"../../ice/src\";\nimport { RtpHeader, RtpPacket } from \"../../rtp/src\";\nimport { Direction, Directions } from \"./media/rtpTransceiver\";\nimport { RTCIceServer } from \"./peerConnection\";\nconst now = require(\"nano-time\");\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: Direction, b: Direction) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: Direction): Direction {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5)\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5)\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\nexport class RtpBuilder {\n sequenceNumber = random16();\n timestamp = random32();\n\n create(payload: Buffer) {\n this.sequenceNumber = uint16Add(this.sequenceNumber, 1);\n this.timestamp = uint32Add(this.timestamp, 960);\n\n const header = new RtpHeader({\n sequenceNumber: this.sequenceNumber,\n timestamp: Number(this.timestamp),\n payloadType: 96,\n extension: true,\n marker: false,\n padding: false,\n });\n const rtp = new RtpPacket(header, payload);\n return rtp;\n }\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAiC;AACjC,mCAAoC;AACpC,kDAA0B;AAC1B,iCAAiD;AACjD,2CAAyC;AAEzC,0CAA0E;AAC1E,0DAA8D;AAE9D,2DAA+D;AAC/D,yCAAiD;AAEjD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEjC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,qCAAqC,CAAC,CAAC;AAEzD,SAAgB,WAAW,CAAC,IAAY,EAAE,QAAgB;IACxD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7D,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAPD,kCAOC;AAED,SAAgB,MAAM,CAAC,GAAW;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,SAAS,GAAG,EAAE,IAAI,SAAS,GAAG,EAAE,CAAC;AAC1C,CAAC;AAHD,wBAGC;AAED,SAAgB,yBAAyB,CAAC,GAAoB;IAC5D,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAHD,8DAGC;AAEM,MAAM,YAAY,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE,CACzD,2BAAU,CAAC,2BAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,2BAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAD/C,QAAA,YAAY,gBACmC;AAE5D,SAAgB,gBAAgB,CAAC,GAAc;IAC7C,IAAI,GAAG,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC1C,IAAI,GAAG,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC1C,OAAO,GAAG,CAAC;AACb,CAAC;AAJD,4CAIC;AAEM,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAY,CAAC;AAAxC,QAAA,SAAS,aAA+B;AAE9C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AAAvC,QAAA,SAAS,aAA8B;AAE7C,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAA3C,QAAA,gBAAgB,oBAA2B;AAExD,6DAA6D;AACtD,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,MAAM,GAAG,GAAG,wBAAW,CAAC,UAAU,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9C,OAAO,GAAG,CAAC,eAAe,EAAE,CAAC;AAC/B,CAAC,CAAC;AATW,QAAA,OAAO,WASlB;AAEF;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;IACxC,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAA,kBAAY,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,IAAA,kBAAY,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;AAC1D,CAAC,CAAC;AAJW,QAAA,UAAU,cAIrB;AAEF,SAAgB,eAAe,CAAC,UAA0B;IACxD,MAAM,WAAW,GAAG,CAAC,GAAY,EAAE,EAAE;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAY,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACrE,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAC5B,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACrE,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAC5B,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9D,MAAM,OAAO,GAAG;QACd,UAAU;QACV,UAAU;QACV,YAAY,EAAE,QAAQ;QACtB,YAAY,EAAE,UAAU;KACzB,CAAC;IACF,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAxBD,0CAwBC;AAED;;;;GAIG;AACU,QAAA,2BAA2B,GACtC,sBAAa,CAAC,kCAAkC,CAAC;AAEnD,MAAa,uBAAuB;IAClC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EACrB,IAAI,EACJ,IAAI,GAIL;QACC,IAAI,KAAJ,IAAI,GAAK,MAAM,IAAA,gBAAU,GAAE,EAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,wBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAA,oBAAY,EAAC,MAAM,CAAC,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,KAAiB,EAAE,EAAE;YACnD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC;QACF,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEtC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACzC,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAU,CAAC;IACzC,CAAC;CACF;AAzBD,0DAyBC","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { createSocket, RemoteInfo } from \"dgram\";\nimport { performance } from \"perf_hooks\";\n\nimport { bufferReader, bufferWriter, randomPort } from \"../../common/src\";\nimport { CipherContext } from \"../../dtls/src/context/cipher\";\nimport { Address } from \"../../ice/src\";\nimport { Direction, Directions } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport { RTCIceServer } from \"./peerConnection\";\nconst now = require(\"nano-time\");\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: Direction, b: Direction) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: Direction): Direction {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5)\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5)\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer, rinfo: RemoteInfo) => {\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n udp.close();\n };\n\n return [track, port, dispose] as const;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "werift",
3
- "version": "0.18.8",
3
+ "version": "0.18.10",
4
4
  "description": "WebRTC Implementation for TypeScript (Node.js)",
5
5
  "keywords": [
6
6
  "WebRTC",
package/src/utils.ts CHANGED
@@ -1,20 +1,14 @@
1
1
  /* eslint-disable prefer-const */
2
2
  import { createHash } from "crypto";
3
3
  import debug from "debug";
4
+ import { createSocket, RemoteInfo } from "dgram";
4
5
  import { performance } from "perf_hooks";
5
6
 
6
- import {
7
- bufferReader,
8
- bufferWriter,
9
- random16,
10
- random32,
11
- uint16Add,
12
- uint32Add,
13
- } from "../../common/src";
7
+ import { bufferReader, bufferWriter, randomPort } from "../../common/src";
14
8
  import { CipherContext } from "../../dtls/src/context/cipher";
15
9
  import { Address } from "../../ice/src";
16
- import { RtpHeader, RtpPacket } from "../../rtp/src";
17
10
  import { Direction, Directions } from "./media/rtpTransceiver";
11
+ import { MediaStreamTrack } from "./media/track";
18
12
  import { RTCIceServer } from "./peerConnection";
19
13
  const now = require("nano-time");
20
14
 
@@ -103,27 +97,6 @@ export function parseIceServers(iceServers: RTCIceServer[]) {
103
97
  return options;
104
98
  }
105
99
 
106
- export class RtpBuilder {
107
- sequenceNumber = random16();
108
- timestamp = random32();
109
-
110
- create(payload: Buffer) {
111
- this.sequenceNumber = uint16Add(this.sequenceNumber, 1);
112
- this.timestamp = uint32Add(this.timestamp, 960);
113
-
114
- const header = new RtpHeader({
115
- sequenceNumber: this.sequenceNumber,
116
- timestamp: Number(this.timestamp),
117
- payloadType: 96,
118
- extension: true,
119
- marker: false,
120
- padding: false,
121
- });
122
- const rtp = new RtpPacket(header, payload);
123
- return rtp;
124
- }
125
- }
126
-
127
100
  /**
128
101
  *
129
102
  * @param signatureHash
@@ -131,3 +104,30 @@ export class RtpBuilder {
131
104
  */
132
105
  export const createSelfSignedCertificate =
133
106
  CipherContext.createSelfSignedCertificateWithKey;
107
+
108
+ export class MediaStreamTrackFactory {
109
+ static async rtpSource({
110
+ port,
111
+ kind,
112
+ }: {
113
+ port?: number;
114
+ kind: "audio" | "video";
115
+ }) {
116
+ port ??= await randomPort();
117
+ const track = new MediaStreamTrack({ kind });
118
+
119
+ const udp = createSocket("udp4");
120
+ udp.bind(port);
121
+ const onMessage = (msg: Buffer, rinfo: RemoteInfo) => {
122
+ track.writeRtp(msg);
123
+ };
124
+ udp.addListener("message", onMessage);
125
+
126
+ const dispose = () => {
127
+ udp.removeListener("message", onMessage);
128
+ udp.close();
129
+ };
130
+
131
+ return [track, port, dispose] as const;
132
+ }
133
+ }