├── .npmignore ├── .gitignore ├── tsconfig.json ├── package.json ├── README.md ├── index.ts ├── LICENSE └── yarn.lock /.npmignore: -------------------------------------------------------------------------------- 1 | index.ts 2 | tsconfig.json 3 | *.log 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | node_modules/ 3 | dist/ 4 | *.log 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "noImplicitAny": true, 4 | "removeComments": true, 5 | "preserveConstEnums": true, 6 | "declaration": true, 7 | "module": "commonjs", 8 | "target": "es2015", 9 | "outDir": "./dist" 10 | }, 11 | "files": [ 12 | "index.ts" 13 | ] 14 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "socket.io-prometheus-metrics", 3 | "version": "1.0.6", 4 | "description": "Prometheus metrics for socket.io", 5 | "author": "Jonas Tranberg ", 6 | "license": "Apache-2.0", 7 | "keywords": [ 8 | "prometheus", 9 | "socket.io", 10 | "metrics" 11 | ], 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/UNIwise/socket.io-prometheus-metrics.git" 15 | }, 16 | "bugs": { 17 | "url": "https://github.com/UNIwise/socket.io-prometheus-metrics/issues" 18 | }, 19 | "main": "./dist/index.js", 20 | "typings": "./dist/index.d.ts", 21 | "scripts": { 22 | "build": "tsc", 23 | "clean": "rm *.log ./dist ./node_modules -rf" 24 | }, 25 | "dependencies": { 26 | "express": "^4.16.4", 27 | "prom-client": "^11.2.1", 28 | "socket.io": "^2.2.0" 29 | }, 30 | "devDependencies": { 31 | "@types/express": "^4.16.1", 32 | "@types/node": "^10.12.21", 33 | "@types/socket.io": "^2.1.11", 34 | "typescript": "^3.3.1" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # socket.io-prometheus-metrics 2 | 3 | Exposes a metrics endpoint for prometheus to collect data about [`socket.io`](https://github.com/socketio/socket.io). 4 | 5 | ## Installation 6 | 7 | ```bash 8 | npm install socket.io-prometheus-metrics 9 | # or 10 | yarn add socket.io-prometheus-metrics 11 | ``` 12 | 13 | ## Usage 14 | 15 | Basic usage 16 | 17 | ```ts 18 | import * as http from 'http'; 19 | import * as io from 'socket.io'; 20 | import * as prometheus from 'socket.io-prometheus-metrics'; 21 | 22 | const server = http.createServer(); 23 | const io = io(server); 24 | 25 | prometheus.metrics(io); 26 | 27 | server.listen(3000); 28 | ``` 29 | Metrics is then available at `localhost:9090/metrics`. 30 | 31 | Prometheus default metrics can also be enabled by setting the `collectDefaultMetrics` option to `true` 32 | 33 | ```ts 34 | prometheus.metrics(io, { 35 | collectDefaultMetrics: true 36 | }); 37 | ``` 38 | 39 | If you wish to serve the metrics yourself the `createServer` options can be set to `false` and metrics can be collected from the register 40 | ```ts 41 | const ioMetrics = prometheus.metrics(io, { 42 | createServer: false 43 | }); 44 | 45 | const metrics = ioMetrics.register.metrics(); 46 | ``` 47 | 48 | ## Options 49 | 50 | | Option | Default | Description | 51 | | ------------------------- | --------------| ------------------------------------------------------------ | 52 | | `path` | "/metrics" | Metrics path | 53 | | `port` | 9090 | Metrics port | 54 | | `createServer` | true | Auto create http server | 55 | | `collectDefaultMetrics` | false | Collect prometheus default metrics | 56 | | `checkForNewNamespaces` | true | Collect metrics for namespaces that will be added at runtime | 57 | 58 | ## Socket.io metrics 59 | 60 | > all metrics have `socket_io_` prefix in their names. 61 | 62 | | Name | Help | Labels | 63 | | --------------------------------- | ---------------------------------------------| ------------------- | 64 | | `socket_io_connected` | Number of currently connected sockets | | 65 | | `socket_io_connect_total` | Total count of socket.io connection requests | `namespace` | 66 | | `socket_io_disconnect_total` | Total count of socket.io disconnections | `namespace` | 67 | | `socket_io_errors_total` | Total count of socket.io errors | `namespace` | 68 | | `socket_io_events_received_total` | Total count of socket.io received events | `event`, `namespace` | 69 | | `socket_io_events_sent_total` | Total count of socket.io sent events | `event`, `namespace` | 70 | | `socket_io_receive_bytes` | Total socket.io bytes received | `event`, `namespace` | 71 | | `socket_io_transmit_bytes` | Total socket.io bytes transmitted | `event`, `namespace` | 72 | 73 | ## Prometheus default metrics 74 | > available if `collectDefaultMetrics` is set to `true` 75 | 76 | More information [here](https://github.com/siimon/prom-client#default-metrics) and [here](https://prometheus.io/docs/instrumenting/writing_clientlibs/#standard-and-runtime-collectors). 77 | 78 | ## Namespaces support 79 | 80 | Default namespace has label value of `'/'`. 81 | 82 | By default library checks `io.nsps` variable for new namespaces to collect metrics from. This check occurs every 2 seconds. 83 | 84 | You can disable this functionality by providing `checkForNewNamespaces` option with `false` value. 85 | For example: 86 | 87 | ```ts 88 | prometheus.metrics(io, { 89 | checkForNewNamespaces: false 90 | }); 91 | ``` 92 | 93 | With this functionality disabled, library will only collect metrics from namespaces that 94 | were available at the moment of call to `prometheus.metrics(io, ...)`, 95 | default namespace is included. 96 | 97 | More information about socket.io namespaces [here](https://socket.io/docs/rooms-and-namespaces). 98 | 99 | ## License 100 | 101 | Licensed under the Apache 2.0 License. See the LICENSE file for details. -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | import * as http from 'http'; 2 | import * as express from 'express'; 3 | import * as io from 'socket.io'; 4 | import * as prom from 'prom-client'; 5 | 6 | export function metrics(ioServer: io.Server, options?: IMetricsOptions) { 7 | return new SocketIOMetrics(ioServer, options); 8 | } 9 | 10 | export interface IMetricsOptions { 11 | port?: number | string; 12 | path?: string; 13 | createServer?: boolean, 14 | collectDefaultMetrics?: boolean 15 | checkForNewNamespaces?: boolean 16 | } 17 | 18 | export interface IMetrics { 19 | connectedSockets: prom.Gauge; 20 | connectTotal: prom.Counter; 21 | disconnectTotal: prom.Counter; 22 | eventsReceivedTotal: prom.Counter; 23 | eventsSentTotal: prom.Counter; 24 | bytesReceived: prom.Counter; 25 | bytesTransmitted: prom.Counter; 26 | errorsTotal: prom.Counter; 27 | } 28 | 29 | export class SocketIOMetrics { 30 | public register: prom.Registry; 31 | public metrics: IMetrics; 32 | 33 | private ioServer: io.Server; 34 | private express: express.Express; 35 | private expressServer: http.Server; 36 | 37 | private options: IMetricsOptions; 38 | 39 | private boundNamespaces = new Set(); 40 | 41 | private defaultOptions: IMetricsOptions = { 42 | port: 9090, 43 | path: '/metrics', 44 | createServer: true, 45 | collectDefaultMetrics: false, 46 | checkForNewNamespaces: true 47 | }; 48 | 49 | constructor(ioServer: io.Server, options?: IMetricsOptions) { 50 | this.options = { ...this.defaultOptions, ...options }; 51 | this.ioServer = ioServer; 52 | this.register = prom.register; 53 | 54 | this.initMetrics(); 55 | this.bindMetrics(); 56 | 57 | if (this.options.collectDefaultMetrics) { 58 | prom.collectDefaultMetrics({ 59 | register: this.register 60 | }); 61 | } 62 | 63 | if (this.options.createServer) { 64 | this.start(); 65 | } 66 | } 67 | 68 | /* 69 | * Metrics Server 70 | */ 71 | 72 | public start() { 73 | if (!this.expressServer || !this.expressServer.listening) { 74 | this.initServer(); 75 | } 76 | } 77 | 78 | public async close() { 79 | return this.expressServer.close(); 80 | } 81 | 82 | private initServer() { 83 | this.express = express(); 84 | this.expressServer = this.express.listen(this.options.port); 85 | this.express.get(this.options.path, (req: express.Request, res: express.Response) => { 86 | res.set('Content-Type', this.register.contentType); 87 | res.end(this.register.metrics()); 88 | }); 89 | } 90 | 91 | /* 92 | * Metrics logic 93 | */ 94 | 95 | private initMetrics() { 96 | this.metrics = { 97 | connectedSockets: new prom.Gauge({ 98 | name: 'socket_io_connected', 99 | help: 'Number of currently connected sockets' 100 | }), 101 | 102 | connectTotal: new prom.Counter({ 103 | name: 'socket_io_connect_total', 104 | help: 'Total count of socket.io connection requests', 105 | labelNames: ['namespace'] 106 | }), 107 | 108 | disconnectTotal: new prom.Counter({ 109 | name: 'socket_io_disconnect_total', 110 | help: 'Total count of socket.io disconnections', 111 | labelNames: ['namespace'] 112 | }), 113 | 114 | eventsReceivedTotal: new prom.Counter({ 115 | name: 'socket_io_events_received_total', 116 | help: 'Total count of socket.io received events', 117 | labelNames: ['event', 'namespace'] 118 | }), 119 | 120 | eventsSentTotal: new prom.Counter({ 121 | name: 'socket_io_events_sent_total', 122 | help: 'Total count of socket.io sent events', 123 | labelNames: ['event', 'namespace'] 124 | }), 125 | 126 | bytesReceived: new prom.Counter({ 127 | name: 'socket_io_receive_bytes', 128 | help: 'Total socket.io bytes received', 129 | labelNames: ['event', 'namespace'] 130 | }), 131 | 132 | bytesTransmitted: new prom.Counter({ 133 | name: 'socket_io_transmit_bytes', 134 | help: 'Total socket.io bytes transmitted', 135 | labelNames: ['event', 'namespace'] 136 | }), 137 | 138 | errorsTotal: new prom.Counter({ 139 | name: 'socket_io_errors_total', 140 | help: 'Total socket.io errors', 141 | labelNames: ['namespace'] 142 | }) 143 | }; 144 | } 145 | 146 | private bindMetricsOnEmitter(server: NodeJS.EventEmitter, labels: prom.labelValues) { 147 | const blacklisted_events = new Set([ 148 | 'error', 149 | 'connect', 150 | 'disconnect', 151 | 'disconnecting', 152 | 'newListener', 153 | 'removeListener' 154 | ]); 155 | 156 | server.on('connect', (socket: any) => { 157 | // Connect events 158 | this.metrics.connectTotal.inc(labels); 159 | this.metrics.connectedSockets.set((this.ioServer.engine as any).clientsCount); 160 | 161 | // Disconnect events 162 | socket.on('disconnect', () => { 163 | this.metrics.disconnectTotal.inc(labels); 164 | this.metrics.connectedSockets.set((this.ioServer.engine as any).clientsCount); 165 | }); 166 | 167 | // Hook into emit (outgoing event) 168 | const org_emit = socket.emit; 169 | socket.emit = (event: string, ...data: any[]) => { 170 | if (!blacklisted_events.has(event)) { 171 | let labelsWithEvent = { event: event, ...labels }; 172 | this.metrics.bytesTransmitted.inc(labelsWithEvent, this.dataToBytes(data)); 173 | this.metrics.eventsSentTotal.inc(labelsWithEvent); 174 | } 175 | 176 | return org_emit.apply(socket, [event, ...data]); 177 | }; 178 | 179 | // Hook into onevent (incoming event) 180 | const org_onevent = socket.onevent; 181 | socket.onevent = (packet: any) => { 182 | if (packet && packet.data) { 183 | const [event, data] = packet.data; 184 | 185 | if (event === 'error') { 186 | this.metrics.connectedSockets.set((this.ioServer.engine as any).clientsCount); 187 | this.metrics.errorsTotal.inc(labels); 188 | } else if (!blacklisted_events.has(event)) { 189 | let labelsWithEvent = { event: event, ...labels }; 190 | this.metrics.bytesReceived.inc(labelsWithEvent, this.dataToBytes(data)); 191 | this.metrics.eventsReceivedTotal.inc(labelsWithEvent); 192 | } 193 | } 194 | 195 | return org_onevent.call(socket, packet); 196 | }; 197 | }); 198 | } 199 | 200 | private bindNamespaceMetrics(server: io.Server, namespace: string) { 201 | if (this.boundNamespaces.has(namespace)) { 202 | return; 203 | } 204 | const namespaceServer = server.of(namespace); 205 | this.bindMetricsOnEmitter(namespaceServer, { namespace: namespace }); 206 | this.boundNamespaces.add(namespace); 207 | } 208 | 209 | private bindMetrics() { 210 | Object.keys(this.ioServer.nsps).forEach((nsp) => 211 | this.bindNamespaceMetrics(this.ioServer, nsp) 212 | ); 213 | 214 | if (this.options.checkForNewNamespaces) { 215 | setInterval(() => { 216 | Object.keys(this.ioServer.nsps).forEach((nsp) => 217 | this.bindNamespaceMetrics(this.ioServer, nsp) 218 | ); 219 | }, 2000); 220 | } 221 | } 222 | 223 | /* 224 | * Helping methods 225 | */ 226 | 227 | private dataToBytes(data: any) { 228 | try { 229 | return Buffer.byteLength((typeof data === 'string') ? data : JSON.stringify(data) || '', 'utf8'); 230 | } catch (e) { 231 | return 0; 232 | } 233 | } 234 | } 235 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/body-parser@*": 6 | version "1.17.0" 7 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 8 | integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== 9 | dependencies: 10 | "@types/connect" "*" 11 | "@types/node" "*" 12 | 13 | "@types/connect@*": 14 | version "3.4.32" 15 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 16 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 17 | dependencies: 18 | "@types/node" "*" 19 | 20 | "@types/engine.io@*": 21 | version "3.1.4" 22 | resolved "https://registry.yarnpkg.com/@types/engine.io/-/engine.io-3.1.4.tgz#3d9472711d179daa7c95c051e50ad411e18a9bdc" 23 | integrity sha512-98rXVukLD6/ozrQ2O80NAlWDGA4INg+tqsEReWJldqyi2fulC9V7Use/n28SWgROXKm6003ycWV4gZHoF8GA6w== 24 | dependencies: 25 | "@types/node" "*" 26 | 27 | "@types/express-serve-static-core@*": 28 | version "4.16.1" 29 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz#35df7b302299a4ab138a643617bd44078e74d44e" 30 | integrity sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA== 31 | dependencies: 32 | "@types/node" "*" 33 | "@types/range-parser" "*" 34 | 35 | "@types/express@^4.16.1": 36 | version "4.16.1" 37 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" 38 | integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg== 39 | dependencies: 40 | "@types/body-parser" "*" 41 | "@types/express-serve-static-core" "*" 42 | "@types/serve-static" "*" 43 | 44 | "@types/mime@*": 45 | version "2.0.0" 46 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" 47 | integrity sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA== 48 | 49 | "@types/node@*", "@types/node@^10.12.21": 50 | version "10.12.21" 51 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" 52 | integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== 53 | 54 | "@types/range-parser@*": 55 | version "1.2.3" 56 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 57 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 58 | 59 | "@types/serve-static@*": 60 | version "1.13.2" 61 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 62 | integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== 63 | dependencies: 64 | "@types/express-serve-static-core" "*" 65 | "@types/mime" "*" 66 | 67 | "@types/socket.io@^2.1.11": 68 | version "2.1.11" 69 | resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-2.1.11.tgz#e0d6759880e5f9818d5297a3328b36641bae996b" 70 | integrity sha512-bVprmqPhJMLb9ZCm8g0Xy8kwBFRbnanOWSxzWkDkkIwxTvud5tKMfAJymXX6LQbizUKCS1yima7JM4BeLqjNqA== 71 | dependencies: 72 | "@types/engine.io" "*" 73 | "@types/node" "*" 74 | 75 | accepts@~1.3.4, accepts@~1.3.5: 76 | version "1.3.5" 77 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 78 | integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= 79 | dependencies: 80 | mime-types "~2.1.18" 81 | negotiator "0.6.1" 82 | 83 | after@0.8.2: 84 | version "0.8.2" 85 | resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" 86 | integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= 87 | 88 | array-flatten@1.1.1: 89 | version "1.1.1" 90 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 91 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 92 | 93 | arraybuffer.slice@~0.0.7: 94 | version "0.0.7" 95 | resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" 96 | integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== 97 | 98 | async-limiter@~1.0.0: 99 | version "1.0.0" 100 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 101 | integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== 102 | 103 | backo2@1.0.2: 104 | version "1.0.2" 105 | resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 106 | integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= 107 | 108 | base64-arraybuffer@0.1.5: 109 | version "0.1.5" 110 | resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" 111 | integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= 112 | 113 | base64id@1.0.0: 114 | version "1.0.0" 115 | resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" 116 | integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= 117 | 118 | better-assert@~1.0.0: 119 | version "1.0.2" 120 | resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" 121 | integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= 122 | dependencies: 123 | callsite "1.0.0" 124 | 125 | bintrees@1.0.1: 126 | version "1.0.1" 127 | resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" 128 | integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= 129 | 130 | blob@0.0.5: 131 | version "0.0.5" 132 | resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" 133 | integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== 134 | 135 | body-parser@1.18.3: 136 | version "1.18.3" 137 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 138 | integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= 139 | dependencies: 140 | bytes "3.0.0" 141 | content-type "~1.0.4" 142 | debug "2.6.9" 143 | depd "~1.1.2" 144 | http-errors "~1.6.3" 145 | iconv-lite "0.4.23" 146 | on-finished "~2.3.0" 147 | qs "6.5.2" 148 | raw-body "2.3.3" 149 | type-is "~1.6.16" 150 | 151 | bytes@3.0.0: 152 | version "3.0.0" 153 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 154 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 155 | 156 | callsite@1.0.0: 157 | version "1.0.0" 158 | resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" 159 | integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= 160 | 161 | component-bind@1.0.0: 162 | version "1.0.0" 163 | resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 164 | integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= 165 | 166 | component-emitter@1.2.1: 167 | version "1.2.1" 168 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 169 | integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= 170 | 171 | component-inherit@0.0.3: 172 | version "0.0.3" 173 | resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" 174 | integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= 175 | 176 | content-disposition@0.5.2: 177 | version "0.5.2" 178 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 179 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 180 | 181 | content-type@~1.0.4: 182 | version "1.0.4" 183 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 184 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 185 | 186 | cookie-signature@1.0.6: 187 | version "1.0.6" 188 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 189 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 190 | 191 | cookie@0.3.1: 192 | version "0.3.1" 193 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 194 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 195 | 196 | debug@2.6.9: 197 | version "2.6.9" 198 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 199 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 200 | dependencies: 201 | ms "2.0.0" 202 | 203 | debug@~3.1.0: 204 | version "3.1.0" 205 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 206 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 207 | dependencies: 208 | ms "2.0.0" 209 | 210 | debug@~4.1.0: 211 | version "4.1.1" 212 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 213 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 214 | dependencies: 215 | ms "^2.1.1" 216 | 217 | depd@~1.1.2: 218 | version "1.1.2" 219 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 220 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 221 | 222 | destroy@~1.0.4: 223 | version "1.0.4" 224 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 225 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 226 | 227 | ee-first@1.1.1: 228 | version "1.1.1" 229 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 230 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 231 | 232 | encodeurl@~1.0.2: 233 | version "1.0.2" 234 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 235 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 236 | 237 | engine.io-client@~3.3.1: 238 | version "3.3.2" 239 | resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" 240 | integrity sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ== 241 | dependencies: 242 | component-emitter "1.2.1" 243 | component-inherit "0.0.3" 244 | debug "~3.1.0" 245 | engine.io-parser "~2.1.1" 246 | has-cors "1.1.0" 247 | indexof "0.0.1" 248 | parseqs "0.0.5" 249 | parseuri "0.0.5" 250 | ws "~6.1.0" 251 | xmlhttprequest-ssl "~1.5.4" 252 | yeast "0.1.2" 253 | 254 | engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: 255 | version "2.1.3" 256 | resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" 257 | integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== 258 | dependencies: 259 | after "0.8.2" 260 | arraybuffer.slice "~0.0.7" 261 | base64-arraybuffer "0.1.5" 262 | blob "0.0.5" 263 | has-binary2 "~1.0.2" 264 | 265 | engine.io@~3.3.1: 266 | version "3.3.2" 267 | resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" 268 | integrity sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w== 269 | dependencies: 270 | accepts "~1.3.4" 271 | base64id "1.0.0" 272 | cookie "0.3.1" 273 | debug "~3.1.0" 274 | engine.io-parser "~2.1.0" 275 | ws "~6.1.0" 276 | 277 | escape-html@~1.0.3: 278 | version "1.0.3" 279 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 280 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 281 | 282 | etag@~1.8.1: 283 | version "1.8.1" 284 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 285 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 286 | 287 | express@^4.16.4: 288 | version "4.16.4" 289 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" 290 | integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== 291 | dependencies: 292 | accepts "~1.3.5" 293 | array-flatten "1.1.1" 294 | body-parser "1.18.3" 295 | content-disposition "0.5.2" 296 | content-type "~1.0.4" 297 | cookie "0.3.1" 298 | cookie-signature "1.0.6" 299 | debug "2.6.9" 300 | depd "~1.1.2" 301 | encodeurl "~1.0.2" 302 | escape-html "~1.0.3" 303 | etag "~1.8.1" 304 | finalhandler "1.1.1" 305 | fresh "0.5.2" 306 | merge-descriptors "1.0.1" 307 | methods "~1.1.2" 308 | on-finished "~2.3.0" 309 | parseurl "~1.3.2" 310 | path-to-regexp "0.1.7" 311 | proxy-addr "~2.0.4" 312 | qs "6.5.2" 313 | range-parser "~1.2.0" 314 | safe-buffer "5.1.2" 315 | send "0.16.2" 316 | serve-static "1.13.2" 317 | setprototypeof "1.1.0" 318 | statuses "~1.4.0" 319 | type-is "~1.6.16" 320 | utils-merge "1.0.1" 321 | vary "~1.1.2" 322 | 323 | finalhandler@1.1.1: 324 | version "1.1.1" 325 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 326 | integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== 327 | dependencies: 328 | debug "2.6.9" 329 | encodeurl "~1.0.2" 330 | escape-html "~1.0.3" 331 | on-finished "~2.3.0" 332 | parseurl "~1.3.2" 333 | statuses "~1.4.0" 334 | unpipe "~1.0.0" 335 | 336 | forwarded@~0.1.2: 337 | version "0.1.2" 338 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 339 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 340 | 341 | fresh@0.5.2: 342 | version "0.5.2" 343 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 344 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 345 | 346 | has-binary2@~1.0.2: 347 | version "1.0.3" 348 | resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" 349 | integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== 350 | dependencies: 351 | isarray "2.0.1" 352 | 353 | has-cors@1.1.0: 354 | version "1.1.0" 355 | resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" 356 | integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= 357 | 358 | http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 359 | version "1.6.3" 360 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 361 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 362 | dependencies: 363 | depd "~1.1.2" 364 | inherits "2.0.3" 365 | setprototypeof "1.1.0" 366 | statuses ">= 1.4.0 < 2" 367 | 368 | iconv-lite@0.4.23: 369 | version "0.4.23" 370 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 371 | integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== 372 | dependencies: 373 | safer-buffer ">= 2.1.2 < 3" 374 | 375 | indexof@0.0.1: 376 | version "0.0.1" 377 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 378 | integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= 379 | 380 | inherits@2.0.3: 381 | version "2.0.3" 382 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 383 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 384 | 385 | ipaddr.js@1.8.0: 386 | version "1.8.0" 387 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" 388 | integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= 389 | 390 | isarray@2.0.1: 391 | version "2.0.1" 392 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" 393 | integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= 394 | 395 | media-typer@0.3.0: 396 | version "0.3.0" 397 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 398 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 399 | 400 | merge-descriptors@1.0.1: 401 | version "1.0.1" 402 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 403 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 404 | 405 | methods@~1.1.2: 406 | version "1.1.2" 407 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 408 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 409 | 410 | mime-db@~1.37.0: 411 | version "1.37.0" 412 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 413 | integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== 414 | 415 | mime-types@~2.1.18: 416 | version "2.1.21" 417 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 418 | integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== 419 | dependencies: 420 | mime-db "~1.37.0" 421 | 422 | mime@1.4.1: 423 | version "1.4.1" 424 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 425 | integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== 426 | 427 | ms@2.0.0: 428 | version "2.0.0" 429 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 430 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 431 | 432 | ms@^2.1.1: 433 | version "2.1.1" 434 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 435 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 436 | 437 | negotiator@0.6.1: 438 | version "0.6.1" 439 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 440 | integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 441 | 442 | object-component@0.0.3: 443 | version "0.0.3" 444 | resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" 445 | integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= 446 | 447 | on-finished@~2.3.0: 448 | version "2.3.0" 449 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 450 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 451 | dependencies: 452 | ee-first "1.1.1" 453 | 454 | parseqs@0.0.5: 455 | version "0.0.5" 456 | resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" 457 | integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= 458 | dependencies: 459 | better-assert "~1.0.0" 460 | 461 | parseuri@0.0.5: 462 | version "0.0.5" 463 | resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" 464 | integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= 465 | dependencies: 466 | better-assert "~1.0.0" 467 | 468 | parseurl@~1.3.2: 469 | version "1.3.2" 470 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 471 | integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= 472 | 473 | path-to-regexp@0.1.7: 474 | version "0.1.7" 475 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 476 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 477 | 478 | prom-client@^11.2.1: 479 | version "11.2.1" 480 | resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-11.2.1.tgz#486e7817de9b1d43c0a12aee26fc68830f4d1b16" 481 | integrity sha512-7VwtjrkQS50NvDoeYNn2z6wzXB5BMGzUlmMOeLPaITtJsTVXnPywRta7QFiV4pKr0fbRx9oDfUcx1xibabjSAg== 482 | dependencies: 483 | tdigest "^0.1.1" 484 | 485 | proxy-addr@~2.0.4: 486 | version "2.0.4" 487 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" 488 | integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== 489 | dependencies: 490 | forwarded "~0.1.2" 491 | ipaddr.js "1.8.0" 492 | 493 | qs@6.5.2: 494 | version "6.5.2" 495 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 496 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 497 | 498 | range-parser@~1.2.0: 499 | version "1.2.0" 500 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 501 | integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= 502 | 503 | raw-body@2.3.3: 504 | version "2.3.3" 505 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 506 | integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== 507 | dependencies: 508 | bytes "3.0.0" 509 | http-errors "1.6.3" 510 | iconv-lite "0.4.23" 511 | unpipe "1.0.0" 512 | 513 | safe-buffer@5.1.2: 514 | version "5.1.2" 515 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 516 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 517 | 518 | "safer-buffer@>= 2.1.2 < 3": 519 | version "2.1.2" 520 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 521 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 522 | 523 | send@0.16.2: 524 | version "0.16.2" 525 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 526 | integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== 527 | dependencies: 528 | debug "2.6.9" 529 | depd "~1.1.2" 530 | destroy "~1.0.4" 531 | encodeurl "~1.0.2" 532 | escape-html "~1.0.3" 533 | etag "~1.8.1" 534 | fresh "0.5.2" 535 | http-errors "~1.6.2" 536 | mime "1.4.1" 537 | ms "2.0.0" 538 | on-finished "~2.3.0" 539 | range-parser "~1.2.0" 540 | statuses "~1.4.0" 541 | 542 | serve-static@1.13.2: 543 | version "1.13.2" 544 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 545 | integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== 546 | dependencies: 547 | encodeurl "~1.0.2" 548 | escape-html "~1.0.3" 549 | parseurl "~1.3.2" 550 | send "0.16.2" 551 | 552 | setprototypeof@1.1.0: 553 | version "1.1.0" 554 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 555 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 556 | 557 | socket.io-adapter@~1.1.0: 558 | version "1.1.1" 559 | resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" 560 | integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= 561 | 562 | socket.io-client@2.2.0: 563 | version "2.2.0" 564 | resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" 565 | integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== 566 | dependencies: 567 | backo2 "1.0.2" 568 | base64-arraybuffer "0.1.5" 569 | component-bind "1.0.0" 570 | component-emitter "1.2.1" 571 | debug "~3.1.0" 572 | engine.io-client "~3.3.1" 573 | has-binary2 "~1.0.2" 574 | has-cors "1.1.0" 575 | indexof "0.0.1" 576 | object-component "0.0.3" 577 | parseqs "0.0.5" 578 | parseuri "0.0.5" 579 | socket.io-parser "~3.3.0" 580 | to-array "0.1.4" 581 | 582 | socket.io-parser@~3.3.0: 583 | version "3.3.0" 584 | resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" 585 | integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== 586 | dependencies: 587 | component-emitter "1.2.1" 588 | debug "~3.1.0" 589 | isarray "2.0.1" 590 | 591 | socket.io@^2.2.0: 592 | version "2.2.0" 593 | resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" 594 | integrity sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w== 595 | dependencies: 596 | debug "~4.1.0" 597 | engine.io "~3.3.1" 598 | has-binary2 "~1.0.2" 599 | socket.io-adapter "~1.1.0" 600 | socket.io-client "2.2.0" 601 | socket.io-parser "~3.3.0" 602 | 603 | "statuses@>= 1.4.0 < 2": 604 | version "1.5.0" 605 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 606 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 607 | 608 | statuses@~1.4.0: 609 | version "1.4.0" 610 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 611 | integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== 612 | 613 | tdigest@^0.1.1: 614 | version "0.1.1" 615 | resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021" 616 | integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE= 617 | dependencies: 618 | bintrees "1.0.1" 619 | 620 | to-array@0.1.4: 621 | version "0.1.4" 622 | resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" 623 | integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= 624 | 625 | type-is@~1.6.16: 626 | version "1.6.16" 627 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 628 | integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== 629 | dependencies: 630 | media-typer "0.3.0" 631 | mime-types "~2.1.18" 632 | 633 | typescript@^3.3.1: 634 | version "3.3.1" 635 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.1.tgz#6de14e1db4b8a006ac535e482c8ba018c55f750b" 636 | integrity sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA== 637 | 638 | unpipe@1.0.0, unpipe@~1.0.0: 639 | version "1.0.0" 640 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 641 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 642 | 643 | utils-merge@1.0.1: 644 | version "1.0.1" 645 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 646 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 647 | 648 | vary@~1.1.2: 649 | version "1.1.2" 650 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 651 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 652 | 653 | ws@~6.1.0: 654 | version "6.1.3" 655 | resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.3.tgz#d2d2e5f0e3c700ef2de89080ebc0ac6e1bf3a72d" 656 | integrity sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg== 657 | dependencies: 658 | async-limiter "~1.0.0" 659 | 660 | xmlhttprequest-ssl@~1.5.4: 661 | version "1.5.5" 662 | resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" 663 | integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= 664 | 665 | yeast@0.1.2: 666 | version "0.1.2" 667 | resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 668 | integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= 669 | --------------------------------------------------------------------------------