diff --git a/README.md b/README.md
index 6af25eb..3f42aee 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
BroadLink Bridge
An HTTP REST Bridge for Interacting with BroadLink IR Devices
-
+
@@ -51,8 +51,8 @@ Run the CLI command to start the server:
- Use a GET/POST request without headers or a body to trigger IR commands (you know, to bookmark a URL to quickly turn on the TV)
- Multiple authentication options (bearer token and query string token)
- JSON formatted database file powered by [Lowdb](https://github.com/typicode/lowdb/blob/master/README.md) and [Lodash](https://lodash.com) enabling effortless modification, backup and sharing opportunities
-- An accompanying [SmartThings](https://docs.smartthings.com/en/latest/device-type-developers-guide/quick-start.html) Device Handler example (Well, It's Coming Soon...)
-- And a free "quick start" Postman Collection and example database!
+- An accompanying [SmartThings](https://docs.smartthings.com/en/latest/device-type-developers-guide/quick-start.html) sample [Device Handler](https://github.com/401unauthorized/broadlink-bridge/blob/master/resources/smartthings_device_handler.groovy)
+- And a free "quick start" [Postman Collection](https://github.com/401unauthorized/broadlink-bridge/blob/master/config) and example database!
## 👓 Transparency
@@ -202,7 +202,7 @@ A BroadLink IR Blaster
{
"id": "pMtEfSYMmg",
"name": "Basement Blaster",
- "type": "RM Mini3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF",
@@ -215,7 +215,7 @@ A BroadLink IR Blaster
**name:** A user entered blaster name
-**type:** A user entered blaster type (not used)
+**type:** A user entered [blaster identifier](https://github.com/401Unauthorized/broadlinkjs-rm/blob/master/index.js#L8)
**address:** LAN IP address for the blaster
@@ -277,7 +277,7 @@ IR Codes & Metadata
{
"id": "pMtEfSYMmg",
"name": "Basement Blaster",
- "type": "RM Mini3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF",
@@ -350,7 +350,7 @@ IR Codes & Metadata
```JSON
{
- "version": "1.0.0"
+ "version": "1.1.0"
}
```
@@ -397,7 +397,7 @@ Read all Blasters
{
"id": "pMtEfSYMmg",
"name": "Basement Blaster",
- "type": "RM Mini3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF",
@@ -409,14 +409,20 @@ Read all Blasters
#### POST /blasters/
-Create a new Blaster
+Create a new Blaster.
+
+Blaster *type* can be derived through the following:
+1. Check this list of [blaster identifiers](https://github.com/401Unauthorized/broadlinkjs-rm/blob/master/index.js#L8) and find the name of your product
+2. Copy what is inside of the `[]` for the line with your product name
+3. Run `node -e 'console.log()'`
+4. The resulting number is what to put for the `type` field in the JSON body
> Request (Body)
```JSON
{
"name": "Basement Blaster",
- "type": "RM Mini3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF"
@@ -429,7 +435,7 @@ Create a new Blaster
{
"id": "pMtEfSYMmg",
"name": "Basement Blaster",
- "type": "RM Mini3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF",
@@ -452,7 +458,7 @@ Read a specific Blaster
{
"id": "pMtEfSYMmg",
"name": "Basement Blaster",
- "type": "RM Mini3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF",
@@ -479,7 +485,7 @@ Update a specific Blaster
{
"id": "pMtEfSYMmg",
"name": "Basement Blaster Updated",
- "type": "RM Mini3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF",
diff --git a/config/broadlink-bridge_bearer_auth.postman_collection.json b/config/broadlink-bridge_bearer_auth.postman_collection.json
index 1135cf5..ba6a7e7 100644
--- a/config/broadlink-bridge_bearer_auth.postman_collection.json
+++ b/config/broadlink-bridge_bearer_auth.postman_collection.json
@@ -150,7 +150,7 @@
],
"body": {
"mode": "raw",
- "raw": "{\n \"name\": \"Test Blaster\",\n \"type\": \"RM 3\",\n \"address\": \"192.168.1.2\",\n \"port\": 80,\n \"mac\": \"AA:BB:CC:DD:EE:FF\"\n}",
+ "raw": "{\n \"name\": \"Test Blaster\",\n \"type\": \"148340\",\n \"address\": \"192.168.1.2\",\n \"port\": 80,\n \"mac\": \"AA:BB:CC:DD:EE:FF\"\n}",
"options": {
"raw": {
"language": "json"
diff --git a/config/broadlink-bridge_query_string_auth.postman_collection.json b/config/broadlink-bridge_query_string_auth.postman_collection.json
index f7ab70f..06c4b5c 100644
--- a/config/broadlink-bridge_query_string_auth.postman_collection.json
+++ b/config/broadlink-bridge_query_string_auth.postman_collection.json
@@ -150,7 +150,7 @@
],
"body": {
"mode": "raw",
- "raw": "{\n \"name\": \"Test Blaster\",\n \"type\": \"RM 3\",\n \"address\": \"192.168.1.2\",\n \"port\": 80,\n \"mac\": \"AA:BB:CC:DD:EE:FF\"\n}",
+ "raw": "{\n \"name\": \"Test Blaster\",\n \"type\": \"148340\",\n \"address\": \"192.168.1.2\",\n \"port\": 80,\n \"mac\": \"AA:BB:CC:DD:EE:FF\"\n}",
"options": {
"raw": {
"language": "json"
diff --git a/express/middleware.js b/express/middleware.js
index 9a188d3..d0715c2 100644
--- a/express/middleware.js
+++ b/express/middleware.js
@@ -11,7 +11,7 @@ const corsSettings = {
};
module.exports.middleware = function (app, express) {
- morgan.token('apikey', (req, res) => req.user.token);
+ morgan.token('apikey', (req, res) => req.user && (req.user.token));
app.use(morgan(':date[iso] :method :url :status :response-time ms :user-agent token=:apikey'));
app.use(cors(corsSettings));
app.use(express.json());
diff --git a/models/lowdb/db-example.json b/models/lowdb/db-example.json
index 505659e..8782675 100644
--- a/models/lowdb/db-example.json
+++ b/models/lowdb/db-example.json
@@ -3,7 +3,7 @@
{
"id": "pMtEfSYMmg",
"name": "Basement Blaster",
- "type": "RM3",
+ "type": "148340",
"address": "192.168.1.2",
"port": 80,
"mac": "AA:BB:CC:DD:EE:FF",
@@ -19,13 +19,13 @@
"type": "PROJECTOR",
"commands": [
{
- "command": "power on",
+ "command": "power_on",
"repeat": 0,
"delay": 0,
"data": "260054000001299316101512141215111511151115111536153615361537153615361536153616111437153615361536143815111536151115111511151115111412153715111536150003750900019200012a4812000d0500000000"
},
{
- "command": "power off",
+ "command": "power_off",
"repeat": 1,
"delay": 300,
"data": "260054000001299316101512141215111511151115111536153615361537153615361536153616111437153615361536143815111536151115111511151115111412153715111536150003750900019200012a4812000d0500000000"
@@ -73,7 +73,7 @@
"data": "260050000001289514121412141214131412141214121338133814381338133813381438133813131338131314381313141214121412131313131338141314371338133814381437140005110001284a13000d050000000000000000"
},
{
- "command": "volume down",
+ "command": "volume_down",
"repeat": 0,
"delay": 0,
"data": "2600500000012895141214121313141214121412141215371437133813381339133814371437141214381412141214371412141214121412141214371339131314371338133813381500050f0001284a13000d050000000000000000"
@@ -85,7 +85,7 @@
"data": "260050000001289515121412141213131412131314121437133814381437133814371438133813131437131315111438141213131338141214121437143715121338133814121437140005100001294914000d050000000000000000"
},
{
- "command": "volume up",
+ "command": "volume_up",
"repeat": 0,
"delay": 0,
"data": "260050000001279614121412141214121412141214121437133913381437133815371437143714121438131314371313143713131412151115121338141214371412133814381437130005110001284a14000d050000000000000000"
@@ -97,13 +97,13 @@
"data": "260050000001289514121412141214121412141213131437143813381437133913381338143714121412151214371437141214121437131315371338141214121437133814131437130005110001284914000d050000000000000000"
},
{
- "command": "scroll up",
+ "command": "scroll_up",
"repeat": 0,
"delay": 0,
"data": "2600500000012895141214121412141214121412141214371537133813381437143715371338131314371437141215121437141213131412141213131437133815121437133814371400050f0001294a13000d050000000000000000"
},
{
- "command": "keystone top",
+ "command": "keystone_top",
"repeat": 0,
"delay": 0,
"data": "26005400090001db00012895141215121313141214121412141214371338133913381338143714381437131314121412143713131437141314121412143714371313143714121438143714371500050e0001284a14000d0500000000"
@@ -139,7 +139,7 @@
"data": "2600500000012895141214121512141214121313141213381338133813391338133814371437151214371313141213131437131313131412141214371438143713131338143714381400050f0001284a13000d050000000000000000"
},
{
- "command": "scroll down",
+ "command": "scroll_down",
"repeat": 0,
"delay": 0,
"data": "260050000001289514121412151214121412141213131437133813381537133814371437143814121412143713131412143715121412141213381313143713381412153714371338130005110001294913000d050000000000000000"
diff --git a/package-lock.json b/package-lock.json
index 447733f..aa574c5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "broadlink-bridge",
- "version": "1.0.0",
+ "version": "1.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -27,57 +27,43 @@
}
},
"body-parser": {
- "version": "1.18.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
- "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
- "bytes": "3.0.0",
+ "bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
- "http-errors": "~1.6.3",
- "iconv-lite": "0.4.23",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
- "qs": "6.5.2",
- "raw-body": "2.3.3",
- "type-is": "~1.6.16"
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
},
"dependencies": {
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"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=",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
}
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
}
}
},
- "bowser": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz",
- "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA=="
- },
"broadlinkjs-rm": {
- "version": "git+https://github.com/401Unauthorized/broadlinkjs-rm.git#4411ef7f8a5f35faf239d241e11fdc3cac434ba0",
+ "version": "git+https://github.com/401Unauthorized/broadlinkjs-rm.git#ab40b0aaba88bff148a713ec7b68a600f7bff115",
"from": "git+https://github.com/401Unauthorized/broadlinkjs-rm.git"
},
"bytes": {
@@ -85,15 +71,10 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
},
- "camelize": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
- "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
- },
"commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz",
+ "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA=="
},
"compressible": {
"version": "2.0.18",
@@ -128,14 +109,12 @@
}
},
"content-disposition": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
- "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
- },
- "content-security-policy-builder": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz",
- "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ=="
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
},
"content-type": {
"version": "1.0.4",
@@ -170,11 +149,6 @@
"vary": "^1"
}
},
- "dasherize": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
- "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg="
- },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -184,25 +158,15 @@
}
},
"depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ "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="
},
- "dns-prefetch-control": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz",
- "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q=="
- },
- "dont-sniff-mimetype": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz",
- "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug=="
- },
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
@@ -228,94 +192,55 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
- "expect-ct": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz",
- "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g=="
- },
"express": {
- "version": "4.16.4",
- "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
- "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
- "accepts": "~1.3.5",
+ "accepts": "~1.3.7",
"array-flatten": "1.1.1",
- "body-parser": "1.18.3",
- "content-disposition": "0.5.2",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
"content-type": "~1.0.4",
- "cookie": "0.3.1",
+ "cookie": "0.4.0",
"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",
+ "finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
- "parseurl": "~1.3.2",
+ "parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.4",
- "qs": "6.5.2",
- "range-parser": "~1.2.0",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
"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",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
- },
- "dependencies": {
- "cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
- },
- "statuses": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
- "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
- }
}
},
- "feature-policy": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz",
- "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ=="
- },
"finalhandler": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
- "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"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",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.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": {
@@ -323,11 +248,6 @@
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
- "frameguard": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz",
- "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g=="
- },
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -339,97 +259,46 @@
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"helmet": {
- "version": "3.22.0",
- "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.22.0.tgz",
- "integrity": "sha512-Xrqicn2nm1ZIUxP3YGuTBmbDL04neKsIT583Sjh0FkiwKDXYCMUqGqC88w3NUvVXtA75JyR2Jn6jw6ZEMOD+ZA==",
- "requires": {
- "depd": "2.0.0",
- "dns-prefetch-control": "0.2.0",
- "dont-sniff-mimetype": "1.1.0",
- "expect-ct": "0.2.0",
- "feature-policy": "0.3.0",
- "frameguard": "3.1.0",
- "helmet-crossdomain": "0.4.0",
- "helmet-csp": "2.10.0",
- "hide-powered-by": "1.1.0",
- "hpkp": "2.0.0",
- "hsts": "2.2.0",
- "ienoopen": "1.1.0",
- "nocache": "2.1.0",
- "referrer-policy": "1.2.0",
- "x-xss-protection": "1.3.0"
- }
- },
- "helmet-crossdomain": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz",
- "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA=="
- },
- "helmet-csp": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz",
- "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==",
- "requires": {
- "bowser": "2.9.0",
- "camelize": "1.0.0",
- "content-security-policy-builder": "2.1.0",
- "dasherize": "2.0.0"
- }
- },
- "hide-powered-by": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz",
- "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg=="
- },
- "hpkp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz",
- "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
- },
- "hsts": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz",
- "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==",
- "requires": {
- "depd": "2.0.0"
- }
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.1.0.tgz",
+ "integrity": "sha512-KWy75fYN8hOG2Rhl8e5B3WhOzb0by1boQum85TiddIE9iu6gV+TXbUjVC17wfej0o/ZUpqB9kxM0NFCZRMzf+Q=="
},
"http-errors": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
- "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
+ "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.4",
- "setprototypeof": "1.1.1",
+ "setprototypeof": "1.2.0",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
},
"dependencies": {
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
}
}
},
"iconv-lite": {
- "version": "0.4.23",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
- "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
- "ienoopen": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz",
- "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ=="
- },
"inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ipaddr.js": {
"version": "1.9.1",
@@ -442,9 +311,9 @@
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
},
"lowdb": {
"version": "1.0.0",
@@ -474,9 +343,9 @@
"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=="
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.44.0",
@@ -492,34 +361,34 @@
}
},
"moment": {
- "version": "2.25.3",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz",
- "integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg=="
+ "version": "2.27.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
+ "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
},
"moment-timezone": {
- "version": "0.5.28",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz",
- "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==",
+ "version": "0.5.31",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
+ "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
"requires": {
"moment": ">= 2.9.0"
}
},
"morgan": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
- "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
+ "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
"requires": {
- "basic-auth": "~2.0.0",
+ "basic-auth": "~2.0.1",
"debug": "2.6.9",
- "depd": "~1.1.2",
+ "depd": "~2.0.0",
"on-finished": "~2.3.0",
- "on-headers": "~1.0.1"
+ "on-headers": "~1.0.2"
},
"dependencies": {
"depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
}
}
},
@@ -538,11 +407,6 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
- "nocache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz",
- "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q=="
- },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -621,9 +485,9 @@
}
},
"qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
"range-parser": {
"version": "1.2.1",
@@ -631,49 +495,35 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
- "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"requires": {
- "bytes": "3.0.0",
- "http-errors": "1.6.3",
- "iconv-lite": "0.4.23",
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"dependencies": {
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"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=",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
}
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
}
}
},
- "referrer-policy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz",
- "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA=="
- },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -685,9 +535,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"send": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
- "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
@@ -696,56 +546,47 @@
"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",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
"on-finished": "~2.3.0",
- "range-parser": "~1.2.0",
- "statuses": "~1.4.0"
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
},
"dependencies": {
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
"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=",
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
+ "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
"requires": {
"depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
+ "inherits": "2.0.4",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
}
},
"inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
- "statuses": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
- "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"serve-static": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
- "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
- "parseurl": "~1.3.2",
- "send": "0.16.2"
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
}
},
"setprototypeof": {
@@ -802,11 +643,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "x-xss-protection": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz",
- "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg=="
}
}
}
diff --git a/package.json b/package.json
index 0848499..73ef2cc 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "broadlink-bridge",
"description": "An HTTP REST Bridge for BroadLink IR Devices",
- "version": "1.0.1",
+ "version": "1.1.0",
"private": false,
"keywords": [
"REST",
@@ -30,18 +30,17 @@
},
"dependencies": {
"broadlinkjs-rm": "git+https://github.com/401Unauthorized/broadlinkjs-rm.git",
- "commander": "^5.1.0",
+ "commander": "^6.1.0",
"compression": "^1.7.4",
"cookie-parser": "~1.4.4",
"cors": "^2.8.5",
- "debug": "~2.6.9",
"dotenv": "^8.2.0",
- "express": "~4.16.1",
- "helmet": "^3.22.0",
- "http-errors": "^1.7.3",
+ "express": "^4.17.1",
+ "helmet": "^4.1.0",
+ "http-errors": "^1.8.0",
"lowdb": "^1.0.0",
- "moment-timezone": "^0.5.28",
- "morgan": "~1.9.1",
+ "moment-timezone": "^0.5.31",
+ "morgan": "^1.10.0",
"passport": "^0.4.1",
"passport-custom": "^1.1.1",
"passport-http-bearer": "^1.0.1",
@@ -54,4 +53,4 @@
"type": "individual",
"url": "https://paypal.me/stephenmendez401"
}
-}
\ No newline at end of file
+}
diff --git a/resources/smartthings_device_handler.groovy b/resources/smartthings_device_handler.groovy
new file mode 100644
index 0000000..720cbf7
--- /dev/null
+++ b/resources/smartthings_device_handler.groovy
@@ -0,0 +1,121 @@
+/**
+ * Broadlink Bridge
+ * Device Handler: v1.0.0
+ *
+ * MIT License
+ *
+ * Copyright (c) 2020 Stephen Mendez
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+
+metadata {
+ definition (name: "Broadlink Bridge", namespace: "401Unauthorized", author: "Stephen Mendez", ocfDeviceType: "oic.d.light", runLocally: true, minHubCoreVersion: '000.017.0012', executeCommandsLocally: false) {
+ capability "Actuator"
+ capability "Switch"
+ capability "Sensor"
+ capability "Light"
+ }
+
+ simulator {}
+
+ preferences {
+ input "internal_ip", "text", title: "IP for Broadlink Bridge", description: "(ie. 192.168.1.2)", required: true
+ input "internal_port", "text", title: "Port", description: "(ie. 3000)" , required: true
+ input "internal_token", "text", title: "Token", description: "(ie. abc123)" , required: true
+ input "blaster_id", "text", title: "Blaster ID", description: "(ie. abc123)" , required: true
+ input "ir_device_id", "text", title: "Device ID", description: "(ie. abc123)" , required: true
+ }
+
+ tiles(scale: 2) {
+ multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4, canChangeIcon: true){
+ tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
+ attributeState "on", label:'${name}', action:"switch.off", icon:"st.switches.switch.on", backgroundColor:"#00a0dc", nextState:"turningOff"
+ attributeState "off", label:'${name}', action:"switch.on", icon:"st.switches.switch.off", backgroundColor:"#ffffff", nextState:"turningOn"
+ attributeState "turningOn", label:'${name}', action:"switch.off", icon:"st.switches.switch.on", backgroundColor:"#00a0dc", nextState:"turningOff"
+ attributeState "turningOff", label:'${name}', action:"switch.on", icon:"st.switches.switch.off", backgroundColor:"#ffffff", nextState:"turningOn"
+ }
+ }
+
+ main(["switch"])
+ details(["switch"])
+ }
+}
+
+def installed() {}
+
+def updated(){}
+
+def parse(String description) {}
+
+def on() {
+ sendHttpRequest("/blasters/"+urlEncode(blaster_id)+"/devices/"+urlEncode(ir_device_id)+"/commands/power_on/emit?token="+urlEncode(internal_token))
+}
+
+def off() {
+ sendHttpRequest("/blasters/"+urlEncode(blaster_id)+"/devices/"+urlEncode(ir_device_id)+"/commands/power_off/emit?token="+urlEncode(internal_token))
+}
+
+def sendHttpRequest(String path) {
+ def result = new physicalgraph.device.HubAction(
+ [method: "POST",
+ path: path,
+ headers: [HOST: "${internal_ip}:${internal_port}"]],
+ null,
+ [callback: hubResponseReceived]
+ )
+ sendHubCommand(result)
+}
+
+void hubResponseReceived(physicalgraph.device.HubResponse hubResponse) {
+ def body = hubResponse.json
+ logger('debug', "${hubResponse.body}")
+
+ if(hubResponse.status == 200 && body.status == "Done!"){
+ if(this.device.currentValue("switch") == "on"){
+ sendEvent(name: "switch", value: "off")
+ } else {
+ sendEvent(name: "switch", value: "on")
+ }
+ }
+}
+
+def urlEncode(String) {
+ return java.net.URLEncoder.encode(String, "UTF-8")
+}
+
+def logger(level, message) {
+ def logLevel=4
+ if(settings.configLoglevel) {
+ logLevel = settings.configLoglevel.toInteger() ?: 0
+ }
+ if(level=="error"&&logLevel>0) {
+ log.error message
+ }
+ if(level=="warn"&&logLevel>1) {
+ log.warn message
+ }
+ if(level=="info"&&logLevel>2) {
+ log.info message
+ }
+ if(level=="debug"&&logLevel>3) {
+ log.debug message
+ }
+}
diff --git a/services/broadlink/index.js b/services/broadlink/index.js
index d6c69d2..3befb63 100644
--- a/services/broadlink/index.js
+++ b/services/broadlink/index.js
@@ -30,8 +30,8 @@ class BroadlinkService {
createBlaster(obj) {
const blaster = { 'id': shortid(), 'devices': [], ...obj, active: false };
this.db.get('blasters').find({ id: blaster.id }).assign(blaster).value();
- const { address, port, mac } = blaster;
- this.broadlink.addDevice({ address, port }, mac, 0x5f36); // TODO: Make Type Dynamic
+ const { address, port, mac, type } = blaster;
+ this.broadlink.addDevice({ address, port }, mac, Number(type).toString(16) || 0x5f36);
return { blaster, broadlinkBlaster: this.blasterToBroadlink(blaster) };
}
@@ -74,9 +74,21 @@ class BroadlinkService {
if (!broadlinkDevice)
throw new Error(`Missing Broadlink Blaster: ${JSON.stringify(blaster)} ${JSON.stringify(broadlinkDevice)}`);
- broadlinkDevice.sendData(Buffer.from(command.data, 'hex'));
- }
+ const data = Buffer.from(command.data, 'hex');
+ broadlinkDevice.sendData(data);
+
+ if (command.repeat) {
+ let repeatsRemaining = command.repeat;
+ const sendDataInterval = setInterval(() => {
+ repeatsRemaining -= 1;
+ broadlinkDevice.sendData(data);
+ if(repeatsRemaining <= 0){
+ clearInterval(sendDataInterval);
+ }
+ }, command.delay);
+ }
+ }
}
module.exports = BroadlinkService;