From a9a4d049259d3748c2d1440238489cbccf3cd395 Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 3 Mar 2020 14:24:38 -0500 Subject: [PATCH] [@types/rtp-parser] New Definition (#42784) * add type definitions for https://www.npmjs.com/package/rtp-parser * added test for payloadTypesHash * make a generic version of the parseRtpPayloadType * fixed some typos * add test for generic number payload types --- types/rtp-parser/index.d.ts | 212 +++++++++++++++++++++++++++ types/rtp-parser/rtp-parser-tests.ts | 151 +++++++++++++++++++ types/rtp-parser/tsconfig.json | 23 +++ types/rtp-parser/tslint.json | 1 + 4 files changed, 387 insertions(+) create mode 100644 types/rtp-parser/index.d.ts create mode 100644 types/rtp-parser/rtp-parser-tests.ts create mode 100644 types/rtp-parser/tsconfig.json create mode 100644 types/rtp-parser/tslint.json diff --git a/types/rtp-parser/index.d.ts b/types/rtp-parser/index.d.ts new file mode 100644 index 0000000000..35170d844b --- /dev/null +++ b/types/rtp-parser/index.d.ts @@ -0,0 +1,212 @@ +// Type definitions for rtp-parser 1.0 +// Project: https://github.com/fleg/rtp-parser#readme +// Definitions by: Matthew Smith +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +interface ParsedRTPPacket { + version: number; + padding: number; + extension: number; + csrcCount: number; + marker: number; + payload: Buffer; + payloadType: number; + sequenceNumber: number; + timestamp: number; + ssrc: number; + csrc: number[]; +} + +declare function parseRtpPacket(buf: Buffer): ParsedRTPPacket; + +declare const FIXED_HEADER_LENGTH: 12; + +interface PayloadTypesHash { + 0: {name: 'PCMU', mediaType: 'A', clockRate: 8000, channels: 1}; + 1: {name: 'reserved', mediaType: 'A'}; + 2: {name: 'reserved', mediaType: 'A'}; + 3: {name: 'GSM' , mediaType: 'A', clockRate: 8000, channels: 1}; + 4: {name: 'G723', mediaType: 'A', clockRate: 8000, channels: 1}; + 5: {name: 'DVI4', mediaType: 'A', clockRate: 8000, channels: 1}; + 6: {name: 'DVI4', mediaType: 'A', clockRate: 16000, channels: 1}; + 7: {name: 'LPC', mediaType: 'A', clockRate: 8000, channels: 1}; + 8: {name: 'PCMA', mediaType: 'A', clockRate: 8000, channels: 1}; + 9: {name: 'G722', mediaType: 'A', clockRate: 8000, channels: 1}; + 10: {name: 'L16', mediaType: 'A', clockRate: 44100, channels: 2}; + 11: {name: 'L16', mediaType: 'A', clockRate: 44100, channels: 1}; + 12: {name: 'QCELP', mediaType: 'A', clockRate: 8000, channels: 1}; + 13: {name: 'CN', mediaType: 'A', clockRate: 8000, channels: 1}; + 14: {name: 'MPA', mediaType: 'A', clockRate: 90000}; + 15: {name: 'G728', mediaType: 'A', clockRate: 8000, channels: 1}; + 16: {name: 'DVI4', mediaType: 'A', clockRate: 11025, channels: 1}; + 17: {name: 'DVI4', mediaType: 'A', clockRate: 22050, channels: 1}; + 18: {name: 'G729', mediaType: 'A', clockRate: 8000, channels: 1}; + 19: {name: 'reserved', mediaType: 'A'}; + 20: {name: 'unassigned', mediaType: 'A'}; + 21: {name: 'unassigned', mediaType: 'A'}; + 22: {name: 'unassigned', mediaType: 'A'}; + 23: {name: 'unassigned', mediaType: 'A'}; + 24: {name: 'unassigned', mediaType: 'V'}; + 25: {name: 'CelB', mediaType: 'V', clockRate: 90000}; + 26: {name: 'JPEG', mediaType: 'V', clockRate: 90000}; + 27: {name: 'unassigned', mediaType: 'V'}; + 28: {name: 'nv', mediaType: 'V', clockRate: 90000}; + 29: {name: 'unassigned', mediaType: 'V'}; + 30: {name: 'unassigned', mediaType: 'V'}; + 31: {name: 'H261', mediaType: 'V', clockRate: 90000}; + 32: {name: 'MPV', mediaType: 'V', clockRate: 90000}; + 33: {name: 'MP2T', mediaType: 'AV', clockRate: 90000}; + 34: {name: 'H263', mediaType: 'V', clockRate: 90000}; + 35: {name: 'unassigned'}; + 36: {name: 'unassigned'}; + 37: {name: 'unassigned'}; + 38: {name: 'unassigned'}; + 39: {name: 'unassigned'}; + 40: {name: 'unassigned'}; + 41: {name: 'unassigned'}; + 42: {name: 'unassigned'}; + 43: {name: 'unassigned'}; + 44: {name: 'unassigned'}; + 45: {name: 'unassigned'}; + 46: {name: 'unassigned'}; + 47: {name: 'unassigned'}; + 48: {name: 'unassigned'}; + 49: {name: 'unassigned'}; + 50: {name: 'unassigned'}; + 51: {name: 'unassigned'}; + 52: {name: 'unassigned'}; + 53: {name: 'unassigned'}; + 54: {name: 'unassigned'}; + 55: {name: 'unassigned'}; + 56: {name: 'unassigned'}; + 57: {name: 'unassigned'}; + 58: {name: 'unassigned'}; + 59: {name: 'unassigned'}; + 60: {name: 'unassigned'}; + 61: {name: 'unassigned'}; + 62: {name: 'unassigned'}; + 63: {name: 'unassigned'}; + 64: {name: 'unassigned'}; + 65: {name: 'unassigned'}; + 66: {name: 'unassigned'}; + 67: {name: 'unassigned'}; + 68: {name: 'unassigned'}; + 69: {name: 'unassigned'}; + 70: {name: 'unassigned'}; + 71: {name: 'unassigned'}; + 72: {name: 'reserved'}; + 73: {name: 'reserved'}; + 74: {name: 'reserved'}; + 75: {name: 'reserved'}; + 76: {name: 'reserved'}; + 77: {name: 'unassigned'}; + 78: {name: 'unassigned'}; + 79: {name: 'unassigned'}; + 80: {name: 'unassigned'}; + 81: {name: 'unassigned'}; + 82: {name: 'unassigned'}; + 83: {name: 'unassigned'}; + 84: {name: 'unassigned'}; + 85: {name: 'unassigned'}; + 86: {name: 'unassigned'}; + 87: {name: 'unassigned'}; + 88: {name: 'unassigned'}; + 89: {name: 'unassigned'}; + 90: {name: 'unassigned'}; + 91: {name: 'unassigned'}; + 92: {name: 'unassigned'}; + 93: {name: 'unassigned'}; + 94: {name: 'unassigned'}; + 95: {name: 'unassigned'}; + 96: {name: 'dynamic'}; + 97: {name: 'dynamic'}; + 98: {name: 'dynamic'}; + 99: {name: 'dynamic'}; + 100: {name: 'dynamic'}; + 101: {name: 'dynamic'}; + 102: {name: 'dynamic'}; + 103: {name: 'dynamic'}; + 104: {name: 'dynamic'}; + 105: {name: 'dynamic'}; + 106: {name: 'dynamic'}; + 107: {name: 'dynamic'}; + 108: {name: 'dynamic'}; + 109: {name: 'dynamic'}; + 110: {name: 'dynamic'}; + 111: {name: 'dynamic'}; + 112: {name: 'dynamic'}; + 113: {name: 'dynamic'}; + 114: {name: 'dynamic'}; + 115: {name: 'dynamic'}; + 116: {name: 'dynamic'}; + 117: {name: 'dynamic'}; + 118: {name: 'dynamic'}; + 119: {name: 'dynamic'}; + 120: {name: 'dynamic'}; + 121: {name: 'dynamic'}; + 122: {name: 'dynamic'}; + 123: {name: 'dynamic'}; + 124: {name: 'dynamic'}; + 125: {name: 'dynamic'}; + 126: {name: 'dynamic'}; + 127: {name: 'dynamic'}; +} +export const payloadTypesHash: PayloadTypesHash; +type PayloadType = keyof PayloadTypesHash; + +interface ParsedRTPType { + name: 'PCMU' | 'GSM' | 'G723' | 'DVI4' | 'DVI4' | 'LPC' | 'PCMA' | 'G722' | 'L16' | 'L16' | 'QCELP' | 'CN' | + 'MPA' | 'G728' | 'DVI4' | 'DVI4' | 'G729' | 'CelB' | 'JPEG' | 'nv' | 'H261' | 'MPV' | 'MP2T' | 'H263' | + 'reserved' | 'unassigned' | 'dynamic'; + mediaType?: 'A' | 'AV' | 'V'; + clockRate?: 8000 | 16000 | 44100 | 90000 | 11025 | 22050; + channels?: 1 | 2; +} + +declare function parseRtpPayloadType(payloadType: 0): {name: 'PCMU', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 1 | 2 | 19): {name: 'reserved', mediaType: 'A'}; +declare function parseRtpPayloadType(payloadType: 3): {name: 'GSM' , mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 4): {name: 'G723', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 5): {name: 'DVI4', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 6): {name: 'DVI4', mediaType: 'A', clockRate: 16000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 7): {name: 'LPC', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 8): {name: 'PCMA', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 9): {name: 'G722', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 10): {name: 'L16', mediaType: 'A', clockRate: 44100, channels: 2}; +declare function parseRtpPayloadType(payloadType: 11): {name: 'L16', mediaType: 'A', clockRate: 44100, channels: 1}; +declare function parseRtpPayloadType(payloadType: 12): {name: 'QCELP', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 13): {name: 'CN', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 14): {name: 'MPA', mediaType: 'A', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 15): {name: 'G728', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 16): {name: 'DVI4', mediaType: 'A', clockRate: 11025, channels: 1}; +declare function parseRtpPayloadType(payloadType: 17): {name: 'DVI4', mediaType: 'A', clockRate: 22050, channels: 1}; +declare function parseRtpPayloadType(payloadType: 18): {name: 'G729', mediaType: 'A', clockRate: 8000, channels: 1}; +declare function parseRtpPayloadType(payloadType: 20 | 21 | 22 | 23): {name: 'unassigned', mediaType: 'A'}; +declare function parseRtpPayloadType(payloadType: 24 | 27 | 29 | 30): {name: 'unassigned', mediaType: 'V'}; +declare function parseRtpPayloadType(payloadType: 25): {name: 'CelB', mediaType: 'V', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 26): {name: 'JPEG', mediaType: 'V', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 28): {name: 'nv', mediaType: 'V', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 31): {name: 'H261', mediaType: 'V', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 32): {name: 'MPV', mediaType: 'V', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 33): {name: 'MP2T', mediaType: 'AV', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 34): {name: 'H263', mediaType: 'V', clockRate: 90000}; +declare function parseRtpPayloadType(payloadType: 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | + 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | + 65 | 66 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | + 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 + ): {name: 'unassigned'}; +declare function parseRtpPayloadType(payloadType: 72 | 73 | 74 | 75 | 76): {name: 'reserved'}; +declare function parseRtpPayloadType(payloadType: 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | + 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | + 121 | 122 | 123 | 124 | 125 | 126 | 127 + ): {name: 'dynamic'}; +declare function parseRtpPayloadType(payloadType: number): ParsedRTPType; + +export { + parseRtpPacket, + parseRtpPayloadType, + FIXED_HEADER_LENGTH, + PayloadType, +}; diff --git a/types/rtp-parser/rtp-parser-tests.ts b/types/rtp-parser/rtp-parser-tests.ts new file mode 100644 index 0000000000..dba4947b06 --- /dev/null +++ b/types/rtp-parser/rtp-parser-tests.ts @@ -0,0 +1,151 @@ +import { parseRtpPacket, parseRtpPayloadType, payloadTypesHash } from 'rtp-parser'; + +const result = parseRtpPacket(new Buffer('fakeRTP')); +result.csrc; // $ExpectType number[] +result.payload; // $ExpectType Buffer + +const parsed3 = parseRtpPayloadType(3); +parsed3.name; // $ExpectType "GSM" +parsed3.mediaType; // $ExpectType "A" +parsed3.channels; // $ExpectType 1 +parsed3.clockRate; // $ExpectType 8000 + +const parsed35 = parseRtpPayloadType(35); +parsed35.name; // $ExpectType "unassigned" + +for (let i = 0; i < 200; i++) { + const parsed = parseRtpPayloadType(i); + if (parsed.name) {} + if (parsed.clockRate) {} +} + +payloadTypesHash[0].mediaType; // $ExpectType "A" + +parseRtpPayloadType(0); +parseRtpPayloadType(1); +parseRtpPayloadType(2); +parseRtpPayloadType(3); +parseRtpPayloadType(4); +parseRtpPayloadType(5); +parseRtpPayloadType(6); +parseRtpPayloadType(7); +parseRtpPayloadType(8); +parseRtpPayloadType(9); +parseRtpPayloadType(10); +parseRtpPayloadType(11); +parseRtpPayloadType(12); +parseRtpPayloadType(13); +parseRtpPayloadType(14); +parseRtpPayloadType(15); +parseRtpPayloadType(16); +parseRtpPayloadType(17); +parseRtpPayloadType(18); +parseRtpPayloadType(19); +parseRtpPayloadType(20); +parseRtpPayloadType(21); +parseRtpPayloadType(22); +parseRtpPayloadType(23); +parseRtpPayloadType(24); +parseRtpPayloadType(25); +parseRtpPayloadType(26); +parseRtpPayloadType(27); +parseRtpPayloadType(28); +parseRtpPayloadType(29); +parseRtpPayloadType(30); +parseRtpPayloadType(31); +parseRtpPayloadType(32); +parseRtpPayloadType(33); +parseRtpPayloadType(34); +parseRtpPayloadType(35); +parseRtpPayloadType(36); +parseRtpPayloadType(37); +parseRtpPayloadType(38); +parseRtpPayloadType(39); +parseRtpPayloadType(40); +parseRtpPayloadType(41); +parseRtpPayloadType(42); +parseRtpPayloadType(43); +parseRtpPayloadType(44); +parseRtpPayloadType(45); +parseRtpPayloadType(46); +parseRtpPayloadType(47); +parseRtpPayloadType(48); +parseRtpPayloadType(49); +parseRtpPayloadType(50); +parseRtpPayloadType(51); +parseRtpPayloadType(52); +parseRtpPayloadType(53); +parseRtpPayloadType(54); +parseRtpPayloadType(55); +parseRtpPayloadType(56); +parseRtpPayloadType(57); +parseRtpPayloadType(58); +parseRtpPayloadType(59); +parseRtpPayloadType(60); +parseRtpPayloadType(61); +parseRtpPayloadType(62); +parseRtpPayloadType(63); +parseRtpPayloadType(64); +parseRtpPayloadType(65); +parseRtpPayloadType(66); +parseRtpPayloadType(67); +parseRtpPayloadType(68); +parseRtpPayloadType(69); +parseRtpPayloadType(70); +parseRtpPayloadType(71); +parseRtpPayloadType(72); +parseRtpPayloadType(73); +parseRtpPayloadType(74); +parseRtpPayloadType(75); +parseRtpPayloadType(76); +parseRtpPayloadType(77); +parseRtpPayloadType(78); +parseRtpPayloadType(79); +parseRtpPayloadType(80); +parseRtpPayloadType(81); +parseRtpPayloadType(82); +parseRtpPayloadType(83); +parseRtpPayloadType(84); +parseRtpPayloadType(85); +parseRtpPayloadType(86); +parseRtpPayloadType(87); +parseRtpPayloadType(88); +parseRtpPayloadType(89); +parseRtpPayloadType(90); +parseRtpPayloadType(91); +parseRtpPayloadType(92); +parseRtpPayloadType(93); +parseRtpPayloadType(94); +parseRtpPayloadType(95); +parseRtpPayloadType(96); +parseRtpPayloadType(97); +parseRtpPayloadType(98); +parseRtpPayloadType(99); +parseRtpPayloadType(100); +parseRtpPayloadType(101); +parseRtpPayloadType(102); +parseRtpPayloadType(103); +parseRtpPayloadType(104); +parseRtpPayloadType(105); +parseRtpPayloadType(106); +parseRtpPayloadType(107); +parseRtpPayloadType(108); +parseRtpPayloadType(109); +parseRtpPayloadType(110); +parseRtpPayloadType(111); +parseRtpPayloadType(112); +parseRtpPayloadType(113); +parseRtpPayloadType(114); +parseRtpPayloadType(115); +parseRtpPayloadType(116); +parseRtpPayloadType(117); +parseRtpPayloadType(118); +parseRtpPayloadType(119); +parseRtpPayloadType(120); +parseRtpPayloadType(121); +parseRtpPayloadType(122); +parseRtpPayloadType(123); +parseRtpPayloadType(124); +parseRtpPayloadType(125); +parseRtpPayloadType(126); +parseRtpPayloadType(127); diff --git a/types/rtp-parser/tsconfig.json b/types/rtp-parser/tsconfig.json new file mode 100644 index 0000000000..494c081537 --- /dev/null +++ b/types/rtp-parser/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "rtp-parser-tests.ts" + ] +} diff --git a/types/rtp-parser/tslint.json b/types/rtp-parser/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/rtp-parser/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }