ring-client-api 11.3.1 → 11.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +45 -51
  3. package/lib/{api/api.d.ts → api.d.ts} +0 -0
  4. package/lib/{api/api.js → api.js} +0 -0
  5. package/lib/{api/device-data.d.ts → device-data.d.ts} +0 -0
  6. package/lib/{api/device-data.js → device-data.js} +0 -0
  7. package/lib/{api/ffmpeg.d.ts → ffmpeg.d.ts} +0 -0
  8. package/lib/{api/ffmpeg.js → ffmpeg.js} +0 -0
  9. package/lib/{api/index.d.ts → index.d.ts} +0 -0
  10. package/lib/{api/index.js → index.js} +0 -0
  11. package/lib/{api/location.d.ts → location.d.ts} +0 -0
  12. package/lib/{api/location.js → location.js} +0 -0
  13. package/lib/{api/refresh-token.d.ts → refresh-token.d.ts} +0 -0
  14. package/lib/{api/refresh-token.js → refresh-token.js} +0 -0
  15. package/lib/{api/rest-client.d.ts → rest-client.d.ts} +0 -0
  16. package/lib/{api/rest-client.js → rest-client.js} +0 -0
  17. package/lib/ring-auth-cli.js +7 -1
  18. package/lib/{api/ring-camera.d.ts → ring-camera.d.ts} +0 -0
  19. package/lib/{api/ring-camera.js → ring-camera.js} +0 -0
  20. package/lib/{api/ring-chime.d.ts → ring-chime.d.ts} +0 -0
  21. package/lib/{api/ring-chime.js → ring-chime.js} +0 -0
  22. package/lib/ring-device-data-cli.js +7 -1
  23. package/lib/{api/ring-device.d.ts → ring-device.d.ts} +0 -0
  24. package/lib/{api/ring-device.js → ring-device.js} +0 -0
  25. package/lib/{api/ring-types.d.ts → ring-types.d.ts} +0 -0
  26. package/lib/{api/ring-types.js → ring-types.js} +0 -0
  27. package/lib/{api/streaming → streaming}/peer-connection.d.ts +0 -0
  28. package/lib/{api/streaming → streaming}/peer-connection.js +0 -0
  29. package/lib/{api/streaming → streaming}/ring-edge-connection.d.ts +0 -0
  30. package/lib/{api/streaming → streaming}/ring-edge-connection.js +0 -0
  31. package/lib/{api/streaming → streaming}/simple-webrtc-session.d.ts +0 -0
  32. package/lib/{api/streaming → streaming}/simple-webrtc-session.js +0 -0
  33. package/lib/{api/streaming → streaming}/streaming-connection-base.d.ts +0 -0
  34. package/lib/{api/streaming → streaming}/streaming-connection-base.js +0 -0
  35. package/lib/{api/streaming → streaming}/streaming-session.d.ts +0 -0
  36. package/lib/{api/streaming → streaming}/streaming-session.js +0 -0
  37. package/lib/{api/streaming → streaming}/webrtc-connection.d.ts +0 -0
  38. package/lib/{api/streaming → streaming}/webrtc-connection.js +0 -0
  39. package/lib/{api/subscribed.d.ts → subscribed.d.ts} +0 -0
  40. package/lib/{api/subscribed.js → subscribed.js} +0 -0
  41. package/lib/test/{api/ring-camera.spec.d.ts → ring-camera.spec.d.ts} +0 -0
  42. package/lib/test/ring-camera.spec.js +25 -0
  43. package/lib/{api/util.d.ts → util.d.ts} +0 -0
  44. package/lib/{api/util.js → util.js} +0 -0
  45. package/package.json +48 -77
  46. package/CHANGELOG.md +0 -1574
  47. package/lib/build/github-releaser.d.ts +0 -1
  48. package/lib/build/github-releaser.js +0 -19
  49. package/lib/build/package-homebridge.d.ts +0 -1
  50. package/lib/build/package-homebridge.js +0 -6
  51. package/lib/jest.config.d.ts +0 -3
  52. package/lib/jest.config.js +0 -6
  53. package/lib/test/api/ring-camera.spec.js +0 -25
  54. package/media/camera-offline.jpg +0 -0
  55. package/media/snapshots-blocked.jpg +0 -0
  56. package/ring-auth-cli.js +0 -2
  57. package/ring-device-data-cli.js +0 -2
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2019 Dusty Greif
3
+ Copyright (c) 2022 Dusty Greif
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -23,35 +23,44 @@ First, generate a `refreshToken` using the instructions in the [Refresh Tokens W
23
23
  import { RingApi } from 'ring-client-api'
24
24
 
25
25
  const ringApi = new RingApi({
26
- refreshToken: 'token generated with ring-auth-cli. See https://github.com/dgreif/ring/wiki/Refresh-Tokens',
26
+ refreshToken:
27
+ 'token generated with ring-auth-cli. See https://github.com/dgreif/ring/wiki/Refresh-Tokens',
27
28
 
28
29
  // The following are all optional. See below for details
29
30
  cameraStatusPollingSeconds: 20,
30
- locationIds: ['488e4800-fcde-4493-969b-d1a06f683102', '4bbed7a7-06df-4f18-b3af-291c89854d60']
31
- });
31
+ locationIds: [
32
+ '488e4800-fcde-4493-969b-d1a06f683102',
33
+ '4bbed7a7-06df-4f18-b3af-291c89854d60',
34
+ ],
35
+ })
32
36
  ```
33
37
 
34
38
  ### Optional Parameters
35
39
 
36
- Option | Default | Explanation
37
- --- | --- | ---
38
- `cameraStatusPollingSeconds` | `undefined` (No Polling) | How frequently to poll for updates to your cameras and chimes (in seconds). Information like light/siren/volume/snooze status do not update in real time and need to be requested periodically.
39
- `locationModePollingSeconds` | `undefined` (No Polling) | How frequently to poll for location mode updates (in seconds). This is only useful if you are using location modes to control camera settings and want to keep an up-to-date reference of the current mode for each location. Polling is automatically disabled for locations equipped with a Ring Alarm.
40
- `locationIds` | All Locations | Allows you to limit the results to a specific set of locations. This is mainly useful for the [homebridge-ring Plugin](./homebridge), but can also be used if you only care about listening for events at a subset of your locations and don't want to create websocket connections to _all_ of your locations. This will also limit the results for `ringApi.getCameras()` to the configured locations. If this option is not included, all locations will be returned.
41
- `debug` | false | Turns on additional logging. In particular, ffmpeg logging.
42
- `ffmpegPath` | undefined | A custom path to the `ffmpeg` executable. By default, `ffmpeg` will be installed using `ffmpeg-for-homebridge`, and then fall back to using the `PATH` environment variable.
43
- `ffmpegPath` | Uses `ffmpeg-for-homebridge` | A custom path to the `ffmpeg` executable. By default, the static binaries built in [ffmpeg-for-homebridge](https://github.com/oznu/ffmpeg-for-homebridg) will be used. If you prefer to use your own version of ffmpeg, you can pass a complete path, or simply `"ffmpeg"` to use ffmpeg from your `PATH`.
44
- `controlCenterDisplayName` | 'ring-client-api' | This allows you to change the displayed name for the Authorized Device within Control Center in the Ring app
45
- `avoidSnapshotBatteryDrain` | false | Causes snapshots for battery cameras to be fetched at a minimum 10 minute interval to avoid draining the battery.
40
+ | Option | Default | Explanation |
41
+ | ---------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
42
+ | `cameraStatusPollingSeconds` | `undefined` (No Polling) | How frequently to poll for updates to your cameras and chimes (in seconds). Information like light/siren/volume/snooze status do not update in real time and need to be requested periodically. |
43
+ | `locationModePollingSeconds` | `undefined` (No Polling) | How frequently to poll for location mode updates (in seconds). This is only useful if you are using location modes to control camera settings and want to keep an up-to-date reference of the current mode for each location. Polling is automatically disabled for locations equipped with a Ring Alarm. |
44
+ | `locationIds` | All Locations | Allows you to limit the results to a specific set of locations. This is mainly useful for the [homebridge-ring Plugin](./homebridge), but can also be used if you only care about listening for events at a subset of your locations and don't want to create websocket connections to _all_ of your locations. This will also limit the results for `ringApi.getCameras()` to the configured locations. If this option is not included, all locations will be returned. |
45
+ | `debug` | false | Turns on additional logging. In particular, ffmpeg logging. |
46
+ | `ffmpegPath` | undefined | A custom path to the `ffmpeg` executable. By default, `ffmpeg` will be installed using `ffmpeg-for-homebridge`, and then fall back to using the `PATH` environment variable. |
47
+ | `ffmpegPath` | Uses `ffmpeg-for-homebridge` | A custom path to the `ffmpeg` executable. By default, the static binaries built in [ffmpeg-for-homebridge](https://github.com/oznu/ffmpeg-for-homebridg) will be used. If you prefer to use your own version of ffmpeg, you can pass a complete path, or simply `"ffmpeg"` to use ffmpeg from your `PATH`. |
48
+ | `controlCenterDisplayName` | 'ring-client-api' | This allows you to change the displayed name for the Authorized Device within Control Center in the Ring app |
49
+ | `avoidSnapshotBatteryDrain` | false | Causes snapshots for battery cameras to be fetched at a minimum 10 minute interval to avoid draining the battery. |
46
50
 
47
51
  ## Locations
52
+
48
53
  ```typescript
49
54
  const locations = await ringApi.getLocations()
50
55
  const location = locations[0]
51
56
  location.hasHubs // does this location have an alarm and/or lighting bridge
52
57
  location.disarm()
53
- location.armHome([/* optional array of zids for devices to bypass */])
54
- location.armAway([/* bypass zids */])
58
+ location.armHome([
59
+ /* optional array of zids for devices to bypass */
60
+ ])
61
+ location.armAway([
62
+ /* bypass zids */
63
+ ])
55
64
  location.getAlarmMode() // returns Promise<'all' | 'some' | 'none'>
56
65
  location.soundSiren()
57
66
  location.silenceSiren()
@@ -64,29 +73,34 @@ location.getCameraEvents() // ding events from all cameras in the location
64
73
  and used to interact with all devices in that location.
65
74
 
66
75
  ## Devices
76
+
67
77
  Once you have acquired the desired location, you can start
68
78
  to interact with associated devices. These devices include ring alarm, ring lighting,
69
79
  and third party devices connected to ring alarm
80
+
70
81
  ```js
71
82
  import { RingDeviceType } from 'ring-client-api'
72
83
 
73
84
  const devices = await location.getDevices()
74
- const baseStation = devices.find(device => device.data.deviceType === RingDeviceType.BaseStation)
75
- baseStation.setVolume(.75) // base station and keypad support volume settings between 0 and 1
85
+ const baseStation = devices.find(
86
+ (device) => device.data.deviceType === RingDeviceType.BaseStation
87
+ )
88
+ baseStation.setVolume(0.75) // base station and keypad support volume settings between 0 and 1
76
89
  console.log(baseStation.data) // object containing properties like zid, name, roomId, faulted, tamperStatus, etc.
77
- baseStation.onData.subscribe(data => {
78
- // called any time data is updated for this specific device
90
+ baseStation.onData.subscribe((data) => {
91
+ // called any time data is updated for this specific device
79
92
  })
80
93
  ```
81
94
 
82
95
  ## Cameras
96
+
83
97
  You can get all cameras using `await ringApi.getCameras()` or cameras for a particular
84
98
  location with `location.cameras`
85
99
 
86
100
  ```typescript
87
101
  const camera = location.cameras[0]
88
102
  camera.data // camera info including motion zones, light status, battery, etc.
89
- camera.onData.subscribe(data => {
103
+ camera.onData.subscribe((data) => {
90
104
  // called every time new data is fetched for this camera
91
105
  })
92
106
  camera.setLight(true) // turn light on/off
@@ -97,43 +111,23 @@ camera.createSipSession() // creates a new SipSession which allows you to contro
97
111
  camera.getEvents() // fetch ding events for the camera (like motion and doorbell presses)
98
112
  camera.getRecordingUrl(dingIdStr, { transcoded: true }) // fetch the url for a recording
99
113
  camera.getSnapshot() // returns a Promise<Buffer> of the latest snapshot from the camera
100
-
101
114
  ```
102
115
 
103
116
  Camera also includes the following observables:
104
- * `onNewDing`: this will include the sip info and ding information every time a new ding is created
105
- * `onActiveDings`: dings created within the last 65 seconds
106
- * `onDoorbellPressed`: emits a ding every time the doorbell is pressed
107
- * `onMotionDetected`: `true` or `false` based on `onActiveDings` containing a motion ding
108
117
 
109
- Some other useful properties
110
- * `id`
111
- * `name`: same as `description` from `data`
112
- * `hasLight`: does this camera have a light
113
- * `hasSiren`: does this camera have a siren
114
- * `isDoorbot`: is this camera a doorbell
118
+ - `onNewDing`: this will include the sip info and ding information every time a new ding is created
119
+ - `onActiveDings`: dings created within the last 65 seconds
120
+ - `onDoorbellPressed`: emits a ding every time the doorbell is pressed
121
+ - `onMotionDetected`: `true` or `false` based on `onActiveDings` containing a motion ding
115
122
 
116
- ## Examples
123
+ Some other useful properties
117
124
 
118
- See the [examples directory](examples) for additional code examples. For a full project example, see https://github.com/dgreif/ring-client-example
125
+ - `id`
126
+ - `name`: same as `description` from `data`
127
+ - `hasLight`: does this camera have a light
128
+ - `hasSiren`: does this camera have a siren
129
+ - `isDoorbot`: is this camera a doorbell
119
130
 
120
131
  ## Refresh Token
121
132
 
122
- Ring has restricted refresh tokens so that they expire shortly after use. See https://github.com/dgreif/ring/wiki/Refresh-Tokens#refresh-token-expiration for details on how to properly handle refresh tokens in your library.
123
-
124
- ## homebridge-ring
125
-
126
- The `homebridge-ring` is also maintained in this repo. Its readme can be found in [the `homebridge` directory](./homebridge)
127
-
128
- ## Credits
129
-
130
- I'd like to give a big thanks to a number developers who have put a lot of hard work into analyzing the
131
- Ring api and building similar libraries which were extremely valuable in my creation of this project. Thank you all
132
- for your hard work!
133
-
134
- * @davglass - https://github.com/davglass/doorbot - The original node project that proved we can interact with Ring's api
135
- * @jimhigson - https://github.com/jimhigson/ring-api - A promisified api for Ring's original line of products
136
- * @tchellomello - https://github.com/tchellomello/python-ring-doorbell - A python api which is widely used for Ring integrations
137
- * @mrose17 - https://github.com/homespun/homebridge-platform-ring-video-doorbell - The original Ring camera homebridge plugin
138
- * @codahq - Thanks for all your help debugging the Ring api
139
- * @joeyberkovitz - Great discovery work on the Ring Alarm websockets api
133
+ Ring has restricted refresh tokens so that they expire shortly after use. See https://github.com/dgreif/ring/wiki/Refresh-Tokens#refresh-token-expiration for details on how to properly handle refresh tokens in your library.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,3 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- require('./lib/api/refresh-token').logRefreshToken();
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const refresh_token_1 = require("./refresh-token");
5
+ (0, refresh_token_1.logRefreshToken)().catch((e) => {
6
+ // eslint-disable-next-line no-console
7
+ console.error(e);
8
+ process.exit(1);
9
+ });
File without changes
File without changes
File without changes
File without changes
@@ -1,3 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- require('./lib/api/device-data').logDeviceData();
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const device_data_1 = require("./device-data");
5
+ (0, device_data_1.logDeviceData)().catch((e) => {
6
+ // eslint-disable-next-line no-console
7
+ console.error(e);
8
+ process.exit(1);
9
+ });
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../index");
4
+ describe('Ring Camera', () => {
5
+ describe('battery level', () => {
6
+ it('should handle string battery life', () => {
7
+ expect((0, index_1.getBatteryLevel)({
8
+ battery_life: '49',
9
+ })).toEqual(49);
10
+ });
11
+ it('should handle null battery life', () => {
12
+ expect((0, index_1.getBatteryLevel)({ battery_life: null })).toEqual(null);
13
+ });
14
+ it('should handle right battery only', () => {
15
+ expect((0, index_1.getBatteryLevel)({ battery_life: null, battery_life_2: 24 })).toEqual(24);
16
+ });
17
+ it('should handle left battery only', () => {
18
+ expect((0, index_1.getBatteryLevel)({ battery_life: 76, battery_life_2: null })).toEqual(76);
19
+ });
20
+ it('should handle dual batteries', () => {
21
+ expect((0, index_1.getBatteryLevel)({ battery_life: '92', battery_life_2: 84 })).toEqual(84);
22
+ expect((0, index_1.getBatteryLevel)({ battery_life: '92', battery_life_2: 100 })).toEqual(92);
23
+ });
24
+ });
25
+ });
File without changes
File without changes
package/package.json CHANGED
@@ -1,109 +1,63 @@
1
1
  {
2
2
  "name": "ring-client-api",
3
- "version": "11.3.1",
3
+ "version": "11.4.0-beta.0",
4
4
  "description": "Unofficial API for Ring doorbells, cameras, security alarm system and smart lighting",
5
- "main": "lib/api/index.js",
6
- "bin": {
7
- "ring-auth-cli": "ring-auth-cli.js",
8
- "ring-device-data-cli": "ring-device-data-cli.js"
5
+ "main": "lib/index.js",
6
+ "exports": {
7
+ ".": "./lib/index.js",
8
+ "./ffmpeg": "./lib/ffmpeg.js",
9
+ "./util": "./lib/util.js",
10
+ "./rest-client": "./lib/rest-client.js"
9
11
  },
10
12
  "scripts": {
11
- "start": "concurrently -c yellow,blue --kill-others \"npm:hb\" \"npm:watch:ui\"",
12
- "watch:ui": "npm start --prefix homebridge-ui",
13
- "test": "jest && eslint '**/*.ts'",
14
- "watch:tests": "jest --watch",
15
- "lint": "eslint '**/*.ts' --fix",
16
13
  "build": "rm -rf lib && tsc --declaration",
17
- "build-quick": "rm -rf lib && esbuild ./{api,examples,homebridge}/*.ts ./api/streaming/*.ts --target=es2017 --format=cjs --outdir=lib",
18
- "example": "node -r @swc-node/register ./examples/example.ts",
19
- "api-example": "node -r @swc-node/register ./examples/api-example.ts",
20
- "record-example": "node -r @swc-node/register ./examples/record-example.ts",
21
- "return-audio-example": "node -r @swc-node/register ./examples/return-audio-example.ts",
22
- "stream-example": "node -r @swc-node/register ./examples/stream-example.ts",
23
- "browser-example": "node -r @swc-node/register ./examples/browser-example.ts",
24
- "auth-cli": "npm run build-quick && ./ring-auth-cli.js",
25
- "device-data-cli": "npm run build-quick && ./ring-device-data-cli.js",
26
- "hb": "npm run build-quick && ./build/package-homebridge.sh && homebridge -P ./release-homebridge -U ./.homebridge",
27
- "prepare-npm-packages": "./build/package-api.sh && ./build/package-homebridge.sh",
28
- "push-with-tags": "git push --follow-tags && node ./build/github-releaser.js",
29
- "deploy": "git pull -r && standard-version && npm publish ./release-api && npm publish ./release-homebridge && npm run push-with-tags",
30
- "deploy-beta": "git pull -r && standard-version --prerelease beta && npm publish --tag beta ./release-api && npm publish --tag beta ./release-homebridge && npm run push-with-tags"
31
- },
32
- "standard-version": {
33
- "scripts": {
34
- "prerelease": "npm run build && npm test",
35
- "pretag": "npm run prepare-npm-packages && npm run --prefix homebridge-ui build"
36
- }
14
+ "lint": "eslint . --ext .ts",
15
+ "test": "jest",
16
+ "test:watch": "jest --watch"
37
17
  },
38
- "repository": {
39
- "type": "git",
40
- "url": "git://github.com/dgreif/ring.git"
41
- },
42
- "keywords": [
43
- "ring",
44
- "doorbell",
45
- "doorbot",
46
- "camera",
47
- "alarm",
48
- "smart",
49
- "light",
50
- "beam",
51
- "security",
52
- "client",
53
- "api"
54
- ],
55
- "author": "dgreif",
56
- "license": "MIT",
57
18
  "dependencies": {
58
19
  "@eneris/push-receiver": "^3.1.2",
59
20
  "@homebridge/camera-utils": "^2.2.0",
60
- "@homebridge/plugin-ui-utils": "^0.0.19",
61
- "werift": "0.16.2",
21
+ "werift": "0.17.0",
62
22
  "@types/socket.io-client": "1.4.36",
63
23
  "colors": "^1.4.0",
64
24
  "debug": "^4.3.4",
65
25
  "got": "^11.8.5",
66
26
  "rxjs": "^7.5.7",
67
- "socket.io-client": "^2.4.0",
68
- "systeminformation": "^5.12.7",
27
+ "socket.io-client": "^2.5.0",
28
+ "systeminformation": "^5.12.14",
69
29
  "uuid": "^9.0.0",
70
- "ws": "^8.9.0"
30
+ "ws": "^8.11.0"
71
31
  },
72
32
  "devDependencies": {
73
- "@swc-node/register": "^1.5.4",
74
33
  "@types/debug": "4.1.7",
75
- "@types/jest": "29.1.2",
76
- "@types/node": "18.11.0",
34
+ "@types/jest": "29.2.2",
35
+ "@types/node": "18.11.9",
77
36
  "@types/uuid": "8.3.4",
78
37
  "@types/ws": "^8.5.3",
79
- "@typescript-eslint/eslint-plugin": "5.40.0",
80
- "@typescript-eslint/parser": "5.40.0",
81
- "concurrently": "^7.4.0",
82
- "conventional-github-releaser": "3.1.5",
38
+ "@typescript-eslint/eslint-plugin": "5.42.1",
39
+ "@typescript-eslint/parser": "5.42.1",
83
40
  "dotenv": "16.0.3",
84
- "esbuild": "^0.15.11",
85
- "eslint": "8.25.0",
86
- "eslint-config-prettier": "8.5.0",
87
- "eslint-plugin-jest": "27.1.2",
88
- "eslint-plugin-prettier": "4.2.1",
89
- "express": "4.18.2",
90
- "homebridge": "1.5.0",
91
- "jest": "29.2.0",
92
- "prettier": "2.7.1",
93
- "reflect-metadata": "0.1.13",
94
- "rimraf": "3.0.2",
95
- "standard-version": "9.5.0",
41
+ "esbuild": "^0.15.13",
42
+ "eslint-config-shared": "0.0.0",
43
+ "jest": "29.3.1",
96
44
  "ts-jest": "29.0.3",
45
+ "tsconfig": "0.0.0",
97
46
  "typescript": "4.8.4"
98
47
  },
99
48
  "engines": {
100
- "node": "^16 || ^18",
101
- "homebridge": ">=1.4.0"
49
+ "node": "^16 || ^18"
50
+ },
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git://github.com/dgreif/ring.git"
102
54
  },
103
55
  "bugs": {
104
56
  "url": "https://github.com/dgreif/ring/issues"
105
57
  },
106
58
  "homepage": "https://github.com/dgreif/ring#readme",
59
+ "author": "dgreif",
60
+ "license": "MIT",
107
61
  "funding": [
108
62
  {
109
63
  "type": "paypal",
@@ -114,7 +68,24 @@
114
68
  "url": "https://github.com/sponsors/dgreif"
115
69
  }
116
70
  ],
117
- "workspaces": [
118
- "homebridge-ui"
71
+ "bin": {
72
+ "ring-auth-cli": "lib/ring-auth-cli.js",
73
+ "ring-device-data-cli": "lib/ring-device-data-cli.js"
74
+ },
75
+ "files": [
76
+ "lib"
77
+ ],
78
+ "keywords": [
79
+ "ring",
80
+ "doorbell",
81
+ "doorbot",
82
+ "camera",
83
+ "alarm",
84
+ "smart",
85
+ "light",
86
+ "beam",
87
+ "security",
88
+ "client",
89
+ "api"
119
90
  ]
120
91
  }