homebridge-smartthings-oauth 1.0.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 (142) hide show
  1. package/.devcontainer/Dockerfile +16 -0
  2. package/.devcontainer/devcontainer.json +36 -0
  3. package/LICENSE +176 -0
  4. package/README.md +114 -0
  5. package/config.schema.json +134 -0
  6. package/dist/auth/auth.d.ts +23 -0
  7. package/dist/auth/auth.d.ts.map +1 -0
  8. package/dist/auth/auth.js +168 -0
  9. package/dist/auth/auth.js.map +1 -0
  10. package/dist/auth/tokenManager.d.ts +36 -0
  11. package/dist/auth/tokenManager.d.ts.map +1 -0
  12. package/dist/auth/tokenManager.js +180 -0
  13. package/dist/auth/tokenManager.js.map +1 -0
  14. package/dist/basePlatformAccessory.d.ts +49 -0
  15. package/dist/basePlatformAccessory.d.ts.map +1 -0
  16. package/dist/basePlatformAccessory.js +209 -0
  17. package/dist/basePlatformAccessory.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +7 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/keyValues.d.ts +4 -0
  23. package/dist/keyValues.d.ts.map +1 -0
  24. package/dist/keyValues.js +12 -0
  25. package/dist/keyValues.js.map +1 -0
  26. package/dist/multiServiceAccessory.d.ts +60 -0
  27. package/dist/multiServiceAccessory.d.ts.map +1 -0
  28. package/dist/multiServiceAccessory.js +398 -0
  29. package/dist/multiServiceAccessory.js.map +1 -0
  30. package/dist/platform.d.ts +42 -0
  31. package/dist/platform.d.ts.map +1 -0
  32. package/dist/platform.js +302 -0
  33. package/dist/platform.js.map +1 -0
  34. package/dist/services/airConditionerService.d.ts +52 -0
  35. package/dist/services/airConditionerService.d.ts.map +1 -0
  36. package/dist/services/airConditionerService.js +438 -0
  37. package/dist/services/airConditionerService.js.map +1 -0
  38. package/dist/services/baseService.d.ts +21 -0
  39. package/dist/services/baseService.d.ts.map +1 -0
  40. package/dist/services/baseService.js +63 -0
  41. package/dist/services/baseService.js.map +1 -0
  42. package/dist/services/batteryService.d.ts +10 -0
  43. package/dist/services/batteryService.d.ts.map +1 -0
  44. package/dist/services/batteryService.js +71 -0
  45. package/dist/services/batteryService.js.map +1 -0
  46. package/dist/services/carbonMonoxideDetector.d.ts +11 -0
  47. package/dist/services/carbonMonoxideDetector.d.ts.map +1 -0
  48. package/dist/services/carbonMonoxideDetector.js +28 -0
  49. package/dist/services/carbonMonoxideDetector.js.map +1 -0
  50. package/dist/services/contactSensorService.d.ts +10 -0
  51. package/dist/services/contactSensorService.d.ts.map +1 -0
  52. package/dist/services/contactSensorService.js +28 -0
  53. package/dist/services/contactSensorService.js.map +1 -0
  54. package/dist/services/doorService.d.ts +16 -0
  55. package/dist/services/doorService.d.ts.map +1 -0
  56. package/dist/services/doorService.js +138 -0
  57. package/dist/services/doorService.js.map +1 -0
  58. package/dist/services/fanSpeedService.d.ts +15 -0
  59. package/dist/services/fanSpeedService.d.ts.map +1 -0
  60. package/dist/services/fanSpeedService.js +153 -0
  61. package/dist/services/fanSpeedService.js.map +1 -0
  62. package/dist/services/fanSwitchLevelService.d.ts +14 -0
  63. package/dist/services/fanSwitchLevelService.d.ts.map +1 -0
  64. package/dist/services/fanSwitchLevelService.js +121 -0
  65. package/dist/services/fanSwitchLevelService.js.map +1 -0
  66. package/dist/services/humidityService.d.ts +10 -0
  67. package/dist/services/humidityService.d.ts.map +1 -0
  68. package/dist/services/humidityService.js +23 -0
  69. package/dist/services/humidityService.js.map +1 -0
  70. package/dist/services/leakDetector.d.ts +10 -0
  71. package/dist/services/leakDetector.d.ts.map +1 -0
  72. package/dist/services/leakDetector.js +27 -0
  73. package/dist/services/leakDetector.js.map +1 -0
  74. package/dist/services/lightSensorService.d.ts +10 -0
  75. package/dist/services/lightSensorService.d.ts.map +1 -0
  76. package/dist/services/lightSensorService.js +24 -0
  77. package/dist/services/lightSensorService.js.map +1 -0
  78. package/dist/services/lightService.d.ts +26 -0
  79. package/dist/services/lightService.d.ts.map +1 -0
  80. package/dist/services/lightService.js +340 -0
  81. package/dist/services/lightService.js.map +1 -0
  82. package/dist/services/lockService.d.ts +16 -0
  83. package/dist/services/lockService.d.ts.map +1 -0
  84. package/dist/services/lockService.js +128 -0
  85. package/dist/services/lockService.js.map +1 -0
  86. package/dist/services/motionService.d.ts +10 -0
  87. package/dist/services/motionService.d.ts.map +1 -0
  88. package/dist/services/motionService.js +23 -0
  89. package/dist/services/motionService.js.map +1 -0
  90. package/dist/services/occupancySensorService.d.ts +10 -0
  91. package/dist/services/occupancySensorService.d.ts.map +1 -0
  92. package/dist/services/occupancySensorService.js +23 -0
  93. package/dist/services/occupancySensorService.js.map +1 -0
  94. package/dist/services/sensorService.d.ts +15 -0
  95. package/dist/services/sensorService.d.ts.map +1 -0
  96. package/dist/services/sensorService.js +69 -0
  97. package/dist/services/sensorService.js.map +1 -0
  98. package/dist/services/smartThingsCommand.d.ts +7 -0
  99. package/dist/services/smartThingsCommand.d.ts.map +1 -0
  100. package/dist/services/smartThingsCommand.js +12 -0
  101. package/dist/services/smartThingsCommand.js.map +1 -0
  102. package/dist/services/smokeDetector.d.ts +10 -0
  103. package/dist/services/smokeDetector.d.ts.map +1 -0
  104. package/dist/services/smokeDetector.js +27 -0
  105. package/dist/services/smokeDetector.js.map +1 -0
  106. package/dist/services/statelessProgrammableSwitchService.d.ts +12 -0
  107. package/dist/services/statelessProgrammableSwitchService.d.ts.map +1 -0
  108. package/dist/services/statelessProgrammableSwitchService.js +94 -0
  109. package/dist/services/statelessProgrammableSwitchService.js.map +1 -0
  110. package/dist/services/switchService.d.ts +12 -0
  111. package/dist/services/switchService.d.ts.map +1 -0
  112. package/dist/services/switchService.js +72 -0
  113. package/dist/services/switchService.js.map +1 -0
  114. package/dist/services/temperatureService.d.ts +11 -0
  115. package/dist/services/temperatureService.d.ts.map +1 -0
  116. package/dist/services/temperatureService.js +32 -0
  117. package/dist/services/temperatureService.js.map +1 -0
  118. package/dist/services/thermostatService.d.ts +22 -0
  119. package/dist/services/thermostatService.d.ts.map +1 -0
  120. package/dist/services/thermostatService.js +273 -0
  121. package/dist/services/thermostatService.js.map +1 -0
  122. package/dist/services/valveService.d.ts +12 -0
  123. package/dist/services/valveService.d.ts.map +1 -0
  124. package/dist/services/valveService.js +59 -0
  125. package/dist/services/valveService.js.map +1 -0
  126. package/dist/services/windowCoveringService.d.ts +36 -0
  127. package/dist/services/windowCoveringService.d.ts.map +1 -0
  128. package/dist/services/windowCoveringService.js +158 -0
  129. package/dist/services/windowCoveringService.js.map +1 -0
  130. package/dist/settings.d.ts +9 -0
  131. package/dist/settings.d.ts.map +1 -0
  132. package/dist/settings.js +12 -0
  133. package/dist/settings.js.map +1 -0
  134. package/dist/webhook/subscriptionHandler.d.ts +32 -0
  135. package/dist/webhook/subscriptionHandler.d.ts.map +1 -0
  136. package/dist/webhook/subscriptionHandler.js +68 -0
  137. package/dist/webhook/subscriptionHandler.js.map +1 -0
  138. package/dist/webhook/webhookServer.d.ts +19 -0
  139. package/dist/webhook/webhookServer.d.ts.map +1 -0
  140. package/dist/webhook/webhookServer.js +125 -0
  141. package/dist/webhook/webhookServer.js.map +1 -0
  142. package/package.json +57 -0
@@ -0,0 +1,32 @@
1
+ import { IKHomeBridgeHomebridgePlatform } from '../platform';
2
+ import { MultiServiceAccessory } from '../multiServiceAccessory';
3
+ import { WebhookServer } from './webhookServer';
4
+ export interface ShortEvent {
5
+ deviceId: string;
6
+ value: any;
7
+ componentId: string;
8
+ capability: string;
9
+ attribute: string;
10
+ }
11
+ export interface RequestBody {
12
+ timeout: number;
13
+ deviceIds: string[];
14
+ }
15
+ export interface ResponseBody {
16
+ timeout: boolean;
17
+ events: ShortEvent[];
18
+ }
19
+ export declare class SubscriptionHandler {
20
+ private readonly webhookServer;
21
+ private config;
22
+ private devices;
23
+ private deviceIds;
24
+ private log;
25
+ private shutdown;
26
+ private axInstance;
27
+ constructor(platform: IKHomeBridgeHomebridgePlatform, devices: MultiServiceAccessory[], webhookServer: WebhookServer);
28
+ private handleDeviceEvent;
29
+ startService(): Promise<void>;
30
+ stopService(): void;
31
+ }
32
+ //# sourceMappingURL=subscriptionHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionHandler.d.ts","sourceRoot":"","sources":["../../src/webhook/subscriptionHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,qBAAa,mBAAmB;IAW5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAVhC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAsB;gBAGtC,QAAQ,EAAE,8BAA8B,EACxC,OAAO,EAAE,qBAAqB,EAAE,EACf,aAAa,EAAE,aAAa;IAwB/C,OAAO,CAAC,iBAAiB;IAOnB,YAAY;IAyBlB,WAAW;CAMZ"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubscriptionHandler = void 0;
4
+ //import { RequestBody, ResponseBody } from '../webhook/subscriptionHandler;
5
+ const axios = require("axios");
6
+ const keyValues_1 = require("../keyValues");
7
+ class SubscriptionHandler {
8
+ constructor(platform, devices, webhookServer) {
9
+ this.webhookServer = webhookServer;
10
+ this.devices = [];
11
+ this.deviceIds = [];
12
+ this.shutdown = false;
13
+ this.config = platform.config;
14
+ this.log = platform.log;
15
+ devices.forEach((device) => {
16
+ this.deviceIds.push(device.id);
17
+ });
18
+ this.devices = devices;
19
+ const headerDict = {
20
+ 'Authorization': 'Bearer: ' + this.config.WebhookToken,
21
+ 'Keep-Alive': 'timeout=120, max=1000',
22
+ };
23
+ this.axInstance = axios.default.create({
24
+ baseURL: keyValues_1.WEBHOOK_URL,
25
+ headers: headerDict,
26
+ timeout: 90000,
27
+ });
28
+ // Register event handler with webhook server
29
+ this.webhookServer.addEventHandler(this.handleDeviceEvent.bind(this));
30
+ }
31
+ handleDeviceEvent(event) {
32
+ const device = this.devices.find(device => device.id === event.deviceId);
33
+ if (device) {
34
+ device.processEvent(event);
35
+ }
36
+ }
37
+ async startService() {
38
+ this.log.debug('Starting subscription handler');
39
+ const request = {
40
+ timeout: 85000,
41
+ deviceIds: this.deviceIds,
42
+ };
43
+ while (!this.shutdown) {
44
+ this.log.debug('Posting request to web hook');
45
+ let response;
46
+ try {
47
+ response = await this.axInstance.post('clientrequest', request);
48
+ this.log.debug(`Received response from webhook ${JSON.stringify(response.data)}`);
49
+ const responseBody = response.data;
50
+ responseBody.events.forEach(event => {
51
+ this.handleDeviceEvent(event);
52
+ });
53
+ }
54
+ catch (error) {
55
+ this.log.error(`Could not connect to web hook service: ${error}. Will retry`);
56
+ await (0, keyValues_1.wait)(keyValues_1.WH_CONNECT_RETRY_MINUTES * 60);
57
+ }
58
+ }
59
+ }
60
+ stopService() {
61
+ this.shutdown = true;
62
+ if (this.webhookServer) {
63
+ this.webhookServer.stop();
64
+ }
65
+ }
66
+ }
67
+ exports.SubscriptionHandler = SubscriptionHandler;
68
+ //# sourceMappingURL=subscriptionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionHandler.js","sourceRoot":"","sources":["../../src/webhook/subscriptionHandler.ts"],"names":[],"mappings":";;;AAAA,4EAA4E;AAC5E,+BAAgC;AAIhC,4CAA2E;AAsB3E,MAAa,mBAAmB;IAQ9B,YACE,QAAwC,EACxC,OAAgC,EACf,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QATvC,YAAO,GAA4B,EAAE,CAAC;QACtC,cAAS,GAAa,EAAE,CAAC;QAEzB,aAAQ,GAAG,KAAK,CAAC;QAQvB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QACxB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,MAAM,UAAU,GAAG;YACjB,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY;YACtD,YAAY,EAAE,uBAAuB;SACtC,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACrC,OAAO,EAAE,uBAAW;YACpB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,iBAAiB,CAAC,KAAiB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SAC5B;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAgB;YAC3B,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;YACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC9C,IAAI,QAAQ,CAAC;YACb,IAAI;gBACF,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAChE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClF,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAoB,CAAC;gBACnD,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBAClC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;aACJ;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0CAA0C,KAAK,eAAe,CAAC,CAAC;gBAC/E,MAAM,IAAA,gBAAI,EAAC,oCAAwB,GAAG,EAAE,CAAC,CAAC;aAC3C;SACF;IACH,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SAC3B;IACH,CAAC;CACF;AAzED,kDAyEC"}
@@ -0,0 +1,19 @@
1
+ import { Logger } from 'homebridge';
2
+ import { IKHomeBridgeHomebridgePlatform } from '../platform';
3
+ import { SmartThingsAuth } from '../auth/auth';
4
+ import { ShortEvent } from './subscriptionHandler';
5
+ export declare class WebhookServer {
6
+ private readonly platform;
7
+ private readonly log;
8
+ private server;
9
+ private eventHandlers;
10
+ private authHandler;
11
+ constructor(platform: IKHomeBridgeHomebridgePlatform, log: Logger);
12
+ setAuthHandler(auth: SmartThingsAuth): void;
13
+ private handleOAuthCallback;
14
+ private handleDeviceEvent;
15
+ addEventHandler(handler: (event: ShortEvent) => void): void;
16
+ private notifyEventHandlers;
17
+ stop(): void;
18
+ }
19
+ //# sourceMappingURL=webhookServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhookServer.d.ts","sourceRoot":"","sources":["../../src/webhook/webhookServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGpC,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,qBAAa,aAAa;IAMtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,WAAW,CAAgC;gBAGhC,QAAQ,EAAE,8BAA8B,EACxC,GAAG,EAAE,MAAM;IAgCvB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;YAIpC,mBAAmB;YAanB,iBAAiB;IA0BxB,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAIlE,OAAO,CAAC,mBAAmB;IAUpB,IAAI,IAAI,IAAI;CAKpB"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.WebhookServer = void 0;
27
+ const http = __importStar(require("http"));
28
+ const url = __importStar(require("url"));
29
+ class WebhookServer {
30
+ constructor(platform, log) {
31
+ this.platform = platform;
32
+ this.log = log;
33
+ this.eventHandlers = [];
34
+ this.authHandler = null;
35
+ const port = this.platform.config.webhook_port || 3000;
36
+ this.server = http.createServer((req, res) => {
37
+ const parsedUrl = url.parse(req.url, true);
38
+ if (parsedUrl.pathname === '/oauth/callback') {
39
+ if (this.authHandler) {
40
+ this.handleOAuthCallback(parsedUrl.query, res);
41
+ }
42
+ else {
43
+ this.log.error('OAuth callback received but no auth handler registered');
44
+ res.writeHead(500, { 'Content-Type': 'text/html' });
45
+ res.end('<h1>Error: OAuth handler not initialized</h1>');
46
+ }
47
+ }
48
+ else if (parsedUrl.pathname === '/') {
49
+ this.handleDeviceEvent(req, res);
50
+ }
51
+ else {
52
+ res.writeHead(404);
53
+ res.end();
54
+ }
55
+ });
56
+ this.server.listen(port, () => {
57
+ this.log.info(`Webhook server listening on port ${port}`);
58
+ });
59
+ this.server.on('error', (error) => {
60
+ this.log.error('Webhook server error:', error);
61
+ });
62
+ }
63
+ setAuthHandler(auth) {
64
+ this.authHandler = auth;
65
+ }
66
+ async handleOAuthCallback(query, res) {
67
+ try {
68
+ if (!this.authHandler) {
69
+ throw new Error('No auth handler registered');
70
+ }
71
+ await this.authHandler.handleOAuthCallback(query, res);
72
+ }
73
+ catch (error) {
74
+ this.log.error('OAuth callback error:', error);
75
+ res.writeHead(500, { 'Content-Type': 'text/html' });
76
+ res.end('<h1>Authentication failed</h1><p>Please try again.</p>');
77
+ }
78
+ }
79
+ async handleDeviceEvent(req, res) {
80
+ try {
81
+ let body = '';
82
+ req.on('data', chunk => {
83
+ body += chunk.toString();
84
+ });
85
+ req.on('end', () => {
86
+ try {
87
+ const event = JSON.parse(body);
88
+ this.notifyEventHandlers(event);
89
+ res.writeHead(200);
90
+ res.end();
91
+ }
92
+ catch (error) {
93
+ this.log.error('Error parsing device event:', error);
94
+ res.writeHead(400);
95
+ res.end();
96
+ }
97
+ });
98
+ }
99
+ catch (error) {
100
+ this.log.error('Error handling device event:', error);
101
+ res.writeHead(500);
102
+ res.end();
103
+ }
104
+ }
105
+ addEventHandler(handler) {
106
+ this.eventHandlers.push(handler);
107
+ }
108
+ notifyEventHandlers(event) {
109
+ this.eventHandlers.forEach(handler => {
110
+ try {
111
+ handler(event);
112
+ }
113
+ catch (error) {
114
+ this.log.error('Error in event handler:', error);
115
+ }
116
+ });
117
+ }
118
+ stop() {
119
+ if (this.server) {
120
+ this.server.close();
121
+ }
122
+ }
123
+ }
124
+ exports.WebhookServer = WebhookServer;
125
+ //# sourceMappingURL=webhookServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhookServer.js","sourceRoot":"","sources":["../../src/webhook/webhookServer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "private": false,
3
+ "displayName": "SmartThings Plugin",
4
+ "name": "homebridge-smartthings-oauth",
5
+ "version": "1.0.0",
6
+ "description": "Connects SmartThings devices to Homebridge. Automatically discovers devices.",
7
+ "license": "Apache-2.0",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/aziz66/homebridge-smartthings.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/aziz66/homebridge-smartthings/issues"
14
+ },
15
+ "engines": {
16
+ "node": ">=18.0.0",
17
+ "homebridge": ">=1.3.5"
18
+ },
19
+ "main": "dist/index.js",
20
+ "scripts": {
21
+ "lint": "eslint src/**.ts",
22
+ "watch": "npm run build && npm link && nodemon",
23
+ "build": "rimraf ./dist && tsc",
24
+ "prepublishOnly": "npm run lint && npm run build"
25
+ },
26
+ "keywords": [
27
+ "homebridge-plugin",
28
+ "smartthings",
29
+ "homekit"
30
+ ],
31
+ "dependencies": {
32
+ "axios": "^1.0.0",
33
+ "homebridge-config-ui-x": "^4.51.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/express": "^4.17.14",
37
+ "@types/node": "^18.0.0",
38
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
39
+ "@typescript-eslint/parser": "^8.0.0",
40
+ "eslint": "^8.46.0",
41
+ "homebridge": "^1.3.5",
42
+ "nodemon": "^3.0.0",
43
+ "rimraf": "^5.0.0",
44
+ "ts-node": "^10.3.0",
45
+ "typescript": "^5.0.0"
46
+ },
47
+ "funding": [
48
+ {
49
+ "type": "paypal",
50
+ "url": "https://www.paypal.com/paypalme/iklein99"
51
+ },
52
+ {
53
+ "type": "venmo",
54
+ "url": "https://venmo.com/?txn=pay&audience=public&recipients=ira-klein-3"
55
+ }
56
+ ]
57
+ }