├── .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 |
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 |
--------------------------------------------------------------------------------