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.
- package/.devcontainer/Dockerfile +16 -0
- package/.devcontainer/devcontainer.json +36 -0
- package/LICENSE +176 -0
- package/README.md +114 -0
- package/config.schema.json +134 -0
- package/dist/auth/auth.d.ts +23 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +168 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/tokenManager.d.ts +36 -0
- package/dist/auth/tokenManager.d.ts.map +1 -0
- package/dist/auth/tokenManager.js +180 -0
- package/dist/auth/tokenManager.js.map +1 -0
- package/dist/basePlatformAccessory.d.ts +49 -0
- package/dist/basePlatformAccessory.d.ts.map +1 -0
- package/dist/basePlatformAccessory.js +209 -0
- package/dist/basePlatformAccessory.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/keyValues.d.ts +4 -0
- package/dist/keyValues.d.ts.map +1 -0
- package/dist/keyValues.js +12 -0
- package/dist/keyValues.js.map +1 -0
- package/dist/multiServiceAccessory.d.ts +60 -0
- package/dist/multiServiceAccessory.d.ts.map +1 -0
- package/dist/multiServiceAccessory.js +398 -0
- package/dist/multiServiceAccessory.js.map +1 -0
- package/dist/platform.d.ts +42 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +302 -0
- package/dist/platform.js.map +1 -0
- package/dist/services/airConditionerService.d.ts +52 -0
- package/dist/services/airConditionerService.d.ts.map +1 -0
- package/dist/services/airConditionerService.js +438 -0
- package/dist/services/airConditionerService.js.map +1 -0
- package/dist/services/baseService.d.ts +21 -0
- package/dist/services/baseService.d.ts.map +1 -0
- package/dist/services/baseService.js +63 -0
- package/dist/services/baseService.js.map +1 -0
- package/dist/services/batteryService.d.ts +10 -0
- package/dist/services/batteryService.d.ts.map +1 -0
- package/dist/services/batteryService.js +71 -0
- package/dist/services/batteryService.js.map +1 -0
- package/dist/services/carbonMonoxideDetector.d.ts +11 -0
- package/dist/services/carbonMonoxideDetector.d.ts.map +1 -0
- package/dist/services/carbonMonoxideDetector.js +28 -0
- package/dist/services/carbonMonoxideDetector.js.map +1 -0
- package/dist/services/contactSensorService.d.ts +10 -0
- package/dist/services/contactSensorService.d.ts.map +1 -0
- package/dist/services/contactSensorService.js +28 -0
- package/dist/services/contactSensorService.js.map +1 -0
- package/dist/services/doorService.d.ts +16 -0
- package/dist/services/doorService.d.ts.map +1 -0
- package/dist/services/doorService.js +138 -0
- package/dist/services/doorService.js.map +1 -0
- package/dist/services/fanSpeedService.d.ts +15 -0
- package/dist/services/fanSpeedService.d.ts.map +1 -0
- package/dist/services/fanSpeedService.js +153 -0
- package/dist/services/fanSpeedService.js.map +1 -0
- package/dist/services/fanSwitchLevelService.d.ts +14 -0
- package/dist/services/fanSwitchLevelService.d.ts.map +1 -0
- package/dist/services/fanSwitchLevelService.js +121 -0
- package/dist/services/fanSwitchLevelService.js.map +1 -0
- package/dist/services/humidityService.d.ts +10 -0
- package/dist/services/humidityService.d.ts.map +1 -0
- package/dist/services/humidityService.js +23 -0
- package/dist/services/humidityService.js.map +1 -0
- package/dist/services/leakDetector.d.ts +10 -0
- package/dist/services/leakDetector.d.ts.map +1 -0
- package/dist/services/leakDetector.js +27 -0
- package/dist/services/leakDetector.js.map +1 -0
- package/dist/services/lightSensorService.d.ts +10 -0
- package/dist/services/lightSensorService.d.ts.map +1 -0
- package/dist/services/lightSensorService.js +24 -0
- package/dist/services/lightSensorService.js.map +1 -0
- package/dist/services/lightService.d.ts +26 -0
- package/dist/services/lightService.d.ts.map +1 -0
- package/dist/services/lightService.js +340 -0
- package/dist/services/lightService.js.map +1 -0
- package/dist/services/lockService.d.ts +16 -0
- package/dist/services/lockService.d.ts.map +1 -0
- package/dist/services/lockService.js +128 -0
- package/dist/services/lockService.js.map +1 -0
- package/dist/services/motionService.d.ts +10 -0
- package/dist/services/motionService.d.ts.map +1 -0
- package/dist/services/motionService.js +23 -0
- package/dist/services/motionService.js.map +1 -0
- package/dist/services/occupancySensorService.d.ts +10 -0
- package/dist/services/occupancySensorService.d.ts.map +1 -0
- package/dist/services/occupancySensorService.js +23 -0
- package/dist/services/occupancySensorService.js.map +1 -0
- package/dist/services/sensorService.d.ts +15 -0
- package/dist/services/sensorService.d.ts.map +1 -0
- package/dist/services/sensorService.js +69 -0
- package/dist/services/sensorService.js.map +1 -0
- package/dist/services/smartThingsCommand.d.ts +7 -0
- package/dist/services/smartThingsCommand.d.ts.map +1 -0
- package/dist/services/smartThingsCommand.js +12 -0
- package/dist/services/smartThingsCommand.js.map +1 -0
- package/dist/services/smokeDetector.d.ts +10 -0
- package/dist/services/smokeDetector.d.ts.map +1 -0
- package/dist/services/smokeDetector.js +27 -0
- package/dist/services/smokeDetector.js.map +1 -0
- package/dist/services/statelessProgrammableSwitchService.d.ts +12 -0
- package/dist/services/statelessProgrammableSwitchService.d.ts.map +1 -0
- package/dist/services/statelessProgrammableSwitchService.js +94 -0
- package/dist/services/statelessProgrammableSwitchService.js.map +1 -0
- package/dist/services/switchService.d.ts +12 -0
- package/dist/services/switchService.d.ts.map +1 -0
- package/dist/services/switchService.js +72 -0
- package/dist/services/switchService.js.map +1 -0
- package/dist/services/temperatureService.d.ts +11 -0
- package/dist/services/temperatureService.d.ts.map +1 -0
- package/dist/services/temperatureService.js +32 -0
- package/dist/services/temperatureService.js.map +1 -0
- package/dist/services/thermostatService.d.ts +22 -0
- package/dist/services/thermostatService.d.ts.map +1 -0
- package/dist/services/thermostatService.js +273 -0
- package/dist/services/thermostatService.js.map +1 -0
- package/dist/services/valveService.d.ts +12 -0
- package/dist/services/valveService.d.ts.map +1 -0
- package/dist/services/valveService.js +59 -0
- package/dist/services/valveService.js.map +1 -0
- package/dist/services/windowCoveringService.d.ts +36 -0
- package/dist/services/windowCoveringService.d.ts.map +1 -0
- package/dist/services/windowCoveringService.js +158 -0
- package/dist/services/windowCoveringService.js.map +1 -0
- package/dist/settings.d.ts +9 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +12 -0
- package/dist/settings.js.map +1 -0
- package/dist/webhook/subscriptionHandler.d.ts +32 -0
- package/dist/webhook/subscriptionHandler.d.ts.map +1 -0
- package/dist/webhook/subscriptionHandler.js +68 -0
- package/dist/webhook/subscriptionHandler.js.map +1 -0
- package/dist/webhook/webhookServer.d.ts +19 -0
- package/dist/webhook/webhookServer.d.ts.map +1 -0
- package/dist/webhook/webhookServer.js +125 -0
- package/dist/webhook/webhookServer.js.map +1 -0
- 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
|
+
}
|