werift 0.13.7 → 0.14.2-debug0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/lib/common/src/binary.d.ts +10 -0
  2. package/lib/common/src/binary.js +83 -1
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/dtls/src/context/cipher.d.ts +1 -2
  5. package/lib/dtls/src/context/cipher.js +69 -68
  6. package/lib/dtls/src/context/cipher.js.map +1 -1
  7. package/lib/ice/src/ice.js +10 -4
  8. package/lib/ice/src/ice.js.map +1 -1
  9. package/lib/rtp/src/index.d.ts +12 -9
  10. package/lib/rtp/src/index.js +12 -18
  11. package/lib/rtp/src/index.js.map +1 -1
  12. package/lib/rtp/src/processor/jitterBuffer.js +1 -1
  13. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  14. package/lib/rtp/src/processor/webm.d.ts +5 -1
  15. package/lib/rtp/src/processor/webm.js +12 -29
  16. package/lib/rtp/src/processor/webm.js.map +1 -1
  17. package/lib/rtp/src/rtp/red/encoder.d.ts +14 -0
  18. package/lib/rtp/src/rtp/red/encoder.js +40 -0
  19. package/lib/rtp/src/rtp/red/encoder.js.map +1 -0
  20. package/lib/rtp/src/rtp/{red.d.ts → red/packet.d.ts} +5 -5
  21. package/lib/rtp/src/rtp/red/packet.js +115 -0
  22. package/lib/rtp/src/rtp/red/packet.js.map +1 -0
  23. package/lib/rtp/src/rtp/rtp.d.ts +1 -1
  24. package/lib/rtp/src/rtp/rtp.js +1 -1
  25. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  26. package/lib/sctp/src/sctp.d.ts +2 -1
  27. package/lib/sctp/src/sctp.js +4 -2
  28. package/lib/sctp/src/sctp.js.map +1 -1
  29. package/lib/webrtc/src/const.d.ts +2 -0
  30. package/lib/webrtc/src/const.js +3 -1
  31. package/lib/webrtc/src/const.js.map +1 -1
  32. package/lib/webrtc/src/index.d.ts +1 -0
  33. package/lib/webrtc/src/index.js +1 -0
  34. package/lib/webrtc/src/index.js.map +1 -1
  35. package/lib/webrtc/src/media/parameters.d.ts +1 -1
  36. package/lib/webrtc/src/media/parameters.js +0 -1
  37. package/lib/webrtc/src/media/parameters.js.map +1 -1
  38. package/lib/webrtc/src/media/receiver/red.js +8 -6
  39. package/lib/webrtc/src/media/receiver/red.js.map +1 -1
  40. package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -1
  41. package/lib/webrtc/src/media/rtpReceiver.js +3 -1
  42. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  43. package/lib/webrtc/src/media/rtpSender.d.ts +8 -6
  44. package/lib/webrtc/src/media/rtpSender.js +21 -28
  45. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  46. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +21 -1
  47. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  48. package/lib/webrtc/src/peerConnection.d.ts +10 -4
  49. package/lib/webrtc/src/peerConnection.js +39 -12
  50. package/lib/webrtc/src/peerConnection.js.map +1 -1
  51. package/lib/webrtc/src/sdp.d.ts +4 -0
  52. package/lib/webrtc/src/sdp.js +11 -9
  53. package/lib/webrtc/src/sdp.js.map +1 -1
  54. package/lib/webrtc/src/transport/dtls.d.ts +6 -1
  55. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  56. package/lib/webrtc/src/transport/sctp.d.ts +1 -0
  57. package/lib/webrtc/src/transport/sctp.js +5 -1
  58. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  59. package/lib/webrtc/src/utils.d.ts +10 -0
  60. package/lib/webrtc/src/utils.js +8 -1
  61. package/lib/webrtc/src/utils.js.map +1 -1
  62. package/package.json +1 -1
  63. package/src/const.ts +6 -0
  64. package/src/index.ts +1 -0
  65. package/src/media/parameters.ts +1 -1
  66. package/src/media/receiver/red.ts +11 -12
  67. package/src/media/rtpReceiver.ts +3 -1
  68. package/src/media/rtpSender.ts +26 -45
  69. package/src/nonstandard/recorder/writer/webm.ts +3 -0
  70. package/src/peerConnection.ts +52 -15
  71. package/src/sdp.ts +10 -8
  72. package/src/transport/dtls.ts +6 -0
  73. package/src/transport/sctp.ts +6 -1
  74. package/src/utils.ts +9 -0
  75. package/lib/rtp/src/rtp/red.js +0 -104
  76. package/lib/rtp/src/rtp/red.js.map +0 -1
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedEncoder = void 0;
4
+ const src_1 = require("../../../../common/src");
5
+ const packet_1 = require("./packet");
6
+ class RedEncoder {
7
+ constructor(distance = 1) {
8
+ this.distance = distance;
9
+ this.cache = [];
10
+ this.cacheSize = 10;
11
+ }
12
+ push(payload) {
13
+ this.cache.push(payload);
14
+ if (this.cache.length > this.cacheSize) {
15
+ this.cache.shift();
16
+ }
17
+ }
18
+ build() {
19
+ const red = new packet_1.Red();
20
+ const redundantPayloads = this.cache.slice(-(this.distance + 1));
21
+ const presentPayload = redundantPayloads.pop();
22
+ if (!presentPayload) {
23
+ return red;
24
+ }
25
+ redundantPayloads.forEach((redundant) => {
26
+ red.blocks.push({
27
+ block: redundant.block,
28
+ blockPT: redundant.blockPT,
29
+ timestampOffset: (0, src_1.uint32Add)(presentPayload.timestamp, -redundant.timestamp),
30
+ });
31
+ });
32
+ red.blocks.push({
33
+ block: presentPayload.block,
34
+ blockPT: presentPayload.blockPT,
35
+ });
36
+ return red;
37
+ }
38
+ }
39
+ exports.RedEncoder = RedEncoder;
40
+ //# sourceMappingURL=encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/encoder.ts"],"names":[],"mappings":";;;AAAA,gDAAmD;AACnD,qCAA+B;AAE/B,MAAa,UAAU;IAIrB,YAAmB,WAAW,CAAC;QAAZ,aAAQ,GAAR,QAAQ,CAAI;QAHvB,UAAK,GAA4D,EAAE,CAAC;QAC5E,cAAS,GAAG,EAAE,CAAC;IAEmB,CAAC;IAEnC,IAAI,CAAC,OAA8D;QACjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SACpB;IACH,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,YAAG,EAAE,CAAC;QACtB,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjE,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO,GAAG,CAAC;SACZ;QAED,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACtC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,eAAe,EAAE,IAAA,eAAS,EACxB,cAAc,CAAC,SAAS,EACxB,CAAC,SAAS,CAAC,SAAS,CACrB;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YACd,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,OAAO,EAAE,cAAc,CAAC,OAAO;SAChC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAtCD,gCAsCC","sourcesContent":["import { uint32Add } from \"../../../../common/src\";\nimport { Red } from \"./packet\";\n\nexport class RedEncoder {\n private cache: { block: Buffer; timestamp: number; blockPT: number }[] = [];\n cacheSize = 10;\n\n constructor(public distance = 1) {}\n\n push(payload: { block: Buffer; timestamp: number; blockPT: number }) {\n this.cache.push(payload);\n if (this.cache.length > this.cacheSize) {\n this.cache.shift();\n }\n }\n\n build() {\n const red = new Red();\n const redundantPayloads = this.cache.slice(-(this.distance + 1));\n\n const presentPayload = redundantPayloads.pop();\n if (!presentPayload) {\n return red;\n }\n\n redundantPayloads.forEach((redundant) => {\n red.blocks.push({\n block: redundant.block,\n blockPT: redundant.blockPT,\n timestampOffset: uint32Add(\n presentPayload.timestamp,\n -redundant.timestamp\n ),\n });\n });\n red.blocks.push({\n block: presentPayload.block,\n blockPT: presentPayload.blockPT,\n });\n return red;\n }\n}\n"]}
@@ -1,21 +1,21 @@
1
1
  /// <reference types="node" />
2
2
  export declare class Red {
3
3
  header: RedHeader;
4
- payloads: {
5
- bin: Buffer;
4
+ blocks: {
5
+ block: Buffer;
6
6
  blockPT: number;
7
7
  /**14bit */
8
8
  timestampOffset?: number;
9
9
  }[];
10
- static deSerialize(buf: Buffer): Red;
10
+ static deSerialize(bufferOrArrayBuffer: Buffer | ArrayBuffer): Red;
11
11
  serialize(): Buffer;
12
12
  }
13
13
  export declare class RedHeader {
14
- payloads: RedHeaderPayload[];
14
+ fields: RedHeaderField[];
15
15
  static deSerialize(buf: Buffer): readonly [RedHeader, number];
16
16
  serialize(): Buffer;
17
17
  }
18
- interface RedHeaderPayload {
18
+ interface RedHeaderField {
19
19
  fBit: number;
20
20
  blockPT: number;
21
21
  /**14bit */
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ // rfc2198
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.RedHeader = exports.Red = void 0;
5
+ const debug_1 = require("debug");
6
+ const src_1 = require("../../../../common/src");
7
+ const log = (0, debug_1.debug)("packages/rtp/src/rtp/red/packet.ts");
8
+ // 0 1 2 3
9
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
10
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
11
+ // |F| block PT | timestamp offset | block length |
12
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
13
+ // 0 1 2 3 4 5 6 7
14
+ // +-+-+-+-+-+-+-+-+
15
+ // |0| Block PT |
16
+ // +-+-+-+-+-+-+-+-+
17
+ class Red {
18
+ constructor() {
19
+ this.blocks = [];
20
+ }
21
+ static deSerialize(bufferOrArrayBuffer) {
22
+ const buf = bufferOrArrayBuffer instanceof ArrayBuffer
23
+ ? Buffer.from(bufferOrArrayBuffer)
24
+ : bufferOrArrayBuffer;
25
+ const red = new Red();
26
+ let offset = 0;
27
+ [red.header, offset] = RedHeader.deSerialize(buf);
28
+ red.header.fields.forEach(({ blockLength, timestampOffset, blockPT }) => {
29
+ if (blockLength && timestampOffset) {
30
+ const block = buf.slice(offset, offset + blockLength);
31
+ red.blocks.push({ block, blockPT, timestampOffset });
32
+ offset += blockLength;
33
+ }
34
+ else {
35
+ const block = buf.slice(offset);
36
+ red.blocks.push({ block, blockPT });
37
+ }
38
+ });
39
+ return red;
40
+ }
41
+ serialize() {
42
+ this.header = new RedHeader();
43
+ for (const { timestampOffset, blockPT, block } of this.blocks) {
44
+ if (timestampOffset) {
45
+ this.header.fields.push({
46
+ fBit: 1,
47
+ blockPT,
48
+ blockLength: block.length,
49
+ timestampOffset,
50
+ });
51
+ }
52
+ else {
53
+ this.header.fields.push({ fBit: 0, blockPT });
54
+ }
55
+ }
56
+ let buf = this.header.serialize();
57
+ for (const { block } of this.blocks) {
58
+ buf = Buffer.concat([buf, block]);
59
+ }
60
+ return buf;
61
+ }
62
+ }
63
+ exports.Red = Red;
64
+ class RedHeader {
65
+ constructor() {
66
+ this.fields = [];
67
+ }
68
+ static deSerialize(buf) {
69
+ let offset = 0;
70
+ const header = new RedHeader();
71
+ for (;;) {
72
+ const field = {};
73
+ header.fields.push(field);
74
+ const bitStream = new src_1.BitStream(buf.slice(offset));
75
+ field.fBit = bitStream.readBits(1);
76
+ field.blockPT = bitStream.readBits(7);
77
+ offset++;
78
+ if (field.fBit === 0) {
79
+ break;
80
+ }
81
+ field.timestampOffset = bitStream.readBits(14);
82
+ field.blockLength = bitStream.readBits(10);
83
+ offset += 3;
84
+ }
85
+ return [header, offset];
86
+ }
87
+ serialize() {
88
+ let buf = Buffer.alloc(0);
89
+ for (const field of this.fields) {
90
+ try {
91
+ if (field.timestampOffset && field.blockLength) {
92
+ const bitStream = new src_1.BitStream(Buffer.alloc(4))
93
+ .writeBits(1, field.fBit)
94
+ .writeBits(7, field.blockPT)
95
+ .writeBits(14, field.timestampOffset)
96
+ .writeBits(10, field.blockLength);
97
+ buf = Buffer.concat([buf, bitStream.uint8Array]);
98
+ }
99
+ else {
100
+ const bitStream = new src_1.BitStream(Buffer.alloc(1))
101
+ .writeBits(1, 0)
102
+ .writeBits(7, field.blockPT);
103
+ buf = Buffer.concat([buf, bitStream.uint8Array]);
104
+ }
105
+ }
106
+ catch (error) {
107
+ log(error?.message);
108
+ continue;
109
+ }
110
+ }
111
+ return buf;
112
+ }
113
+ }
114
+ exports.RedHeader = RedHeader;
115
+ //# sourceMappingURL=packet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/packet.ts"],"names":[],"mappings":"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","sourcesContent":["// rfc2198\n\nimport { debug } from \"debug\";\n\nimport { BitStream } from \"../../../../common/src\";\n\nconst log = debug(\"packages/rtp/src/rtp/red/packet.ts\");\n\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |F| block PT | timestamp offset | block length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| Block PT |\n// +-+-+-+-+-+-+-+-+\n\nexport class Red {\n header!: RedHeader;\n blocks: {\n block: Buffer;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n }[] = [];\n\n static deSerialize(bufferOrArrayBuffer: Buffer | ArrayBuffer) {\n const buf =\n bufferOrArrayBuffer instanceof ArrayBuffer\n ? Buffer.from(bufferOrArrayBuffer)\n : bufferOrArrayBuffer;\n\n const red = new Red();\n let offset = 0;\n [red.header, offset] = RedHeader.deSerialize(buf);\n\n red.header.fields.forEach(({ blockLength, timestampOffset, blockPT }) => {\n if (blockLength && timestampOffset) {\n const block = buf.slice(offset, offset + blockLength);\n red.blocks.push({ block, blockPT, timestampOffset });\n offset += blockLength;\n } else {\n const block = buf.slice(offset);\n red.blocks.push({ block, blockPT });\n }\n });\n\n return red;\n }\n\n serialize() {\n this.header = new RedHeader();\n\n for (const { timestampOffset, blockPT, block } of this.blocks) {\n if (timestampOffset) {\n this.header.fields.push({\n fBit: 1,\n blockPT,\n blockLength: block.length,\n timestampOffset,\n });\n } else {\n this.header.fields.push({ fBit: 0, blockPT });\n }\n }\n\n let buf = this.header.serialize();\n for (const { block } of this.blocks) {\n buf = Buffer.concat([buf, block]);\n }\n\n return buf;\n }\n}\n\nexport class RedHeader {\n fields: RedHeaderField[] = [];\n\n static deSerialize(buf: Buffer) {\n let offset = 0;\n const header = new RedHeader();\n\n for (;;) {\n const field: RedHeaderField = {} as any;\n header.fields.push(field);\n\n const bitStream = new BitStream(buf.slice(offset));\n field.fBit = bitStream.readBits(1);\n field.blockPT = bitStream.readBits(7);\n\n offset++;\n\n if (field.fBit === 0) {\n break;\n }\n\n field.timestampOffset = bitStream.readBits(14);\n field.blockLength = bitStream.readBits(10);\n\n offset += 3;\n }\n\n return [header, offset] as const;\n }\n\n serialize() {\n let buf = Buffer.alloc(0);\n for (const field of this.fields) {\n try {\n if (field.timestampOffset && field.blockLength) {\n const bitStream = new BitStream(Buffer.alloc(4))\n .writeBits(1, field.fBit)\n .writeBits(7, field.blockPT)\n .writeBits(14, field.timestampOffset)\n .writeBits(10, field.blockLength);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n } else {\n const bitStream = new BitStream(Buffer.alloc(1))\n .writeBits(1, 0)\n .writeBits(7, field.blockPT);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n }\n } catch (error: any) {\n log(error?.message);\n continue;\n }\n }\n return buf;\n }\n}\n\ninterface RedHeaderField {\n fBit: number;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n /**10bit */\n blockLength?: number;\n}\n"]}
@@ -18,7 +18,7 @@ export declare class RtpHeader {
18
18
  payloadType: number;
19
19
  /**16bit */
20
20
  sequenceNumber: number;
21
- /**32bit */
21
+ /**32bit milliseconds/1000 */
22
22
  timestamp: number;
23
23
  ssrc: number;
24
24
  csrc: number[];
@@ -36,7 +36,7 @@ class RtpHeader {
36
36
  this.payloadType = 0;
37
37
  /**16bit */
38
38
  this.sequenceNumber = 0;
39
- /**32bit */
39
+ /**32bit milliseconds/1000 */
40
40
  this.timestamp = 0;
41
41
  this.ssrc = 0;
42
42
  this.csrc = [];
@@ -1 +1 @@
1
- {"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcLength = 4;\n\n/*\n * 0 1 2 3\n * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit */\n sequenceNumber: number = 0;\n /**32bit */\n timestamp: number = 0;\n ssrc: number = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n const cc = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(cc)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcLength;\n h.csrc[i] = rawPacket.slice(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .slice(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.slice(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len = // and not &^\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.slice(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcLength;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n extensions.forEach((extension) => {\n extSize += 1 + extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte:\n extensions.forEach((extension) => {\n extSize += 2 + extension.payload.length;\n });\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n this.csrc.forEach((csrc) => {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n });\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n this.extensions.forEach((extension) => {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n this.extensions.forEach((extension) => {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.floor((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.floor(roundedExtSize / 4), extHeaderPos + 2);\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.slice(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
1
+ {"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcLength = 4;\n\n/*\n * 0 1 2 3\n * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit */\n sequenceNumber: number = 0;\n /**32bit milliseconds/1000 */\n timestamp: number = 0;\n ssrc: number = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n const cc = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(cc)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcLength;\n h.csrc[i] = rawPacket.slice(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .slice(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.slice(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len = // and not &^\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.slice(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcLength;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n extensions.forEach((extension) => {\n extSize += 1 + extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte:\n extensions.forEach((extension) => {\n extSize += 2 + extension.payload.length;\n });\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n this.csrc.forEach((csrc) => {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n });\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n this.extensions.forEach((extension) => {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n this.extensions.forEach((extension) => {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.floor((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.floor(roundedExtSize / 4), extHeaderPos + 2);\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.slice(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
@@ -117,7 +117,8 @@ export declare class SCTP {
117
117
  private updateAdvancedPeerAckPoint;
118
118
  private maybeAbandon;
119
119
  static getCapabilities(): RTCSctpCapabilities;
120
- start(remotePort: number): Promise<void>;
120
+ setRemotePort(port: number): void;
121
+ start(): Promise<void>;
121
122
  private init;
122
123
  private setExtensions;
123
124
  sendChunk(chunk: Chunk): Promise<void>;
@@ -850,11 +850,13 @@ class SCTP {
850
850
  static getCapabilities() {
851
851
  return new RTCSctpCapabilities(65536);
852
852
  }
853
- async start(remotePort) {
853
+ setRemotePort(port) {
854
+ this.remotePort = port;
855
+ }
856
+ async start() {
854
857
  if (!this.started) {
855
858
  this.started = true;
856
859
  this.setConnectionState("connecting");
857
- this.remotePort = remotePort;
858
860
  if (!this.isServer) {
859
861
  await this.init();
860
862
  }