homebridge 2.0.0-alpha.42 → 2.0.0-alpha.43
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/dist/api.d.ts +34 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +28 -0
- package/dist/api.js.map +1 -1
- package/dist/bridgeService.d.ts +9 -2
- package/dist/bridgeService.d.ts.map +1 -1
- package/dist/bridgeService.js +14 -3
- package/dist/bridgeService.js.map +1 -1
- package/dist/bridgeTypes.d.ts +54 -0
- package/dist/bridgeTypes.d.ts.map +1 -0
- package/dist/bridgeTypes.js +8 -0
- package/dist/bridgeTypes.js.map +1 -0
- package/dist/childBridgeFork.d.ts +6 -2
- package/dist/childBridgeFork.d.ts.map +1 -1
- package/dist/childBridgeFork.js +58 -16
- package/dist/childBridgeFork.js.map +1 -1
- package/dist/childBridgeService.d.ts +20 -6
- package/dist/childBridgeService.d.ts.map +1 -1
- package/dist/childBridgeService.js +25 -2
- package/dist/childBridgeService.js.map +1 -1
- package/dist/matter/matterServer.d.ts +1 -0
- package/dist/matter/matterServer.d.ts.map +1 -1
- package/dist/matter/matterServer.js +74 -12
- package/dist/matter/matterServer.js.map +1 -1
- package/dist/matter/matterSharedTypes.d.ts +15 -17
- package/dist/matter/matterSharedTypes.d.ts.map +1 -1
- package/dist/matter/matterSharedTypes.js +3 -0
- package/dist/matter/matterSharedTypes.js.map +1 -1
- package/dist/matter/matterStorage.d.ts +7 -3
- package/dist/matter/matterStorage.d.ts.map +1 -1
- package/dist/matter/matterStorage.js +124 -37
- package/dist/matter/matterStorage.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +67 -18
- package/dist/server.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import type { BaseBridgeMetadata, BaseCommissioningInfo } from '../bridgeTypes.js';
|
|
1
2
|
/**
|
|
2
3
|
* Shared Matter Types
|
|
3
4
|
*
|
|
4
5
|
* These types are used by both the homebridge core and the UI
|
|
5
6
|
* to ensure consistency across the Matter implementation.
|
|
7
|
+
*
|
|
8
|
+
* Matter-specific interfaces extend the base bridge types for
|
|
9
|
+
* consistency with HAP child bridges.
|
|
6
10
|
*/
|
|
7
11
|
/**
|
|
8
12
|
* Matter bridge status states
|
|
@@ -23,45 +27,39 @@ export declare enum MatterBridgeStatus {
|
|
|
23
27
|
}
|
|
24
28
|
/**
|
|
25
29
|
* Metadata for a Matter bridge instance
|
|
30
|
+
*
|
|
31
|
+
* Extends the base bridge metadata with Matter-specific properties.
|
|
32
|
+
* This ensures consistency with HAP child bridge metadata.
|
|
26
33
|
*/
|
|
27
|
-
export interface MatterBridgeMetadata {
|
|
28
|
-
/** Bridge type identifier */
|
|
34
|
+
export interface MatterBridgeMetadata extends Omit<BaseBridgeMetadata, 'type' | 'status'> {
|
|
35
|
+
/** Bridge type identifier (always 'matter') */
|
|
29
36
|
type: 'matter';
|
|
30
37
|
/** Current operational status */
|
|
31
38
|
status: MatterBridgeStatus;
|
|
32
|
-
/** Matter server port */
|
|
33
|
-
port?: number;
|
|
34
39
|
/** QR code payload for commissioning */
|
|
35
40
|
qrCode?: string;
|
|
36
41
|
/** Manual pairing code for commissioning */
|
|
37
42
|
manualPairingCode?: string;
|
|
38
43
|
/** Device serial number */
|
|
39
44
|
serialNumber?: string;
|
|
40
|
-
/** Display name of the bridge */
|
|
41
|
-
name: string;
|
|
42
|
-
/** Plugin identifier */
|
|
43
|
-
plugin: string;
|
|
44
|
-
/** Unique identifier for this bridge instance */
|
|
45
|
-
identifier: string;
|
|
46
45
|
/** Number of devices exposed by this bridge */
|
|
47
46
|
deviceCount: number;
|
|
48
|
-
/** Whether the bridge was manually stopped */
|
|
49
|
-
manuallyStopped?: boolean;
|
|
50
|
-
/** Process ID of the bridge if running as child process */
|
|
51
|
-
pid?: number;
|
|
52
47
|
/** Whether the bridge has been commissioned */
|
|
53
48
|
commissioned?: boolean;
|
|
54
49
|
}
|
|
55
50
|
/**
|
|
56
51
|
* Matter commissioning information
|
|
52
|
+
*
|
|
53
|
+
* Extends the base commissioning info with Matter-specific properties.
|
|
54
|
+
* This ensures consistency with HAP pairing information.
|
|
57
55
|
*/
|
|
58
|
-
export interface MatterCommissioningInfo {
|
|
56
|
+
export interface MatterCommissioningInfo extends Omit<BaseCommissioningInfo, 'type' | 'commissioned'> {
|
|
57
|
+
/** Bridge type (always 'matter') */
|
|
58
|
+
type?: 'matter';
|
|
59
59
|
/** QR code payload for commissioning */
|
|
60
60
|
qrCode?: string;
|
|
61
61
|
/** Manual pairing code for commissioning */
|
|
62
62
|
manualPairingCode?: string;
|
|
63
|
-
/** Device serial number */
|
|
64
|
-
serialNumber?: string;
|
|
65
63
|
/** Whether the device is commissioned */
|
|
66
64
|
commissioned: boolean;
|
|
67
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matterSharedTypes.d.ts","sourceRoot":"","sources":["../../src/matter/matterSharedTypes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"matterSharedTypes.d.ts","sourceRoot":"","sources":["../../src/matter/matterSharedTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* These types are used by both the homebridge core and the UI
|
|
5
5
|
* to ensure consistency across the Matter implementation.
|
|
6
|
+
*
|
|
7
|
+
* Matter-specific interfaces extend the base bridge types for
|
|
8
|
+
* consistency with HAP child bridges.
|
|
6
9
|
*/
|
|
7
10
|
/**
|
|
8
11
|
* Matter bridge status states
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matterSharedTypes.js","sourceRoot":"","sources":["../../src/matter/matterSharedTypes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"matterSharedTypes.js","sourceRoot":"","sources":["../../src/matter/matterSharedTypes.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,kBAeX;AAfD,WAAY,kBAAkB;IAC5B;;OAEG;IACH,yCAAmB,CAAA;IAEnB;;OAEG;IACH,+BAAS,CAAA;IAET;;OAEG;IACH,mCAAa,CAAA;AACf,CAAC,EAfW,kBAAkB,KAAlB,kBAAkB,QAe7B;AAiGD;;GAEG;AACH,MAAM,CAAN,IAAY,sBAqBX;AArBD,WAAY,sBAAsB;IAChC,kDAAkD;IAClD,yCAAe,CAAA;IACf,uCAAuC;IACvC,uCAAa,CAAA;IACb,kCAAkC;IAClC,2CAAiB,CAAA;IACjB,+CAA+C;IAC/C,yCAAe,CAAA;IACf,mDAAmD;IACnD,2CAAiB,CAAA;IACjB,6CAA6C;IAC7C,wDAA8B,CAAA;IAC9B,gDAAgD;IAChD,8DAAoC,CAAA;IACpC,0CAA0C;IAC1C,wDAA8B,CAAA;IAC9B,2CAA2C;IAC3C,yCAAe,CAAA;IACf,iCAAiC;IACjC,+CAAqB,CAAA;AACvB,CAAC,EArBW,sBAAsB,KAAtB,sBAAsB,QAqBjC"}
|
|
@@ -4,13 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare class HomebridgeMatterStorage {
|
|
6
6
|
private namespace;
|
|
7
|
-
private storagePath;
|
|
8
7
|
private storage;
|
|
9
|
-
private filePath;
|
|
8
|
+
private readonly filePath;
|
|
10
9
|
private isInitialized;
|
|
11
|
-
private initializationPromise;
|
|
12
10
|
private writeTimer;
|
|
13
11
|
private pendingWrite;
|
|
12
|
+
private persistLock;
|
|
14
13
|
constructor(namespace: string, storagePath: string);
|
|
15
14
|
/**
|
|
16
15
|
* Synchronously initialize storage by loading existing data
|
|
@@ -26,6 +25,11 @@ export declare class HomebridgeMatterStorage {
|
|
|
26
25
|
* Build a context key from an array of contexts
|
|
27
26
|
*/
|
|
28
27
|
private buildContextKey;
|
|
28
|
+
/**
|
|
29
|
+
* Recursively convert special serialized types back to their original types
|
|
30
|
+
* This handles cases where objects weren't fully deserialized by the JSON reviver
|
|
31
|
+
*/
|
|
32
|
+
private deserializeValue;
|
|
29
33
|
/**
|
|
30
34
|
* Get a value from storage (Matter.js interface)
|
|
31
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matterStorage.d.ts","sourceRoot":"","sources":["../../src/matter/matterStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"matterStorage.d.ts","sourceRoot":"","sources":["../../src/matter/matterStorage.ts"],"names":[],"mappings":"AAqBA;;;GAGG;AACH,qBAAa,uBAAuB;IAShC,OAAO,CAAC,SAAS;IARnB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,WAAW,CAA6B;gBAGtC,SAAS,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM;IASrB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAgCtB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IA6CzD;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAC1D,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAkB9D;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ7C;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAsBlC;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IA8BlC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IA+BtC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAQ7C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAwBlE;;OAEG;YACW,eAAe;IAsB7B;;OAEG;YACW,OAAO;IAqDrB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACH,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAOjE;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAGnB,OAAO,CAAC,WAAW;IAF/B,OAAO,CAAC,QAAQ,CAAkD;gBAE9C,WAAW,EAAE,MAAM;IAEvC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB;IAStD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAG3E"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Provides persistent storage for Matter fabric data and device configuration.
|
|
6
6
|
* This ensures commissioning data persists across Homebridge restarts.
|
|
7
7
|
*/
|
|
8
|
+
import { Buffer } from 'node:buffer';
|
|
8
9
|
import * as fs from 'node:fs';
|
|
9
10
|
import * as fsp from 'node:fs/promises';
|
|
10
11
|
import * as path from 'node:path';
|
|
@@ -18,16 +19,14 @@ const STORAGE_WRITE_DEBOUNCE_MS = 100; // Delay for non-critical writes
|
|
|
18
19
|
*/
|
|
19
20
|
export class HomebridgeMatterStorage {
|
|
20
21
|
namespace;
|
|
21
|
-
storagePath;
|
|
22
22
|
storage = new Map();
|
|
23
23
|
filePath;
|
|
24
24
|
isInitialized = false;
|
|
25
|
-
initializationPromise = null;
|
|
26
25
|
writeTimer = null;
|
|
27
26
|
pendingWrite = false;
|
|
27
|
+
persistLock = null;
|
|
28
28
|
constructor(namespace, storagePath) {
|
|
29
29
|
this.namespace = namespace;
|
|
30
|
-
this.storagePath = storagePath;
|
|
31
30
|
this.filePath = path.join(storagePath, `${namespace}.json`);
|
|
32
31
|
// Synchronously load existing data to avoid race conditions with Matter.js
|
|
33
32
|
// Matter.js expects storage to be immediately available
|
|
@@ -40,16 +39,16 @@ export class HomebridgeMatterStorage {
|
|
|
40
39
|
initializeSync() {
|
|
41
40
|
try {
|
|
42
41
|
const fileContent = fs.readFileSync(this.filePath, 'utf-8');
|
|
43
|
-
//
|
|
44
|
-
const data = JSON.parse(fileContent
|
|
45
|
-
if (value && typeof value === 'object' && value.__type === 'bigint') {
|
|
46
|
-
return BigInt(value.value);
|
|
47
|
-
}
|
|
48
|
-
return value;
|
|
49
|
-
});
|
|
42
|
+
// Parse WITHOUT a reviver - we'll deserialize manually
|
|
43
|
+
const data = JSON.parse(fileContent);
|
|
50
44
|
// Ensure data is valid before loading
|
|
51
45
|
if (data && typeof data === 'object') {
|
|
52
|
-
|
|
46
|
+
// Deserialize ALL values as we load them into the Map
|
|
47
|
+
const entries = Object.entries(data).map(([key, value]) => [
|
|
48
|
+
key,
|
|
49
|
+
this.deserializeValue(value),
|
|
50
|
+
]);
|
|
51
|
+
this.storage = new Map(entries);
|
|
53
52
|
log.debug(`Loaded ${this.storage.size} entries for namespace: ${this.namespace}`);
|
|
54
53
|
}
|
|
55
54
|
else {
|
|
@@ -84,13 +83,81 @@ export class HomebridgeMatterStorage {
|
|
|
84
83
|
buildContextKey(contexts) {
|
|
85
84
|
return contexts.join('.');
|
|
86
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Recursively convert special serialized types back to their original types
|
|
88
|
+
* This handles cases where objects weren't fully deserialized by the JSON reviver
|
|
89
|
+
*/
|
|
90
|
+
deserializeValue(value) {
|
|
91
|
+
if (value && typeof value === 'object') {
|
|
92
|
+
// Handle special type markers
|
|
93
|
+
const obj = value;
|
|
94
|
+
if (obj.__type === 'bigint' && typeof obj.value === 'string') {
|
|
95
|
+
return BigInt(obj.value);
|
|
96
|
+
}
|
|
97
|
+
if (obj.__type === 'Uint8Array' && Array.isArray(obj.value)) {
|
|
98
|
+
return new Uint8Array(obj.value);
|
|
99
|
+
}
|
|
100
|
+
// Handle Node.js Buffer JSON format: {type: "Buffer", data: [...]}
|
|
101
|
+
if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
|
|
102
|
+
return new Uint8Array(obj.data);
|
|
103
|
+
}
|
|
104
|
+
// Recursively process arrays
|
|
105
|
+
if (Array.isArray(value)) {
|
|
106
|
+
return value.map(item => this.deserializeValue(item));
|
|
107
|
+
}
|
|
108
|
+
// Recursively process plain objects
|
|
109
|
+
if (Object.getPrototypeOf(value) === Object.prototype) {
|
|
110
|
+
const result = {};
|
|
111
|
+
for (const [k, v] of Object.entries(value)) {
|
|
112
|
+
result[k] = this.deserializeValue(v);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
87
119
|
/**
|
|
88
120
|
* Get a value from storage (Matter.js interface)
|
|
89
121
|
*/
|
|
90
122
|
get(contexts, key) {
|
|
91
123
|
// Storage is initialized in constructor, so this should always work
|
|
92
124
|
const fullKey = contexts.length ? `${this.buildContextKey(contexts)}.${key}` : key;
|
|
93
|
-
|
|
125
|
+
const value = this.storage.get(fullKey);
|
|
126
|
+
// Debug logging for fabric data
|
|
127
|
+
if (fullKey.includes('fabric')) {
|
|
128
|
+
log.info(`[STORAGE GET] ${fullKey}`);
|
|
129
|
+
log.info(` Before deserialize: type=${typeof value}, constructor=${value?.constructor?.name}, isUint8Array=${value instanceof Uint8Array}`);
|
|
130
|
+
if (value && typeof value === 'object' && !(value instanceof Uint8Array)) {
|
|
131
|
+
const obj = value;
|
|
132
|
+
if (obj.__type) {
|
|
133
|
+
log.info(` Has __type: ${obj.__type}`);
|
|
134
|
+
}
|
|
135
|
+
// Check for nested Uint8Arrays
|
|
136
|
+
for (const key of Object.keys(obj).slice(0, 5)) {
|
|
137
|
+
const val = obj[key];
|
|
138
|
+
if (val && typeof val === 'object') {
|
|
139
|
+
log.info(` ${key}: type=${typeof val}, constructor=${val?.constructor?.name}, __type=${val.__type}, isUint8Array=${val instanceof Uint8Array}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Ensure value is fully deserialized (handles nested special types)
|
|
145
|
+
const result = this.deserializeValue(value);
|
|
146
|
+
// Debug logging after deserialization
|
|
147
|
+
if (fullKey.includes('fabric')) {
|
|
148
|
+
log.info(` After deserialize: type=${typeof result}, constructor=${result?.constructor?.name}, isUint8Array=${result instanceof Uint8Array}`);
|
|
149
|
+
if (result && typeof result === 'object' && !(result instanceof Uint8Array)) {
|
|
150
|
+
const obj = result;
|
|
151
|
+
// Check for nested Uint8Arrays
|
|
152
|
+
for (const key of Object.keys(obj).slice(0, 5)) {
|
|
153
|
+
const val = obj[key];
|
|
154
|
+
if (val && typeof val === 'object') {
|
|
155
|
+
log.info(` ${key}: isUint8Array=${val instanceof Uint8Array}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return result;
|
|
94
161
|
}
|
|
95
162
|
set(contexts, keyOrValues, value) {
|
|
96
163
|
const contextKey = this.buildContextKey(contexts);
|
|
@@ -222,13 +289,13 @@ export class HomebridgeMatterStorage {
|
|
|
222
289
|
if (key.startsWith(prefix)) {
|
|
223
290
|
const subKey = key.substring(prefix.length);
|
|
224
291
|
if (!subKey.includes('.')) {
|
|
225
|
-
values[subKey] = value;
|
|
292
|
+
values[subKey] = this.deserializeValue(value);
|
|
226
293
|
}
|
|
227
294
|
}
|
|
228
295
|
}
|
|
229
296
|
else {
|
|
230
297
|
if (!key.includes('.')) {
|
|
231
|
-
values[key] = value;
|
|
298
|
+
values[key] = this.deserializeValue(value);
|
|
232
299
|
}
|
|
233
300
|
}
|
|
234
301
|
}
|
|
@@ -258,32 +325,52 @@ export class HomebridgeMatterStorage {
|
|
|
258
325
|
* Persist storage to disk with atomic write
|
|
259
326
|
*/
|
|
260
327
|
async persist() {
|
|
328
|
+
// Wait for any in-progress persist operation to complete
|
|
329
|
+
if (this.persistLock) {
|
|
330
|
+
await this.persistLock;
|
|
331
|
+
}
|
|
261
332
|
if (!this.pendingWrite) {
|
|
262
333
|
return;
|
|
263
334
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
335
|
+
// Create a new lock for this persist operation
|
|
336
|
+
this.persistLock = (async () => {
|
|
337
|
+
try {
|
|
338
|
+
const data = Object.fromEntries(this.storage.entries());
|
|
339
|
+
const dir = path.dirname(this.filePath);
|
|
340
|
+
// Ensure directory exists
|
|
341
|
+
await fsp.mkdir(dir, { recursive: true });
|
|
342
|
+
// Atomic write: write to temp file then rename
|
|
343
|
+
// Use a unique temp file to avoid conflicts
|
|
344
|
+
const tempFile = `${this.filePath}.tmp.${Date.now()}`;
|
|
345
|
+
// Custom replacer to handle BigInt, Uint8Array, and Buffer serialization
|
|
346
|
+
const jsonString = JSON.stringify(data, (_key, value) => {
|
|
347
|
+
if (typeof value === 'bigint') {
|
|
348
|
+
return { __type: 'bigint', value: value.toString() };
|
|
349
|
+
}
|
|
350
|
+
// Handle Buffer before Uint8Array since Buffer extends Uint8Array
|
|
351
|
+
// Note: Buffer.toJSON() returns {type: 'Buffer', data: [...]}, but we want consistent format
|
|
352
|
+
if (Buffer.isBuffer(value)) {
|
|
353
|
+
return { __type: 'Uint8Array', value: Array.from(value) };
|
|
354
|
+
}
|
|
355
|
+
if (value instanceof Uint8Array) {
|
|
356
|
+
return { __type: 'Uint8Array', value: Array.from(value) };
|
|
357
|
+
}
|
|
358
|
+
return value;
|
|
359
|
+
}, 2);
|
|
360
|
+
await fsp.writeFile(tempFile, jsonString, 'utf-8');
|
|
361
|
+
await fsp.rename(tempFile, this.filePath);
|
|
362
|
+
this.pendingWrite = false;
|
|
363
|
+
log.debug(`Persisted ${this.storage.size} entries for namespace: ${this.namespace}`);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
log.error(`Failed to persist storage for ${this.namespace}:`, error);
|
|
367
|
+
// Don't throw - we don't want to break Matter operations
|
|
368
|
+
}
|
|
369
|
+
finally {
|
|
370
|
+
this.persistLock = null;
|
|
371
|
+
}
|
|
372
|
+
})();
|
|
373
|
+
await this.persistLock;
|
|
287
374
|
}
|
|
288
375
|
/**
|
|
289
376
|
* Force immediate persist (for shutdown)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matterStorage.js","sourceRoot":"","sources":["../../src/matter/matterStorage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"matterStorage.js","sourceRoot":"","sources":["../../src/matter/matterStorage.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -62,6 +62,12 @@ export declare class Server {
|
|
|
62
62
|
private static loadConfig;
|
|
63
63
|
private loadAccessories;
|
|
64
64
|
private loadPlatforms;
|
|
65
|
+
/**
|
|
66
|
+
* Generate a unique identifier for a child bridge
|
|
67
|
+
* - For HAP bridges: returns the uppercase MAC address
|
|
68
|
+
* - For Matter-only bridges: returns "matter-{plugin}-{identifier}"
|
|
69
|
+
*/
|
|
70
|
+
private getChildBridgeKey;
|
|
65
71
|
/**
|
|
66
72
|
* Validate an external bridge config
|
|
67
73
|
*/
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,iBAAiB;IAChC,6BAA6B,CAAC,EAAE,OAAO,CAAA;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAGD,0BAAkB,YAAY;IAC5B;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,EAAE,OAAO;IAET;;OAEG;IACH,IAAI,SAAS;CACd;AAED,qBAAa,MAAM;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,iBAAiB;IAChC,6BAA6B,CAAC,EAAE,OAAO,CAAA;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAGD,0BAAkB,YAAY;IAC5B;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,EAAE,OAAO;IAET;;OAEG;IACH,IAAI,SAAS;CACd;AAED,qBAAa,MAAM;IA0Bf,OAAO,CAAC,OAAO;IAzBjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IAEzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAIzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAG1E,OAAO,CAAC,YAAY,CAAC,CAAc;IAGnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;IAG/E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IAGzE,OAAO,CAAC,YAAY,CAAqC;gBAG/C,OAAO,GAAE,iBAAsB;IAmEzC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCnC;;OAEG;YACW,sBAAsB;IAiEpC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IA2B3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gCAAgC;IAMxC,OAAO,CAAC,iCAAiC;IAKzC,OAAO,CAAC,mCAAmC;IAK3C,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,+BAA+B;IAQvC,OAAO,CAAC,gCAAgC;IAQxC,OAAO,CAAC,MAAM,CAAC,UAAU;IA2IzB,OAAO,CAAC,eAAe;IA8GvB,OAAO,CAAC,aAAa;IAuGrB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAgEjC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA+NlC,OAAO,CAAC,cAAc;CAmBvB"}
|
package/dist/server.js
CHANGED
|
@@ -38,6 +38,7 @@ export class Server {
|
|
|
38
38
|
externalPortService;
|
|
39
39
|
config;
|
|
40
40
|
// used to keep track of child bridges
|
|
41
|
+
// Key is either HAP username (MAC address) or Matter-only identifier (e.g., "matter-plugin-platform")
|
|
41
42
|
childBridges = new Map();
|
|
42
43
|
// Matter server instance for main bridge (if enabled)
|
|
43
44
|
matterServer;
|
|
@@ -170,6 +171,8 @@ export class Server {
|
|
|
170
171
|
// Start the Matter server
|
|
171
172
|
await this.matterServer.start();
|
|
172
173
|
log.info('Matter server initialized for main bridge');
|
|
174
|
+
// Inform the API that Matter is enabled
|
|
175
|
+
this.api._setMatterEnabled(true);
|
|
173
176
|
// Send Matter status update to notify UI that Matter server is ready
|
|
174
177
|
if (this.config.bridge.disableIpc !== true) {
|
|
175
178
|
this.sendMainBridgeMatterStatusUpdate();
|
|
@@ -239,6 +242,7 @@ export class Server {
|
|
|
239
242
|
}
|
|
240
243
|
publishBridge() {
|
|
241
244
|
this.bridgeService.publishBridge();
|
|
245
|
+
// Main bridge always has a pin (validated in loadConfig)
|
|
242
246
|
this.printSetupInfo(this.config.bridge.pin);
|
|
243
247
|
}
|
|
244
248
|
handlePublishExternalAccessories(accessories) {
|
|
@@ -318,6 +322,7 @@ export class Server {
|
|
|
318
322
|
bridge.username = bridge.username || defaultBridge.username;
|
|
319
323
|
bridge.pin = bridge.pin || defaultBridge.pin;
|
|
320
324
|
config.bridge = bridge;
|
|
325
|
+
// Main bridge username is always required and must be valid
|
|
321
326
|
const username = config.bridge.username;
|
|
322
327
|
if (!validMacAddress(username)) {
|
|
323
328
|
throw new Error(`Not a valid username: ${username}. Must be 6 pairs of colon-separated hexadecimal chars (A-F 0-9), like a MAC address.`);
|
|
@@ -429,26 +434,31 @@ export class Server {
|
|
|
429
434
|
}
|
|
430
435
|
const logger = Logger.withPrefix(displayName);
|
|
431
436
|
logger('Initializing %s accessory...', accessoryIdentifier);
|
|
432
|
-
// Handle child HAP
|
|
437
|
+
// Handle child bridge (HAP, Matter-only, or HAP+Matter)
|
|
433
438
|
if (accessoryConfig._bridge) {
|
|
434
|
-
//
|
|
435
|
-
|
|
439
|
+
// Ensure the username is always uppercase if it exists (HAP bridges only)
|
|
440
|
+
if (accessoryConfig._bridge.username) {
|
|
441
|
+
accessoryConfig._bridge.username = accessoryConfig._bridge.username.toUpperCase();
|
|
442
|
+
}
|
|
443
|
+
// Generate unique key for this child bridge
|
|
444
|
+
const bridgeKey = this.getChildBridgeKey("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, plugin.getPluginIdentifier(), accessoryConfig._bridge);
|
|
436
445
|
try {
|
|
437
|
-
this.validateChildBridgeConfig("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, accessoryConfig._bridge);
|
|
446
|
+
this.validateChildBridgeConfig("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, plugin.getPluginIdentifier(), accessoryConfig._bridge, bridgeKey);
|
|
438
447
|
}
|
|
439
448
|
catch (error) {
|
|
440
449
|
log.error(error.message);
|
|
441
450
|
return;
|
|
442
451
|
}
|
|
443
452
|
let childBridge;
|
|
444
|
-
if (this.childBridges.has(
|
|
445
|
-
childBridge = this.childBridges.get(
|
|
446
|
-
logger(`Adding to existing child bridge ${
|
|
453
|
+
if (this.childBridges.has(bridgeKey)) {
|
|
454
|
+
childBridge = this.childBridges.get(bridgeKey);
|
|
455
|
+
logger(`Adding to existing child bridge ${bridgeKey}`);
|
|
447
456
|
}
|
|
448
457
|
else {
|
|
449
|
-
|
|
458
|
+
const bridgeType = accessoryConfig._bridge.matterOnly ? 'Matter-only' : 'HAP';
|
|
459
|
+
logger(`Initializing ${bridgeType} child bridge ${bridgeKey}`);
|
|
450
460
|
childBridge = new ChildBridgeService("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, plugin, accessoryConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
|
|
451
|
-
this.childBridges.set(
|
|
461
|
+
this.childBridges.set(bridgeKey, childBridge);
|
|
452
462
|
}
|
|
453
463
|
// add config to child bridge service
|
|
454
464
|
childBridge.addConfig(accessoryConfig);
|
|
@@ -511,20 +521,25 @@ export class Server {
|
|
|
511
521
|
}
|
|
512
522
|
const logger = Logger.withPrefix(displayName);
|
|
513
523
|
logger('Initializing %s platform...', platformIdentifier);
|
|
514
|
-
// Handle child HAP
|
|
524
|
+
// Handle child bridge (HAP, Matter-only, or HAP+Matter)
|
|
515
525
|
if (platformConfig._bridge) {
|
|
516
|
-
//
|
|
517
|
-
|
|
526
|
+
// Ensure the username is always uppercase if it exists (HAP bridges only)
|
|
527
|
+
if (platformConfig._bridge.username) {
|
|
528
|
+
platformConfig._bridge.username = platformConfig._bridge.username.toUpperCase();
|
|
529
|
+
}
|
|
530
|
+
// Generate unique key for this child bridge
|
|
531
|
+
const bridgeKey = this.getChildBridgeKey("platform" /* PluginType.PLATFORM */, platformIdentifier, plugin.getPluginIdentifier(), platformConfig._bridge);
|
|
518
532
|
try {
|
|
519
|
-
this.validateChildBridgeConfig("platform" /* PluginType.PLATFORM */, platformIdentifier, platformConfig._bridge);
|
|
533
|
+
this.validateChildBridgeConfig("platform" /* PluginType.PLATFORM */, platformIdentifier, plugin.getPluginIdentifier(), platformConfig._bridge, bridgeKey);
|
|
520
534
|
}
|
|
521
535
|
catch (error) {
|
|
522
536
|
log.error(error.message);
|
|
523
537
|
return;
|
|
524
538
|
}
|
|
525
|
-
|
|
539
|
+
const bridgeType = platformConfig._bridge.matterOnly ? 'Matter-only' : 'HAP';
|
|
540
|
+
logger(`Initializing ${bridgeType} child bridge ${bridgeKey}`);
|
|
526
541
|
const childBridge = new ChildBridgeService("platform" /* PluginType.PLATFORM */, platformIdentifier, plugin, platformConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
|
|
527
|
-
this.childBridges.set(
|
|
542
|
+
this.childBridges.set(bridgeKey, childBridge);
|
|
528
543
|
// add config to child bridge service
|
|
529
544
|
childBridge.addConfig(platformConfig);
|
|
530
545
|
// Matter for child bridges is handled inside the forked child process (childBridgeFork.ts)
|
|
@@ -545,16 +560,48 @@ export class Server {
|
|
|
545
560
|
});
|
|
546
561
|
return promises;
|
|
547
562
|
}
|
|
563
|
+
/**
|
|
564
|
+
* Generate a unique identifier for a child bridge
|
|
565
|
+
* - For HAP bridges: returns the uppercase MAC address
|
|
566
|
+
* - For Matter-only bridges: returns "matter-{plugin}-{identifier}"
|
|
567
|
+
*/
|
|
568
|
+
getChildBridgeKey(type, identifier, pluginName, bridgeConfig) {
|
|
569
|
+
if (bridgeConfig.matterOnly) {
|
|
570
|
+
// Matter-only bridge: generate identifier from plugin and platform/accessory name
|
|
571
|
+
return `matter-${pluginName}-${identifier}`;
|
|
572
|
+
}
|
|
573
|
+
// HAP bridge: use MAC address (already validated and uppercased)
|
|
574
|
+
return bridgeConfig.username.toUpperCase();
|
|
575
|
+
}
|
|
548
576
|
/**
|
|
549
577
|
* Validate an external bridge config
|
|
550
578
|
*/
|
|
551
|
-
validateChildBridgeConfig(type, identifier, bridgeConfig) {
|
|
579
|
+
validateChildBridgeConfig(type, identifier, pluginName, bridgeConfig, bridgeKey) {
|
|
580
|
+
// Matter-only bridges don't require HAP fields
|
|
581
|
+
if (bridgeConfig.matterOnly) {
|
|
582
|
+
if (!bridgeConfig.matter) {
|
|
583
|
+
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
584
|
+
+ 'Matter-only bridge must have a "matter" configuration block in _bridge.matter.');
|
|
585
|
+
}
|
|
586
|
+
// Check for duplicate Matter-only bridges
|
|
587
|
+
if (this.childBridges.has(bridgeKey)) {
|
|
588
|
+
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
589
|
+
+ 'A Matter-only bridge with this plugin and platform/accessory combination already exists. Each Matter-only bridge must be unique.');
|
|
590
|
+
}
|
|
591
|
+
// Matter-only bridges don't need username/pin validation
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
// HAP bridges (or HAP+Matter bridges) require username and pin
|
|
595
|
+
if (!bridgeConfig.username) {
|
|
596
|
+
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
597
|
+
+ 'Missing required field "_bridge.username". Set "matterOnly": true if you want a Matter-only bridge.');
|
|
598
|
+
}
|
|
552
599
|
if (!validMacAddress(bridgeConfig.username)) {
|
|
553
600
|
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
554
601
|
+ `not a valid username in _bridge.username: "${bridgeConfig.username}". Must be 6 pairs of colon-separated hexadecimal chars (A-F 0-9), like a MAC address.`);
|
|
555
602
|
}
|
|
556
|
-
if (this.childBridges.has(
|
|
557
|
-
const childBridge = this.childBridges.get(
|
|
603
|
+
if (this.childBridges.has(bridgeKey)) {
|
|
604
|
+
const childBridge = this.childBridges.get(bridgeKey);
|
|
558
605
|
if (type === "platform" /* PluginType.PLATFORM */) {
|
|
559
606
|
// only a single platform can exist on one child bridge
|
|
560
607
|
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
@@ -566,6 +613,8 @@ export class Server {
|
|
|
566
613
|
+ `Duplicate username found in _bridge.username: "${bridgeConfig.username}". You can only group accessories of the same type in a child bridge.`);
|
|
567
614
|
}
|
|
568
615
|
}
|
|
616
|
+
// Check that child bridge username doesn't conflict with main bridge
|
|
617
|
+
// Main bridge always has a username (validated in loadConfig)
|
|
569
618
|
if (bridgeConfig.username === this.config.bridge.username.toUpperCase()) {
|
|
570
619
|
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
571
620
|
+ `Username found in _bridge.username: "${bridgeConfig.username}" is the same as the main bridge. Each child bridge platform/accessory must have it's own unique username.`);
|