6 changed files with 673 additions and 1 deletions
-
80.gitignore
-
11Dockerfile
-
114README.md
-
65index.js
-
384package-lock.json
-
20package.json
@ -0,0 +1,80 @@ |
|||
# Logs |
|||
logs |
|||
*.log |
|||
npm-debug.log* |
|||
yarn-debug.log* |
|||
yarn-error.log* |
|||
|
|||
# Runtime data |
|||
pids |
|||
*.pid |
|||
*.seed |
|||
*.pid.lock |
|||
|
|||
# Directory for instrumented libs generated by jscoverage/JSCover |
|||
lib-cov |
|||
|
|||
# Coverage directory used by tools like istanbul |
|||
coverage |
|||
|
|||
# nyc test coverage |
|||
.nyc_output |
|||
|
|||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) |
|||
.grunt |
|||
|
|||
# Bower dependency directory (https://bower.io/) |
|||
bower_components |
|||
|
|||
# node-waf configuration |
|||
.lock-wscript |
|||
|
|||
# Compiled binary addons (https://nodejs.org/api/addons.html) |
|||
build/Release |
|||
|
|||
# Dependency directories |
|||
node_modules/ |
|||
jspm_packages/ |
|||
|
|||
# TypeScript v1 declaration files |
|||
typings/ |
|||
|
|||
# Optional npm cache directory |
|||
.npm |
|||
|
|||
# Optional eslint cache |
|||
.eslintcache |
|||
|
|||
# Optional REPL history |
|||
.node_repl_history |
|||
|
|||
# Output of 'npm pack' |
|||
*.tgz |
|||
|
|||
# Yarn Integrity file |
|||
.yarn-integrity |
|||
|
|||
# dotenv environment variables file |
|||
.env |
|||
.env.test |
|||
|
|||
# parcel-bundler cache (https://parceljs.org/) |
|||
.cache |
|||
|
|||
# next.js build output |
|||
.next |
|||
|
|||
# nuxt.js build output |
|||
.nuxt |
|||
|
|||
# vuepress build output |
|||
.vuepress/dist |
|||
|
|||
# Serverless directories |
|||
.serverless/ |
|||
|
|||
# FuseBox cache |
|||
.fusebox/ |
|||
|
|||
# DynamoDB Local files |
|||
.dynamodb/ |
@ -0,0 +1,11 @@ |
|||
FROM node:8.15.0-jessie-slim |
|||
ENV PORT 1937 |
|||
|
|||
WORKDIR /app |
|||
ADD . /app |
|||
|
|||
RUN npm install |
|||
|
|||
EXPOSE $PORT |
|||
|
|||
CMD ["node", "index.js"] |
@ -1,3 +1,115 @@ |
|||
# backend-signal |
|||
|
|||
Beep backend handling WebRTC signalling. |
|||
Beep backend handling WebRTC signaling. |
|||
|
|||
## Quickstart |
|||
|
|||
Docker: |
|||
|
|||
```bash |
|||
export PORT=1837 # Or whatever port number you like |
|||
docker build -t backend-signal . && docker run -it backend-signal |
|||
``` |
|||
|
|||
Not hipster (requires node.js): |
|||
|
|||
```bash |
|||
export PORT=1837 # Or whatever port number you like |
|||
npm install |
|||
node index.js |
|||
``` |
|||
|
|||
## API |
|||
|
|||
Unless otherwise noted, bodies and responses are with ```Content-Type: application/json```. |
|||
|
|||
| Contents | |
|||
| -------- | |
|||
| [Subscribe to SSE](#Subscribe-to-SSE) | |
|||
| [Get a user's devices](#Get-a-user's-devices) | |
|||
| [Post data to a user's device](#Post-data-to-a-user's-device) | |
|||
|
|||
### Subscribe to SSE |
|||
|
|||
``` |
|||
GET /subscribe/:user/device/:device |
|||
``` |
|||
|
|||
Subscribe a user's device to the signaling service. Recommended usage: |
|||
|
|||
```js |
|||
const es = new EventSource(`${host}/subscribe/${user}/device/${device}`); |
|||
es.onmessage = (e) => { |
|||
const data = e.data; |
|||
// Do whatever with data |
|||
}; |
|||
``` |
|||
|
|||
#### URL Params |
|||
|
|||
| Name | Type | Description | Required | |
|||
| ---- | ---- | ----------- | -------- | |
|||
| user | String | User's ID. | ✓ | |
|||
| device | String | Device's ID. Must be unique to the device. I suggest something based on MAC address. | ✓ | |
|||
|
|||
#### Success Response (200 OK) |
|||
|
|||
An [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) stream. |
|||
|
|||
--- |
|||
|
|||
### Get a user's devices |
|||
|
|||
``` |
|||
GET /user/:user/devices |
|||
``` |
|||
|
|||
Get a list of device IDs associated with the specified user. One can then use the IDs to post data to individual devices. |
|||
|
|||
#### URL Params |
|||
|
|||
| Name | Type | Description | Required | |
|||
| ---- | ---- | ----------- | -------- | |
|||
| user | String | Target user's ID. | ✓ | |
|||
|
|||
#### Success Response (200 OK) |
|||
|
|||
List of device IDs. Can be an empty list. |
|||
|
|||
``` |
|||
[ <id>, <id2>, ... ] |
|||
``` |
|||
|
|||
--- |
|||
|
|||
### Post data to a user's device |
|||
|
|||
``` |
|||
POST /user/:user/device/:device |
|||
``` |
|||
|
|||
Post data to the specified device of the specified user. |
|||
|
|||
#### URL Params |
|||
|
|||
| Name | Type | Description | Required | |
|||
| ---- | ---- | ----------- | -------- | |
|||
| user | String | Target user's ID. | ✓ | |
|||
| device | String | Target device's ID. | ✓ | |
|||
|
|||
#### Body |
|||
|
|||
| Name | Type | Description | Required | |
|||
| ---- | ---- | ----------- | -------- | |
|||
| data | String | Data to be sent. | ✓ | |
|||
|
|||
#### Success Response (200 OK) |
|||
|
|||
Empty body. |
|||
|
|||
#### Errors |
|||
|
|||
| Code | Description | |
|||
| ---- | ----------- | |
|||
| 400 | No data to be sent was supplied. | |
|||
| 404 | The specified user/device's connection could not be found. | |
@ -0,0 +1,65 @@ |
|||
require('dotenv').config(); |
|||
const express = require('express'); |
|||
const bodyParser = require('body-parser'); |
|||
|
|||
let app = express(); |
|||
app.use(bodyParser.json()); |
|||
app.use(bodyParser.urlencoded({ extended: true })); |
|||
|
|||
// CORS
|
|||
app.use((req, res, next) => { |
|||
res.set('Access-Control-Allow-Origin', '*'); |
|||
next(); |
|||
}); |
|||
|
|||
let connections = {}; |
|||
|
|||
app.get('/subscribe/:user/device/:device', (req, res) => { |
|||
if (!connections[req.params.user]) { |
|||
connections[req.params.user] = {}; |
|||
} |
|||
|
|||
connections[req.params.user][req.params.device] = res; |
|||
res.writeHead(200, { |
|||
'Content-Type': 'text/event-stream', |
|||
'Cache-Control': 'no-cache' |
|||
}); |
|||
|
|||
// So the connection doesn't timeout and die
|
|||
let timeoutID = 0; |
|||
const refresh = () => { |
|||
res.write(':\n\n'); |
|||
timeoutID = setTimeout(refresh, 25000); |
|||
}; |
|||
refresh(); |
|||
|
|||
res.on('close', () => { |
|||
connections[req.params.user][req.params.device] = null; |
|||
clearTimeout(timeoutID); |
|||
}); |
|||
}); |
|||
|
|||
app.get('/user/:user/devices', (req, res) => { |
|||
if (!connections[req.params.user]) { |
|||
res.status(200).json([]); |
|||
} else { |
|||
res.status(200).json(Object.keys(connections[req.params.user])); |
|||
} |
|||
}); |
|||
|
|||
app.post('/user/:user/device/:device', (req, res) => { |
|||
if(!connections[req.params.user]){ |
|||
res.sendStatus(404); |
|||
} else if (!connections[req.params.user][req.params.device]){ |
|||
res.sendStatus(404); |
|||
} else if (!req.body.data) { |
|||
res.sendStatus(400); |
|||
} else { |
|||
connections[req.params.user][req.params.device].write(`data: ${req.body.data}\n\n`); |
|||
res.sendStatus(200); |
|||
} |
|||
}); |
|||
|
|||
app.listen(process.env.PORT, (err) => { |
|||
err ? console.error(err) : console.log(`Listening on port ${process.env.PORT}`); |
|||
}); |
@ -0,0 +1,384 @@ |
|||
{ |
|||
"name": "backend-signal", |
|||
"version": "1.0.0", |
|||
"lockfileVersion": 1, |
|||
"requires": true, |
|||
"dependencies": { |
|||
"accepts": { |
|||
"version": "1.3.5", |
|||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", |
|||
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", |
|||
"requires": { |
|||
"mime-types": "~2.1.18", |
|||
"negotiator": "0.6.1" |
|||
} |
|||
}, |
|||
"array-flatten": { |
|||
"version": "1.1.1", |
|||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", |
|||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" |
|||
}, |
|||
"body-parser": { |
|||
"version": "1.18.3", |
|||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", |
|||
"integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", |
|||
"requires": { |
|||
"bytes": "3.0.0", |
|||
"content-type": "~1.0.4", |
|||
"debug": "2.6.9", |
|||
"depd": "~1.1.2", |
|||
"http-errors": "~1.6.3", |
|||
"iconv-lite": "0.4.23", |
|||
"on-finished": "~2.3.0", |
|||
"qs": "6.5.2", |
|||
"raw-body": "2.3.3", |
|||
"type-is": "~1.6.16" |
|||
} |
|||
}, |
|||
"bytes": { |
|||
"version": "3.0.0", |
|||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", |
|||
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" |
|||
}, |
|||
"content-disposition": { |
|||
"version": "0.5.2", |
|||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", |
|||
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" |
|||
}, |
|||
"content-type": { |
|||
"version": "1.0.4", |
|||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", |
|||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" |
|||
}, |
|||
"cookie": { |
|||
"version": "0.3.1", |
|||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", |
|||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" |
|||
}, |
|||
"cookie-signature": { |
|||
"version": "1.0.6", |
|||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", |
|||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" |
|||
}, |
|||
"debug": { |
|||
"version": "2.6.9", |
|||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", |
|||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", |
|||
"requires": { |
|||
"ms": "2.0.0" |
|||
} |
|||
}, |
|||
"depd": { |
|||
"version": "1.1.2", |
|||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", |
|||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" |
|||
}, |
|||
"destroy": { |
|||
"version": "1.0.4", |
|||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", |
|||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" |
|||
}, |
|||
"dotenv": { |
|||
"version": "6.2.0", |
|||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", |
|||
"integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" |
|||
}, |
|||
"ee-first": { |
|||
"version": "1.1.1", |
|||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", |
|||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" |
|||
}, |
|||
"encodeurl": { |
|||
"version": "1.0.2", |
|||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", |
|||
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" |
|||
}, |
|||
"escape-html": { |
|||
"version": "1.0.3", |
|||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", |
|||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" |
|||
}, |
|||
"etag": { |
|||
"version": "1.8.1", |
|||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", |
|||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" |
|||
}, |
|||
"express": { |
|||
"version": "4.16.4", |
|||
"resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", |
|||
"integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", |
|||
"requires": { |
|||
"accepts": "~1.3.5", |
|||
"array-flatten": "1.1.1", |
|||
"body-parser": "1.18.3", |
|||
"content-disposition": "0.5.2", |
|||
"content-type": "~1.0.4", |
|||
"cookie": "0.3.1", |
|||
"cookie-signature": "1.0.6", |
|||
"debug": "2.6.9", |
|||
"depd": "~1.1.2", |
|||
"encodeurl": "~1.0.2", |
|||
"escape-html": "~1.0.3", |
|||
"etag": "~1.8.1", |
|||
"finalhandler": "1.1.1", |
|||
"fresh": "0.5.2", |
|||
"merge-descriptors": "1.0.1", |
|||
"methods": "~1.1.2", |
|||
"on-finished": "~2.3.0", |
|||
"parseurl": "~1.3.2", |
|||
"path-to-regexp": "0.1.7", |
|||
"proxy-addr": "~2.0.4", |
|||
"qs": "6.5.2", |
|||
"range-parser": "~1.2.0", |
|||
"safe-buffer": "5.1.2", |
|||
"send": "0.16.2", |
|||
"serve-static": "1.13.2", |
|||
"setprototypeof": "1.1.0", |
|||
"statuses": "~1.4.0", |
|||
"type-is": "~1.6.16", |
|||
"utils-merge": "1.0.1", |
|||
"vary": "~1.1.2" |
|||
}, |
|||
"dependencies": { |
|||
"statuses": { |
|||
"version": "1.4.0", |
|||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", |
|||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" |
|||
} |
|||
} |
|||
}, |
|||
"finalhandler": { |
|||
"version": "1.1.1", |
|||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", |
|||
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", |
|||
"requires": { |
|||
"debug": "2.6.9", |
|||
"encodeurl": "~1.0.2", |
|||
"escape-html": "~1.0.3", |
|||
"on-finished": "~2.3.0", |
|||
"parseurl": "~1.3.2", |
|||
"statuses": "~1.4.0", |
|||
"unpipe": "~1.0.0" |
|||
}, |
|||
"dependencies": { |
|||
"statuses": { |
|||
"version": "1.4.0", |
|||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", |
|||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" |
|||
} |
|||
} |
|||
}, |
|||
"forwarded": { |
|||
"version": "0.1.2", |
|||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", |
|||
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" |
|||
}, |
|||
"fresh": { |
|||
"version": "0.5.2", |
|||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", |
|||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" |
|||
}, |
|||
"http-errors": { |
|||
"version": "1.6.3", |
|||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", |
|||
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", |
|||
"requires": { |
|||
"depd": "~1.1.2", |
|||
"inherits": "2.0.3", |
|||
"setprototypeof": "1.1.0", |
|||
"statuses": ">= 1.4.0 < 2" |
|||
} |
|||
}, |
|||
"iconv-lite": { |
|||
"version": "0.4.23", |
|||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", |
|||
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", |
|||
"requires": { |
|||
"safer-buffer": ">= 2.1.2 < 3" |
|||
} |
|||
}, |
|||
"inherits": { |
|||
"version": "2.0.3", |
|||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", |
|||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" |
|||
}, |
|||
"ipaddr.js": { |
|||
"version": "1.8.0", |
|||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", |
|||
"integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" |
|||
}, |
|||
"media-typer": { |
|||
"version": "0.3.0", |
|||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", |
|||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" |
|||
}, |
|||
"merge-descriptors": { |
|||
"version": "1.0.1", |
|||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", |
|||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" |
|||
}, |
|||
"methods": { |
|||
"version": "1.1.2", |
|||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", |
|||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" |
|||
}, |
|||
"mime": { |
|||
"version": "1.4.1", |
|||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", |
|||
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" |
|||
}, |
|||
"mime-db": { |
|||
"version": "1.37.0", |
|||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", |
|||
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" |
|||
}, |
|||
"mime-types": { |
|||
"version": "2.1.21", |
|||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", |
|||
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", |
|||
"requires": { |
|||
"mime-db": "~1.37.0" |
|||
} |
|||
}, |
|||
"ms": { |
|||
"version": "2.0.0", |
|||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |
|||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" |
|||
}, |
|||
"negotiator": { |
|||
"version": "0.6.1", |
|||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", |
|||
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" |
|||
}, |
|||
"on-finished": { |
|||
"version": "2.3.0", |
|||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", |
|||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", |
|||
"requires": { |
|||
"ee-first": "1.1.1" |
|||
} |
|||
}, |
|||
"parseurl": { |
|||
"version": "1.3.2", |
|||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", |
|||
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" |
|||
}, |
|||
"path-to-regexp": { |
|||
"version": "0.1.7", |
|||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", |
|||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" |
|||
}, |
|||
"proxy-addr": { |
|||
"version": "2.0.4", |
|||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", |
|||
"integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", |
|||
"requires": { |
|||
"forwarded": "~0.1.2", |
|||
"ipaddr.js": "1.8.0" |
|||
} |
|||
}, |
|||
"qs": { |
|||
"version": "6.5.2", |
|||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", |
|||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" |
|||
}, |
|||
"range-parser": { |
|||
"version": "1.2.0", |
|||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", |
|||
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" |
|||
}, |
|||
"raw-body": { |
|||
"version": "2.3.3", |
|||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", |
|||
"integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", |
|||
"requires": { |
|||
"bytes": "3.0.0", |
|||
"http-errors": "1.6.3", |
|||
"iconv-lite": "0.4.23", |
|||
"unpipe": "1.0.0" |
|||
} |
|||
}, |
|||
"safe-buffer": { |
|||
"version": "5.1.2", |
|||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |
|||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |
|||
}, |
|||
"safer-buffer": { |
|||
"version": "2.1.2", |
|||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
|||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |
|||
}, |
|||
"send": { |
|||
"version": "0.16.2", |
|||
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", |
|||
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", |
|||
"requires": { |
|||
"debug": "2.6.9", |
|||
"depd": "~1.1.2", |
|||
"destroy": "~1.0.4", |
|||
"encodeurl": "~1.0.2", |
|||
"escape-html": "~1.0.3", |
|||
"etag": "~1.8.1", |
|||
"fresh": "0.5.2", |
|||
"http-errors": "~1.6.2", |
|||
"mime": "1.4.1", |
|||
"ms": "2.0.0", |
|||
"on-finished": "~2.3.0", |
|||
"range-parser": "~1.2.0", |
|||
"statuses": "~1.4.0" |
|||
}, |
|||
"dependencies": { |
|||
"statuses": { |
|||
"version": "1.4.0", |
|||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", |
|||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" |
|||
} |
|||
} |
|||
}, |
|||
"serve-static": { |
|||
"version": "1.13.2", |
|||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", |
|||
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", |
|||
"requires": { |
|||
"encodeurl": "~1.0.2", |
|||
"escape-html": "~1.0.3", |
|||
"parseurl": "~1.3.2", |
|||
"send": "0.16.2" |
|||
} |
|||
}, |
|||
"setprototypeof": { |
|||
"version": "1.1.0", |
|||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", |
|||
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" |
|||
}, |
|||
"statuses": { |
|||
"version": "1.5.0", |
|||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", |
|||
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" |
|||
}, |
|||
"type-is": { |
|||
"version": "1.6.16", |
|||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", |
|||
"integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", |
|||
"requires": { |
|||
"media-typer": "0.3.0", |
|||
"mime-types": "~2.1.18" |
|||
} |
|||
}, |
|||
"unpipe": { |
|||
"version": "1.0.0", |
|||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", |
|||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" |
|||
}, |
|||
"utils-merge": { |
|||
"version": "1.0.1", |
|||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", |
|||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" |
|||
}, |
|||
"vary": { |
|||
"version": "1.1.2", |
|||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", |
|||
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
{ |
|||
"name": "backend-signal", |
|||
"version": "1.0.0", |
|||
"description": "Beep backend handling WebRTC signalling", |
|||
"main": "index.js", |
|||
"scripts": { |
|||
"test": "echo \"Error: no test specified\" && exit 1" |
|||
}, |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "git@makerforce.io:beep/backend-signal.git" |
|||
}, |
|||
"author": "Daniel Lim Hai", |
|||
"license": "ISC", |
|||
"dependencies": { |
|||
"body-parser": "^1.18.3", |
|||
"dotenv": "^6.2.0", |
|||
"express": "^4.16.4" |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue