├── .gitignore ├── README.md ├── index.js ├── mkcert ├── server.crt └── server.key ├── package.json ├── public └── index.html └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | 25 | #Electron-builder output 26 | /dist_electron -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simple-webrtc 2 | nodejs和html及其简单实现webrtc通信,代码不到100行 3 | 4 | # 编译运行 5 | 6 | ```shell 7 | yarn 8 | node index.js 9 | ``` 10 | 11 | 访问https://127.0.0.1:3000/ 12 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 服务器 3 | */ 4 | var express = require('express'); 5 | var expressWs = require('express-ws'); 6 | var app = express(); 7 | expressWs(app) 8 | app.use(express.static('public')); 9 | app.get('/', function (req, res) { 10 | res.sendFile(path.join(__dirname, 'public', 'index.html')); 11 | }) 12 | app.ws('/single', SingleRTCConnect) 13 | let rooms = {} 14 | //核心代码 15 | function SingleRTCConnect(ws, req) { 16 | //获取name 17 | let url = req.url.split("?")[1]; 18 | let params = new URLSearchParams(url) 19 | let room = params.get("room") 20 | rooms[room] = ws 21 | ws.on('message', async (Resp_data) => { 22 | let message = JSON.parse(Resp_data) 23 | let msg 24 | if (!rooms[message.receiver]) { 25 | return 26 | } 27 | switch (message.name) { 28 | //创建房间 29 | case 'createRoom': 30 | //发送邀请 31 | msg = { 32 | name: "peer", 33 | receiver: room 34 | } 35 | rooms[message.receiver].send(JSON.stringify(msg)) 36 | break; 37 | //被邀请方接收 38 | case 'offer': 39 | //发送offer 40 | msg = { 41 | name: "offer", 42 | receiver: room, 43 | data: message.data 44 | } 45 | rooms[message.receiver].send(JSON.stringify(msg)) 46 | break; 47 | //接收answer 48 | case 'answer': 49 | //接收answer 50 | msg = { 51 | name: "answer", 52 | receiver: room, 53 | data: message.data 54 | } 55 | rooms[message.receiver].send(JSON.stringify(msg)) 56 | break 57 | case 'ice_candidate': 58 | //接收answer 59 | msg = { 60 | name: "ice_candidate", 61 | receiver: room, 62 | data: message.data, 63 | } 64 | rooms[message.receiver].send(JSON.stringify(msg)) 65 | break 66 | } 67 | }) 68 | ws.on('close', () => { 69 | rooms[room] = "" 70 | }) 71 | } 72 | /** 73 | * 下面的代码基本上不用去看和分析,都是常规配置 74 | */ 75 | /** 76 | * 读取https证书文件 77 | */ 78 | let fs = require("fs"); 79 | const path = require('path'); 80 | const httpsOption = { 81 | key: fs.readFileSync(path.join(__dirname, 'mkcert/server.key')), 82 | cert: fs.readFileSync(path.join(__dirname, '/mkcert/server.crt')) 83 | } 84 | /** 85 | * 初始化https 86 | */ 87 | let server = require("https").createServer(httpsOption, app); 88 | /** 89 | * 设置最大传输文件大小 90 | */ 91 | expressWs(app, server, { wsOptions: { maxPayload: 5 * 1024 * 1024 * 1024, } }) 92 | //启动服务 93 | server.listen("3000", "0.0.0.0", function () { 94 | console.log(`https running at https://127.0.0.1:3000`); 95 | }); -------------------------------------------------------------------------------- /mkcert/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIETzCCAregAwIBAgIQYLQ+kPVA0IUpaIeRco2wUTANBgkqhkiG9w0BAQsFADCB 3 | hzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMS4wLAYDVQQLDCVERVNL 4 | VE9QLTJROVVBNERcc29saWRAREVTS1RPUC0yUTlVQTREMTUwMwYDVQQDDCxta2Nl 5 | cnQgREVTS1RPUC0yUTlVQTREXHNvbGlkQERFU0tUT1AtMlE5VUE0RDAeFw0yMTA5 6 | MDcwMzM5MDRaFw0yMzEyMDcwMzM5MDRaMFkxJzAlBgNVBAoTHm1rY2VydCBkZXZl 7 | bG9wbWVudCBjZXJ0aWZpY2F0ZTEuMCwGA1UECwwlREVTS1RPUC0yUTlVQTREXHNv 8 | bGlkQERFU0tUT1AtMlE5VUE0RDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC 9 | ggEBANAgR2GfCL0TGjDtBO8I5ecD3O1EUqy0dWJKuEqat+P3mKJqMr++oEmF1ehF 10 | fCPzQPIDs0bMENvHMS33peBhcUxgcdHWnaoIPWxt8T3avDN2cb5oKn0SPWXCtyyc 11 | 5Qe3xIxUb5b0iVHTny+o0HdJaRisCSsmd81vDk8ecbB8/+JzveIajuiZIgnc0Hmg 12 | xyn44801AzsCYRHb5HZJJK3Z5l65H7UILzGYqp7KDNR81axZNA97TfhzSA8kMuRy 13 | c2u1fR6RekJ5Lze21BWM1Uf/XM9/j1lUNJlfvnHM3Q57cD9XwSBbcqMUH7c0F/M+ 14 | V3sFeMT6Nz3bcE80/E5OMN9miZECAwEAAaNkMGIwDgYDVR0PAQH/BAQDAgWgMBMG 15 | A1UdJQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQYMBaAFDkezwQkIZZa1w0DeJA9qn8l 16 | jd3WMBoGA1UdEQQTMBGCCWxvY2FsaG9zdIcEwKgDqjANBgkqhkiG9w0BAQsFAAOC 17 | AYEAZ6r+o8oQKdVpBC9h6hLhcC3F1H1ZFaM0d9EW5pvPsrnrj+RyHR3QMbMcaYJO 18 | PjYv7bKVmNtNxGhGwomxNxevRz14D97h78MLqsTxMQwqW+Haro17+42ZuGmplUL5 19 | YbVMuxmixfTD8gvmZN0z5LUNtOW78kDu0xG9HAH1We7UVh7U9kqR4dKjh5TUNhV5 20 | CUnujeL3TrXKGZ/M9c4/vHgOUalR7s0/KgUyKL/aRD08Ut6lw+JWAj4LMi8qd0ey 21 | PLp6ssGF17MHNa7btqxJZmj/Iwzg33HUTI6eMGLi48KC2/71by3MWTNit/eXs5ku 22 | nqUoo/rC5TqHo4S3WPOcXP5Tr1YSK0qgvVuf/bUPeE4eOf0pQ5l7o1QxJwHWPiLO 23 | WiJxWhYHwETT9Tj1USEInbDKf5dVJwwxo7jYldH5Xxtg0QFzvQDXywEPgI3OpZd4 24 | +liEnNcXrddEKPF7xRJnIVGHLq6en4OI1qKvz+TDBS6x4HpTOIWEdKfZM1Hb8554 25 | Q1HX 26 | -----END CERTIFICATE----- 27 | -------------------------------------------------------------------------------- /mkcert/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDQIEdhnwi9Exow 3 | 7QTvCOXnA9ztRFKstHViSrhKmrfj95iiajK/vqBJhdXoRXwj80DyA7NGzBDbxzEt 4 | 96XgYXFMYHHR1p2qCD1sbfE92rwzdnG+aCp9Ej1lwrcsnOUHt8SMVG+W9IlR058v 5 | qNB3SWkYrAkrJnfNbw5PHnGwfP/ic73iGo7omSIJ3NB5oMcp+OPNNQM7AmER2+R2 6 | SSSt2eZeuR+1CC8xmKqeygzUfNWsWTQPe034c0gPJDLkcnNrtX0ekXpCeS83ttQV 7 | jNVH/1zPf49ZVDSZX75xzN0Oe3A/V8EgW3KjFB+3NBfzPld7BXjE+jc923BPNPxO 8 | TjDfZomRAgMBAAECggEAN2Mvu/IX4EGSKc0aEAcdL+KeS+Jv4hhQWO0rqGcOYzPE 9 | QgzjHpY7j/V3HM5JIEQfV4jWkBPEtMiI9QO/+DvWbA4KnF5yLQruVcnYdq6cgVGX 10 | KaYNEKXnAwrTtqK2bNxiCTp7TAAd/1HDPmq9t9Eoj/FQq1Qcc+aHN1URyncpnfjW 11 | Y/FcKIh3KCQRbHsr5F+hG0/AgZHF5q63R8RJ4mGd3ixSGpKwbLCwjyzBi4gPpsrM 12 | +hYeCm86+sOReiWd5G2Z577q8Uzp6KxzdDmCqw9oJeIqysueM2BMwGxYJFDbN+Qv 13 | 2QCqigD/jop7PdJsMOAsvhBcitDLPa/AigINMuA6AQKBgQDcL9y55Hw8jQ+K3fCr 14 | qCVhGCNLEkK6EsI3lJoPWlCz9AKN67iNwIBPgG+fVqQllfD7r/DuhFUV29KR8yh3 15 | 6a9JMNJSkaeu96JMpHYh75b9Bd2oZ8lwSdFsf9nNIxJ32S60PWfy9IDWlr7uzqXz 16 | pymk1m9cBcBnllqa2Bif5EhUsQKBgQDx+jn0olkNOg6yykgyLT5cGtlUNikIrBn7 17 | 7jXrytEwbHjFUpVSdB39F8maecHNVBAgOr3CRdlGyzqNHd1ohWwbkpz9NY3chcux 18 | 1jTSTsNcQrjGeejtN/YBB2/Nfd4jLLRZU7rVYJU6x0Xx0SBHeth44VwoEiSpe9nk 19 | nRyy2+Q64QKBgEkIryQRv4uuFluvZibp7QwZn4tFEVD66+TXq4owINivtTEx4NNT 20 | 6Lt2FJA7gtLcu0Qghb/3sOlBMsUqbF/p6TRTt0+f9Ii6puDZJD35ZJGkonM7ibtv 21 | IMHmXm4GlheeuDkcrSAPLbT/53D6plz9M3jzj5hsZ/d0DbWSvAg9BijhAoGACBb0 22 | fxA6Z+3L9gA7P6oxjoS7RUx2PLr8N2b0WIi0S6kktHwZT+Nf6Uk1TTvK1eF8lIdC 23 | Ns98/xfmQjeAYnErdxSEuRZkQr4aXDysEWfesiPs533F4sBfMhOckkMl/QkOknnx 24 | IhcThh6JYRc7vAgIWqo2GYTZwuzIEROLlRMy4yECgYAX9Lvz5UK32Cgk7paIaAtX 25 | 4hDZEXW59R9FfuXr2QUqm0HiSbXmMoee8MpayJu6SEhP7c7KzqGrxGTGoMrDOfJ8 26 | rmJ+aeh9a8t3ShRE7JJJPJ8Iq9IonOCq+lUzbZb9rkvxv/YuhVXe3vKi0Z4QvexO 27 | EMdFNMoOrVe7NoucQZ2Lbg== 28 | -----END PRIVATE KEY----- 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple_webrtc", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.18.2", 13 | "express-ws": "^5.0.2" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 简单的webrtc通信 9 | 10 | 11 | 12 |
13 |
14 |
15 | 房间号: 16 | 17 | 18 |
19 |
20 | 对方房间号 21 | 22 | 23 |
24 |
25 |
26 | 28 | 29 |
30 |
31 | 32 | 197 | 205 | 206 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.8: 6 | version "1.3.8" 7 | resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 8 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 9 | dependencies: 10 | mime-types "~2.1.34" 11 | negotiator "0.6.3" 12 | 13 | array-flatten@1.1.1: 14 | version "1.1.1" 15 | resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 16 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 17 | 18 | body-parser@1.20.1: 19 | version "1.20.1" 20 | resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 21 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 22 | dependencies: 23 | bytes "3.1.2" 24 | content-type "~1.0.4" 25 | debug "2.6.9" 26 | depd "2.0.0" 27 | destroy "1.2.0" 28 | http-errors "2.0.0" 29 | iconv-lite "0.4.24" 30 | on-finished "2.4.1" 31 | qs "6.11.0" 32 | raw-body "2.5.1" 33 | type-is "~1.6.18" 34 | unpipe "1.0.0" 35 | 36 | bytes@3.1.2: 37 | version "3.1.2" 38 | resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 39 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 40 | 41 | call-bind@^1.0.0: 42 | version "1.0.2" 43 | resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 44 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 45 | dependencies: 46 | function-bind "^1.1.1" 47 | get-intrinsic "^1.0.2" 48 | 49 | content-disposition@0.5.4: 50 | version "0.5.4" 51 | resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 52 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 53 | dependencies: 54 | safe-buffer "5.2.1" 55 | 56 | content-type@~1.0.4: 57 | version "1.0.5" 58 | resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 59 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 60 | 61 | cookie-signature@1.0.6: 62 | version "1.0.6" 63 | resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 64 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 65 | 66 | cookie@0.5.0: 67 | version "0.5.0" 68 | resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 69 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 70 | 71 | debug@2.6.9: 72 | version "2.6.9" 73 | resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 74 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 75 | dependencies: 76 | ms "2.0.0" 77 | 78 | depd@2.0.0: 79 | version "2.0.0" 80 | resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 81 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 82 | 83 | destroy@1.2.0: 84 | version "1.2.0" 85 | resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 86 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 87 | 88 | ee-first@1.1.1: 89 | version "1.1.1" 90 | resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 91 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 92 | 93 | encodeurl@~1.0.2: 94 | version "1.0.2" 95 | resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 96 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 97 | 98 | escape-html@~1.0.3: 99 | version "1.0.3" 100 | resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 101 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 102 | 103 | etag@~1.8.1: 104 | version "1.8.1" 105 | resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 106 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 107 | 108 | express-ws@^5.0.2: 109 | version "5.0.2" 110 | resolved "https://registry.npmjs.org/express-ws/-/express-ws-5.0.2.tgz#5b02d41b937d05199c6c266d7cc931c823bda8eb" 111 | integrity sha512-0uvmuk61O9HXgLhGl3QhNSEtRsQevtmbL94/eILaliEADZBHZOQUAiHFrGPrgsjikohyrmSG5g+sCfASTt0lkQ== 112 | dependencies: 113 | ws "^7.4.6" 114 | 115 | express@^4.18.2: 116 | version "4.18.2" 117 | resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 118 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 119 | dependencies: 120 | accepts "~1.3.8" 121 | array-flatten "1.1.1" 122 | body-parser "1.20.1" 123 | content-disposition "0.5.4" 124 | content-type "~1.0.4" 125 | cookie "0.5.0" 126 | cookie-signature "1.0.6" 127 | debug "2.6.9" 128 | depd "2.0.0" 129 | encodeurl "~1.0.2" 130 | escape-html "~1.0.3" 131 | etag "~1.8.1" 132 | finalhandler "1.2.0" 133 | fresh "0.5.2" 134 | http-errors "2.0.0" 135 | merge-descriptors "1.0.1" 136 | methods "~1.1.2" 137 | on-finished "2.4.1" 138 | parseurl "~1.3.3" 139 | path-to-regexp "0.1.7" 140 | proxy-addr "~2.0.7" 141 | qs "6.11.0" 142 | range-parser "~1.2.1" 143 | safe-buffer "5.2.1" 144 | send "0.18.0" 145 | serve-static "1.15.0" 146 | setprototypeof "1.2.0" 147 | statuses "2.0.1" 148 | type-is "~1.6.18" 149 | utils-merge "1.0.1" 150 | vary "~1.1.2" 151 | 152 | finalhandler@1.2.0: 153 | version "1.2.0" 154 | resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 155 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 156 | dependencies: 157 | debug "2.6.9" 158 | encodeurl "~1.0.2" 159 | escape-html "~1.0.3" 160 | on-finished "2.4.1" 161 | parseurl "~1.3.3" 162 | statuses "2.0.1" 163 | unpipe "~1.0.0" 164 | 165 | forwarded@0.2.0: 166 | version "0.2.0" 167 | resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 168 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 169 | 170 | fresh@0.5.2: 171 | version "0.5.2" 172 | resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 173 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 174 | 175 | function-bind@^1.1.1: 176 | version "1.1.1" 177 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 178 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 179 | 180 | get-intrinsic@^1.0.2: 181 | version "1.2.0" 182 | resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" 183 | integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== 184 | dependencies: 185 | function-bind "^1.1.1" 186 | has "^1.0.3" 187 | has-symbols "^1.0.3" 188 | 189 | has-symbols@^1.0.3: 190 | version "1.0.3" 191 | resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 192 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 193 | 194 | has@^1.0.3: 195 | version "1.0.3" 196 | resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 197 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 198 | dependencies: 199 | function-bind "^1.1.1" 200 | 201 | http-errors@2.0.0: 202 | version "2.0.0" 203 | resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 204 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 205 | dependencies: 206 | depd "2.0.0" 207 | inherits "2.0.4" 208 | setprototypeof "1.2.0" 209 | statuses "2.0.1" 210 | toidentifier "1.0.1" 211 | 212 | iconv-lite@0.4.24: 213 | version "0.4.24" 214 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 215 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 216 | dependencies: 217 | safer-buffer ">= 2.1.2 < 3" 218 | 219 | inherits@2.0.4: 220 | version "2.0.4" 221 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 222 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 223 | 224 | ipaddr.js@1.9.1: 225 | version "1.9.1" 226 | resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 227 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 228 | 229 | media-typer@0.3.0: 230 | version "0.3.0" 231 | resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 232 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 233 | 234 | merge-descriptors@1.0.1: 235 | version "1.0.1" 236 | resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 237 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 238 | 239 | methods@~1.1.2: 240 | version "1.1.2" 241 | resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 242 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 243 | 244 | mime-db@1.52.0: 245 | version "1.52.0" 246 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 247 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 248 | 249 | mime-types@~2.1.24, mime-types@~2.1.34: 250 | version "2.1.35" 251 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 252 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 253 | dependencies: 254 | mime-db "1.52.0" 255 | 256 | mime@1.6.0: 257 | version "1.6.0" 258 | resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 259 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 260 | 261 | ms@2.0.0: 262 | version "2.0.0" 263 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 264 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 265 | 266 | ms@2.1.3: 267 | version "2.1.3" 268 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 269 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 270 | 271 | negotiator@0.6.3: 272 | version "0.6.3" 273 | resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 274 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 275 | 276 | object-inspect@^1.9.0: 277 | version "1.12.3" 278 | resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 279 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 280 | 281 | on-finished@2.4.1: 282 | version "2.4.1" 283 | resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 284 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 285 | dependencies: 286 | ee-first "1.1.1" 287 | 288 | parseurl@~1.3.3: 289 | version "1.3.3" 290 | resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 291 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 292 | 293 | path-to-regexp@0.1.7: 294 | version "0.1.7" 295 | resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 296 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 297 | 298 | proxy-addr@~2.0.7: 299 | version "2.0.7" 300 | resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 301 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 302 | dependencies: 303 | forwarded "0.2.0" 304 | ipaddr.js "1.9.1" 305 | 306 | qs@6.11.0: 307 | version "6.11.0" 308 | resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 309 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 310 | dependencies: 311 | side-channel "^1.0.4" 312 | 313 | range-parser@~1.2.1: 314 | version "1.2.1" 315 | resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 316 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 317 | 318 | raw-body@2.5.1: 319 | version "2.5.1" 320 | resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 321 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 322 | dependencies: 323 | bytes "3.1.2" 324 | http-errors "2.0.0" 325 | iconv-lite "0.4.24" 326 | unpipe "1.0.0" 327 | 328 | safe-buffer@5.2.1: 329 | version "5.2.1" 330 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 331 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 332 | 333 | "safer-buffer@>= 2.1.2 < 3": 334 | version "2.1.2" 335 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 336 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 337 | 338 | send@0.18.0: 339 | version "0.18.0" 340 | resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 341 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 342 | dependencies: 343 | debug "2.6.9" 344 | depd "2.0.0" 345 | destroy "1.2.0" 346 | encodeurl "~1.0.2" 347 | escape-html "~1.0.3" 348 | etag "~1.8.1" 349 | fresh "0.5.2" 350 | http-errors "2.0.0" 351 | mime "1.6.0" 352 | ms "2.1.3" 353 | on-finished "2.4.1" 354 | range-parser "~1.2.1" 355 | statuses "2.0.1" 356 | 357 | serve-static@1.15.0: 358 | version "1.15.0" 359 | resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 360 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 361 | dependencies: 362 | encodeurl "~1.0.2" 363 | escape-html "~1.0.3" 364 | parseurl "~1.3.3" 365 | send "0.18.0" 366 | 367 | setprototypeof@1.2.0: 368 | version "1.2.0" 369 | resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 370 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 371 | 372 | side-channel@^1.0.4: 373 | version "1.0.4" 374 | resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 375 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 376 | dependencies: 377 | call-bind "^1.0.0" 378 | get-intrinsic "^1.0.2" 379 | object-inspect "^1.9.0" 380 | 381 | statuses@2.0.1: 382 | version "2.0.1" 383 | resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 384 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 385 | 386 | toidentifier@1.0.1: 387 | version "1.0.1" 388 | resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 389 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 390 | 391 | type-is@~1.6.18: 392 | version "1.6.18" 393 | resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 394 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 395 | dependencies: 396 | media-typer "0.3.0" 397 | mime-types "~2.1.24" 398 | 399 | unpipe@1.0.0, unpipe@~1.0.0: 400 | version "1.0.0" 401 | resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 402 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 403 | 404 | utils-merge@1.0.1: 405 | version "1.0.1" 406 | resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 407 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 408 | 409 | vary@~1.1.2: 410 | version "1.1.2" 411 | resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 412 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 413 | 414 | ws@^7.4.6: 415 | version "7.5.9" 416 | resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" 417 | integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== 418 | --------------------------------------------------------------------------------