@iobroker/js-controller-adapter 7.2.3 → 8.0.0-alpha.1-20260921-e5941ca8a
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/build/cjs/index.d.ts +0 -1
- package/build/cjs/index.js +5 -8
- package/build/cjs/index.js.map +2 -2
- package/build/cjs/lib/_Types.d.ts +394 -63
- package/build/cjs/lib/adapter/adapter.d.ts +1818 -177
- package/build/cjs/lib/adapter/adapter.js +715 -1035
- package/build/cjs/lib/adapter/adapter.js.map +2 -2
- package/build/cjs/lib/adapter/asyncAdapter.d.ts +124 -0
- package/build/cjs/lib/adapter/asyncAdapter.js +184 -0
- package/build/cjs/lib/adapter/asyncAdapter.js.map +7 -0
- package/build/cjs/lib/adapter/context.d.ts +34 -0
- package/build/cjs/lib/adapter/context.js +17 -0
- package/build/cjs/lib/adapter/context.js.map +7 -0
- package/build/cjs/lib/adapter/defaultObjs.d.ts +5 -0
- package/build/cjs/lib/adapter/defaultObjs.js +2 -0
- package/build/cjs/lib/adapter/defaultObjs.js.map +2 -2
- package/build/cjs/lib/adapter/log.d.ts +25 -0
- package/build/cjs/lib/adapter/log.js +29 -0
- package/build/cjs/lib/adapter/log.js.map +2 -2
- package/build/cjs/lib/adapter/managers/AdapterContextBase.d.ts +49 -0
- package/build/cjs/lib/adapter/managers/AdapterContextBase.js +98 -0
- package/build/cjs/lib/adapter/managers/AdapterContextBase.js.map +7 -0
- package/build/cjs/lib/adapter/managers/AliasManager.d.ts +103 -0
- package/build/cjs/lib/adapter/managers/AliasManager.js +293 -0
- package/build/cjs/lib/adapter/managers/AliasManager.js.map +7 -0
- package/build/cjs/lib/adapter/managers/CertificateManager.d.ts +50 -0
- package/build/cjs/lib/adapter/managers/CertificateManager.js +174 -0
- package/build/cjs/lib/adapter/managers/CertificateManager.js.map +7 -0
- package/build/cjs/lib/adapter/managers/MessagingManager.d.ts +58 -0
- package/build/cjs/lib/adapter/managers/MessagingManager.js +289 -0
- package/build/cjs/lib/adapter/managers/MessagingManager.js.map +7 -0
- package/build/cjs/lib/adapter/managers/SubscriptionManager.d.ts +107 -0
- package/build/cjs/lib/adapter/managers/SubscriptionManager.js +349 -0
- package/build/cjs/lib/adapter/managers/SubscriptionManager.js.map +7 -0
- package/build/cjs/lib/adapter/userInterfaceMessagingController.d.ts +10 -0
- package/build/cjs/lib/adapter/userInterfaceMessagingController.js +9 -2
- package/build/cjs/lib/adapter/userInterfaceMessagingController.js.map +2 -2
- package/build/cjs/lib/adapter/utils.js +15 -1
- package/build/cjs/lib/adapter/utils.js.map +2 -2
- package/build/cjs/lib/adapter/validator.d.ts +10 -5
- package/build/cjs/lib/adapter/validator.js +6 -5
- package/build/cjs/lib/adapter/validator.js.map +2 -2
- package/build/esm/index.d.ts +0 -1
- package/build/esm/index.d.ts.map +1 -1
- package/build/esm/index.js +0 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/lib/_Types.d.ts +394 -63
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/adapter/adapter.d.ts +1818 -177
- package/build/esm/lib/adapter/adapter.d.ts.map +1 -1
- package/build/esm/lib/adapter/adapter.js +827 -1215
- package/build/esm/lib/adapter/adapter.js.map +1 -1
- package/build/esm/lib/adapter/asyncAdapter.d.ts +124 -0
- package/build/esm/lib/adapter/asyncAdapter.d.ts.map +1 -0
- package/build/esm/lib/adapter/asyncAdapter.js +157 -0
- package/build/esm/lib/adapter/asyncAdapter.js.map +1 -0
- package/build/esm/lib/adapter/context.d.ts +34 -0
- package/build/esm/lib/adapter/context.d.ts.map +1 -0
- package/build/esm/lib/adapter/context.js +2 -0
- package/build/esm/lib/adapter/context.js.map +1 -0
- package/build/esm/lib/adapter/defaultObjs.d.ts +5 -0
- package/build/esm/lib/adapter/defaultObjs.d.ts.map +1 -1
- package/build/esm/lib/adapter/defaultObjs.js +5 -0
- package/build/esm/lib/adapter/defaultObjs.js.map +1 -1
- package/build/esm/lib/adapter/log.d.ts +25 -0
- package/build/esm/lib/adapter/log.d.ts.map +1 -1
- package/build/esm/lib/adapter/log.js +25 -0
- package/build/esm/lib/adapter/log.js.map +1 -1
- package/build/esm/lib/adapter/managers/AdapterContextBase.d.ts +49 -0
- package/build/esm/lib/adapter/managers/AdapterContextBase.d.ts.map +1 -0
- package/build/esm/lib/adapter/managers/AdapterContextBase.js +77 -0
- package/build/esm/lib/adapter/managers/AdapterContextBase.js.map +1 -0
- package/build/esm/lib/adapter/managers/AliasManager.d.ts +103 -0
- package/build/esm/lib/adapter/managers/AliasManager.d.ts.map +1 -0
- package/build/esm/lib/adapter/managers/AliasManager.js +269 -0
- package/build/esm/lib/adapter/managers/AliasManager.js.map +1 -0
- package/build/esm/lib/adapter/managers/CertificateManager.d.ts +50 -0
- package/build/esm/lib/adapter/managers/CertificateManager.d.ts.map +1 -0
- package/build/esm/lib/adapter/managers/CertificateManager.js +142 -0
- package/build/esm/lib/adapter/managers/CertificateManager.js.map +1 -0
- package/build/esm/lib/adapter/managers/MessagingManager.d.ts +58 -0
- package/build/esm/lib/adapter/managers/MessagingManager.d.ts.map +1 -0
- package/build/esm/lib/adapter/managers/MessagingManager.js +267 -0
- package/build/esm/lib/adapter/managers/MessagingManager.js.map +1 -0
- package/build/esm/lib/adapter/managers/SubscriptionManager.d.ts +107 -0
- package/build/esm/lib/adapter/managers/SubscriptionManager.d.ts.map +1 -0
- package/build/esm/lib/adapter/managers/SubscriptionManager.js +374 -0
- package/build/esm/lib/adapter/managers/SubscriptionManager.js.map +1 -0
- package/build/esm/lib/adapter/userInterfaceMessagingController.d.ts +10 -0
- package/build/esm/lib/adapter/userInterfaceMessagingController.d.ts.map +1 -1
- package/build/esm/lib/adapter/userInterfaceMessagingController.js +8 -2
- package/build/esm/lib/adapter/userInterfaceMessagingController.js.map +1 -1
- package/build/esm/lib/adapter/utils.d.ts.map +1 -1
- package/build/esm/lib/adapter/utils.js +1 -1
- package/build/esm/lib/adapter/utils.js.map +1 -1
- package/build/esm/lib/adapter/validator.d.ts +10 -5
- package/build/esm/lib/adapter/validator.d.ts.map +1 -1
- package/build/esm/lib/adapter/validator.js +8 -5
- package/build/esm/lib/adapter/validator.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +25 -20
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { AdapterContextBase } from '../../../lib/adapter/managers/AdapterContextBase.js';
|
|
2
|
+
import { isMessageboxSupported } from '../../../lib/adapter/utils.js';
|
|
3
|
+
/** Owns the adapter's outbound messaging and the pending-reply registry. */
|
|
4
|
+
export class MessagingManager extends AdapterContextBase {
|
|
5
|
+
#pending = new Map();
|
|
6
|
+
#callbackId = 1;
|
|
7
|
+
#mboxSubscribed = false;
|
|
8
|
+
/**
|
|
9
|
+
* @param ctx Shared adapter context providing live runtime state
|
|
10
|
+
*/
|
|
11
|
+
constructor(ctx) {
|
|
12
|
+
super(ctx);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Sends a message to another adapter instance.
|
|
16
|
+
*
|
|
17
|
+
* When `opts.expectReply` is true and the target is a specific instance (not broadcast),
|
|
18
|
+
* the returned promise resolves with the reply message when it arrives, or rejects with
|
|
19
|
+
* `Error('Timeout exceeded')` if `opts.options.timeout` elapses.
|
|
20
|
+
*
|
|
21
|
+
* @param opts Normalized send options
|
|
22
|
+
*/
|
|
23
|
+
async sendTo(opts) {
|
|
24
|
+
const { command, message, callback, options, expectReply } = opts;
|
|
25
|
+
let { instanceName } = opts;
|
|
26
|
+
if (!instanceName) {
|
|
27
|
+
throw new Error('No instanceName provided or not a string');
|
|
28
|
+
}
|
|
29
|
+
if (!instanceName.startsWith('system.adapter.')) {
|
|
30
|
+
instanceName = `system.adapter.${instanceName}`;
|
|
31
|
+
}
|
|
32
|
+
const obj = {
|
|
33
|
+
command,
|
|
34
|
+
message,
|
|
35
|
+
from: `system.adapter.${this.namespace}`,
|
|
36
|
+
};
|
|
37
|
+
const states = this.states;
|
|
38
|
+
if (typeof message !== 'object') {
|
|
39
|
+
this.logger.silly(`${this.namespaceLog} sendTo "${command}" to ${instanceName} from system.adapter.${this.namespace}: ${message}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this.logger.silly(`${this.namespaceLog} sendTo "${command}" to ${instanceName} from system.adapter.${this.namespace}`);
|
|
43
|
+
}
|
|
44
|
+
if (!instanceName.match(/\.[0-9]+$/)) {
|
|
45
|
+
const objects = this.objects;
|
|
46
|
+
// Only the instance lookup is best-effort; per-instance push errors must surface.
|
|
47
|
+
const res = await objects
|
|
48
|
+
.getObjectView('system', 'instance', {
|
|
49
|
+
startkey: `${instanceName}.`,
|
|
50
|
+
endkey: `${instanceName}.\u9999`,
|
|
51
|
+
})
|
|
52
|
+
.catch(() => undefined);
|
|
53
|
+
if (res) {
|
|
54
|
+
for (const row of res.rows) {
|
|
55
|
+
await states.pushMessage(row.id, obj);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (expectReply) {
|
|
61
|
+
return this.#registerReply(states, instanceName, obj, options);
|
|
62
|
+
}
|
|
63
|
+
if (callback) {
|
|
64
|
+
obj.callback = { ...callback, ack: true };
|
|
65
|
+
}
|
|
66
|
+
await states.pushMessage(instanceName, obj);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Subscribes to this instance's messagebox on demand when the adapter does not advertise
|
|
70
|
+
* messagebox support, so replies to outbound messages are received. Idempotent.
|
|
71
|
+
*
|
|
72
|
+
* @param states the connected states DB client
|
|
73
|
+
*/
|
|
74
|
+
#maybeSubscribe(states) {
|
|
75
|
+
const common = this.common;
|
|
76
|
+
if (common && !isMessageboxSupported(common) && !this.#mboxSubscribed) {
|
|
77
|
+
this.#mboxSubscribed = true;
|
|
78
|
+
states
|
|
79
|
+
.subscribeMessage(`system.adapter.${this.namespace}`)
|
|
80
|
+
.catch(e => this.logger.error(`${this.namespaceLog} Cannot subscribe to messages: ${e.message}`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Sets a reply callback header on `obj`, registers a pending-reply resolver keyed by its id,
|
|
85
|
+
* subscribes the messagebox on demand, pushes the message and returns a promise that resolves
|
|
86
|
+
* with the reply once `resolveCallback` is invoked for the matching id, or rejects with
|
|
87
|
+
* `Error('Timeout exceeded')` when `options.timeout` elapses.
|
|
88
|
+
*
|
|
89
|
+
* @param states the connected states DB client
|
|
90
|
+
* @param target the recipient id (instance or host) for `pushMessage`
|
|
91
|
+
* @param obj the message to send; its `callback` header is set here
|
|
92
|
+
* @param options additional send options (e.g. timeout)
|
|
93
|
+
*/
|
|
94
|
+
async #registerReply(states, target, obj, options) {
|
|
95
|
+
this.#maybeSubscribe(states);
|
|
96
|
+
const id = this.#callbackId++;
|
|
97
|
+
if (this.#callbackId >= 0xffffffff) {
|
|
98
|
+
this.#callbackId = 1;
|
|
99
|
+
}
|
|
100
|
+
obj.callback = {
|
|
101
|
+
message: obj.message,
|
|
102
|
+
id,
|
|
103
|
+
ack: false,
|
|
104
|
+
time: Date.now(),
|
|
105
|
+
};
|
|
106
|
+
let pendingEntry;
|
|
107
|
+
const replyPromise = new Promise((resolve, reject) => {
|
|
108
|
+
let timer;
|
|
109
|
+
if (options?.timeout) {
|
|
110
|
+
timer = setTimeout(() => {
|
|
111
|
+
if (this.#pending.has(id)) {
|
|
112
|
+
this.#pending.delete(id);
|
|
113
|
+
reject(new Error('Timeout exceeded'));
|
|
114
|
+
}
|
|
115
|
+
}, options.timeout);
|
|
116
|
+
}
|
|
117
|
+
pendingEntry = { resolve, reject, timer, time: Date.now() };
|
|
118
|
+
this.#pending.set(id, pendingEntry);
|
|
119
|
+
});
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
for (const [_id, entry] of this.#pending) {
|
|
122
|
+
if (now - entry.time > 3_600_000) {
|
|
123
|
+
this.#pending.delete(_id);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
await states.pushMessage(target, obj);
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
if (pendingEntry.timer) {
|
|
131
|
+
clearTimeout(pendingEntry.timer);
|
|
132
|
+
}
|
|
133
|
+
this.#pending.delete(id);
|
|
134
|
+
throw e;
|
|
135
|
+
}
|
|
136
|
+
return replyPromise;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Sends a message to a host, or broadcasts to all hosts when `hostName` is `null`.
|
|
140
|
+
*
|
|
141
|
+
* When `opts.expectReply` is true and a specific host is targeted, the returned promise
|
|
142
|
+
* resolves with the reply message when it arrives, or rejects with `Error('Timeout exceeded')`
|
|
143
|
+
* if `opts.options.timeout` elapses. Broadcasts (hostName === null) resolve void.
|
|
144
|
+
*
|
|
145
|
+
* @param opts Normalized send options
|
|
146
|
+
*/
|
|
147
|
+
async sendToHost(opts) {
|
|
148
|
+
const { command, message, expectReply, options, callback } = opts;
|
|
149
|
+
let { hostName } = opts;
|
|
150
|
+
const obj = {
|
|
151
|
+
command,
|
|
152
|
+
message,
|
|
153
|
+
from: `system.adapter.${this.namespace}`,
|
|
154
|
+
};
|
|
155
|
+
const states = this.states;
|
|
156
|
+
if (hostName && !hostName.startsWith('system.host.')) {
|
|
157
|
+
hostName = `system.host.${hostName}`;
|
|
158
|
+
}
|
|
159
|
+
if (!hostName) {
|
|
160
|
+
const objects = this.objects;
|
|
161
|
+
const res = await objects.getObjectList({ startkey: 'system.host.', endkey: 'system.host.\u9999' });
|
|
162
|
+
if (res?.rows.length) {
|
|
163
|
+
for (const row of res.rows) {
|
|
164
|
+
const parts = row.id.split('.');
|
|
165
|
+
// ignore system.host.name.alive and so on
|
|
166
|
+
if (parts.length === 3) {
|
|
167
|
+
await states.pushMessage(row.id, obj);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (expectReply) {
|
|
174
|
+
return this.#registerReply(states, hostName, obj, options);
|
|
175
|
+
}
|
|
176
|
+
if (callback) {
|
|
177
|
+
obj.callback = { ...callback, ack: true };
|
|
178
|
+
}
|
|
179
|
+
await states.pushMessage(hostName, obj);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Resolves a pending reply promise for an acked messagebox message.
|
|
183
|
+
* Returns true if a pending entry was found and consumed.
|
|
184
|
+
*
|
|
185
|
+
* @param obj incoming message object from the messagebox
|
|
186
|
+
*/
|
|
187
|
+
resolveCallback(obj) {
|
|
188
|
+
if (!obj.callback?.ack || !obj.callback.id) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
const entry = this.#pending.get(obj.callback.id);
|
|
192
|
+
if (!entry) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
if (entry.timer) {
|
|
196
|
+
clearTimeout(entry.timer);
|
|
197
|
+
}
|
|
198
|
+
this.#pending.delete(obj.callback.id);
|
|
199
|
+
entry.resolve(obj.message);
|
|
200
|
+
const now = Date.now();
|
|
201
|
+
for (const [id, pending] of this.#pending) {
|
|
202
|
+
if (now - pending.time > 3_600_000) {
|
|
203
|
+
this.#pending.delete(id);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Rejects all pending reply promises and clears their timers (used on stop).
|
|
210
|
+
*/
|
|
211
|
+
clearPendingCallbacks() {
|
|
212
|
+
if (this.#pending.size) {
|
|
213
|
+
const err = new Error('Adapter stopped');
|
|
214
|
+
for (const entry of this.#pending.values()) {
|
|
215
|
+
if (entry.timer) {
|
|
216
|
+
clearTimeout(entry.timer);
|
|
217
|
+
}
|
|
218
|
+
entry.reject(err);
|
|
219
|
+
}
|
|
220
|
+
this.#pending.clear();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Sends a message to a single UI client, or broadcasts to all connected UI clients when `clientId` is omitted.
|
|
225
|
+
*
|
|
226
|
+
* @param options clientId and data options
|
|
227
|
+
*/
|
|
228
|
+
sendToUI(options) {
|
|
229
|
+
const states = this.states;
|
|
230
|
+
const { clientId, data } = options;
|
|
231
|
+
if (clientId === undefined) {
|
|
232
|
+
return this.uiMessagingController.sendToAllClients({
|
|
233
|
+
data,
|
|
234
|
+
states,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
return this.uiMessagingController.sendToClient({
|
|
238
|
+
clientId,
|
|
239
|
+
data,
|
|
240
|
+
states,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Sends an addNotification command to the host of this adapter instance.
|
|
245
|
+
*
|
|
246
|
+
* @param scope notification scope
|
|
247
|
+
* @param category notification category, or `null` to match by scope regex
|
|
248
|
+
* @param message notification message
|
|
249
|
+
* @param options additional notification options
|
|
250
|
+
*/
|
|
251
|
+
async registerNotification(scope, category, message, options) {
|
|
252
|
+
const states = this.states;
|
|
253
|
+
const obj = {
|
|
254
|
+
command: 'addNotification',
|
|
255
|
+
message: {
|
|
256
|
+
scope,
|
|
257
|
+
category,
|
|
258
|
+
message,
|
|
259
|
+
instance: this.namespace,
|
|
260
|
+
contextData: options?.contextData,
|
|
261
|
+
},
|
|
262
|
+
from: `system.adapter.${this.namespace}`,
|
|
263
|
+
};
|
|
264
|
+
await states.pushMessage(`system.host.${this.host}`, obj);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=MessagingManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagingManager.js","sourceRoot":"","sources":["../../../../../src/lib/adapter/managers/MessagingManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { Pattern } from '../../_Types.js';
|
|
2
|
+
import type { AdapterContext } from '../../../lib/adapter/context.js';
|
|
3
|
+
import { AdapterContextBase } from '../../../lib/adapter/managers/AdapterContextBase.js';
|
|
4
|
+
import type { AliasManager } from '../../../lib/adapter/managers/AliasManager.js';
|
|
5
|
+
/** Prefixes an id or pattern with this adapter's namespace unless already namespaced. Bound to the adapter's Validator. */
|
|
6
|
+
export type FixId = (id: string, isPattern?: boolean) => string;
|
|
7
|
+
type SubOptions = {
|
|
8
|
+
user?: ioBroker.ObjectIDs.User;
|
|
9
|
+
} | null | undefined;
|
|
10
|
+
/** Reads the objects matching a pattern, used to discover alias objects during state subscription. */
|
|
11
|
+
export interface ObjectAccess {
|
|
12
|
+
/**
|
|
13
|
+
* Objects matching `pattern`, keyed by id. Bound to the legacy `getForeignObjects(pattern, null, null, options)`
|
|
14
|
+
* call, whose `null` type/enums args clobber `options` — so no type filter and no user-ACL are applied;
|
|
15
|
+
* only `alias.*` ids in the result are consumed. Kept as-is for behavior parity.
|
|
16
|
+
*/
|
|
17
|
+
getForeignStateObjects(pattern: string, options?: {
|
|
18
|
+
user?: ioBroker.ObjectIDs.User;
|
|
19
|
+
} | null): Promise<Record<string, ioBroker.AnyObject>>;
|
|
20
|
+
}
|
|
21
|
+
/** Owns object-, file- and state-change subscriptions plus the auto-subscribe bookkeeping. */
|
|
22
|
+
export declare class SubscriptionManager extends AdapterContextBase {
|
|
23
|
+
#private;
|
|
24
|
+
/**
|
|
25
|
+
* @param ctx Shared adapter context providing live runtime state
|
|
26
|
+
* @param fixId Namespace-prefixer bound to the adapter's Validator
|
|
27
|
+
* @param aliasManager Alias subscription cache and bookkeeping
|
|
28
|
+
* @param objectAccess Reader for state-typed objects matching a pattern
|
|
29
|
+
*/
|
|
30
|
+
constructor(ctx: AdapterContext, fixId: FixId, aliasManager: AliasManager, objectAccess: ObjectAccess);
|
|
31
|
+
/**
|
|
32
|
+
* Subscribe to object changes within this instance's namespace.
|
|
33
|
+
*
|
|
34
|
+
* @param pattern pattern without namespace, `*` for all own objects, or an array of patterns
|
|
35
|
+
* passed through as-is (not namespaced)
|
|
36
|
+
* @param options optional user context
|
|
37
|
+
*/
|
|
38
|
+
subscribeObjects(pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Unsubscribe from object changes within this instance's namespace.
|
|
41
|
+
*
|
|
42
|
+
* @param pattern pattern without namespace, `*` for all own objects, or an array of patterns
|
|
43
|
+
* passed through as-is (not namespaced)
|
|
44
|
+
* @param options optional user context
|
|
45
|
+
*/
|
|
46
|
+
unsubscribeObjects(pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Subscribe to object changes in any instance.
|
|
49
|
+
*
|
|
50
|
+
* @param pattern pattern or array of patterns
|
|
51
|
+
* @param options optional user context
|
|
52
|
+
*/
|
|
53
|
+
subscribeForeignObjects(pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Unsubscribe from object changes in any instance.
|
|
56
|
+
*
|
|
57
|
+
* @param pattern pattern or array of patterns (defaults to `*`)
|
|
58
|
+
* @param options optional user context
|
|
59
|
+
*/
|
|
60
|
+
unsubscribeForeignObjects(pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Subscribe to file changes in a specific instance.
|
|
63
|
+
*
|
|
64
|
+
* @param id adapter id, e.g. `vis-2.0`
|
|
65
|
+
* @param pattern pattern or array of patterns
|
|
66
|
+
* @param options optional user context
|
|
67
|
+
*/
|
|
68
|
+
subscribeForeignFiles(id: string, pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Unsubscribe from file changes in a specific instance.
|
|
71
|
+
*
|
|
72
|
+
* @param id adapter id, e.g. `vis-2.0`
|
|
73
|
+
* @param pattern pattern or array of patterns (defaults to `*`)
|
|
74
|
+
* @param options optional user context
|
|
75
|
+
*/
|
|
76
|
+
unsubscribeForeignFiles(id: string, pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Register an instance as auto-subscribable (its `subscribes` counter is maintained on subscribe/unsubscribe).
|
|
79
|
+
*
|
|
80
|
+
* @param id instance id, e.g. `pushover.0`
|
|
81
|
+
*/
|
|
82
|
+
addSubscribableInstance(id: string): void;
|
|
83
|
+
/**
|
|
84
|
+
* Stop treating an instance as auto-subscribable.
|
|
85
|
+
*
|
|
86
|
+
* @param id instance id, e.g. `pushover.0`
|
|
87
|
+
*/
|
|
88
|
+
removeSubscribableInstance(id: string): void;
|
|
89
|
+
/** Populate the auto-subscribe instance list from the objects DB. */
|
|
90
|
+
autoSubscribeOn(): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Subscribe to state changes in any instance, resolving aliases and maintaining auto-subscribe counters.
|
|
93
|
+
*
|
|
94
|
+
* @param pattern pattern, `*`, an `alias.*` id, or an array of ids/patterns
|
|
95
|
+
* @param options optional user context
|
|
96
|
+
*/
|
|
97
|
+
subscribeForeignStates(pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Unsubscribe from state changes in any instance, mirroring {@link subscribeForeignStates}.
|
|
100
|
+
*
|
|
101
|
+
* @param pattern pattern, `*`, an `alias.*` id, or an array of ids/patterns
|
|
102
|
+
* @param options optional user context
|
|
103
|
+
*/
|
|
104
|
+
unsubscribeForeignStates(pattern: Pattern, options?: SubOptions): Promise<void>;
|
|
105
|
+
}
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=SubscriptionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionManager.d.ts","sourceRoot":"","sources":["../../../../../src/lib/adapter/managers/SubscriptionManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAG3E,2HAA2H;AAC3H,MAAM,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;AAEhE,KAAK,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,CAAC;AAExE,sGAAsG;AACtG,MAAM,WAAW,YAAY;IACzB;;;;OAIG;IACH,sBAAsB,CAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAA;KAAE,GAAG,IAAI,GACpD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;CAClD;AAED,8FAA8F;AAC9F,qBAAa,mBAAoB,SAAQ,kBAAkB;;IAMvD;;;;;OAKG;gBACS,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;IAOrG;;;;;;OAMG;IACG,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7E;;;;;;OAMG;IACG,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/E;;;;;OAKG;IACG,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF;;;;;OAKG;IACG,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAItF;;;;;;OAMG;IACG,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9F;;;;;;OAMG;IACG,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhG;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMzC;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO5C,qEAAqE;IAC/D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BtC;;;;;OAKG;IACG,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA+JnF;;;;;OAKG;IACG,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CA2FxF"}
|