@agentunion/fastaun 0.5.30 → 0.5.32
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/CHANGELOG.md +60 -0
- package/_packed_docs/CHANGELOG.md +60 -0
- package/_packed_docs/sdk/0.5.31-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +162 -0
- package/_packed_docs/sdk/0.5.31-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +167 -0
- package/_packed_docs/sdk/0.5.32-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +350 -0
- package/_packed_docs/sdk/0.5.32-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +319 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +12 -5
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +459 -0
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/274/200/345/217/221/347/247/273/346/244/215/346/214/207/345/215/227.md +554 -0
- package/_packed_docs/sdk/INDEX.md +27 -5
- package/_packed_docs/sdk//345/255/220AID/344/277/256/346/224/271agent.md/351/200/232/347/237/245Owner/345/234/272/346/231/257/346/214/207/345/215/227.md +234 -0
- package/dist/agent-md-schema.js +7 -6
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.d.ts +2 -0
- package/dist/agent-md.js +20 -6
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +1 -0
- package/dist/aid-store.js +1 -0
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.js +1 -1
- package/dist/aid.js.map +1 -1
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/client/control-messages.d.ts +22 -7
- package/dist/client/control-messages.js +220 -185
- package/dist/client/control-messages.js.map +1 -1
- package/dist/client/delivery.d.ts +3 -0
- package/dist/client/delivery.js +67 -3
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.d.ts +3 -0
- package/dist/client/group-state.js +48 -14
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.js +12 -3
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +9 -3
- package/dist/client/rpc-pipeline.js +61 -26
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +13 -1
- package/dist/client/v2-e2ee.js +32 -19
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +18 -1
- package/dist/client.js +396 -140
- package/dist/client.js.map +1 -1
- package/dist/discovery.d.ts +1 -0
- package/dist/discovery.js +3 -1
- package/dist/discovery.js.map +1 -1
- package/dist/group-fs.js +1 -1
- package/dist/group-fs.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ownership-v21.d.ts +2 -2
- package/dist/ownership-v21.js +18 -21
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.js +6 -4
- package/dist/ownership-workflow.js.map +1 -1
- package/dist/pubsub/binding.d.ts +54 -0
- package/dist/pubsub/binding.js +343 -0
- package/dist/pubsub/binding.js.map +1 -0
- package/dist/pubsub/channel.d.ts +45 -0
- package/dist/pubsub/channel.js +137 -0
- package/dist/pubsub/channel.js.map +1 -0
- package/dist/pubsub/client.d.ts +93 -0
- package/dist/pubsub/client.js +318 -0
- package/dist/pubsub/client.js.map +1 -0
- package/dist/pubsub/credentials.d.ts +51 -0
- package/dist/pubsub/credentials.js +360 -0
- package/dist/pubsub/credentials.js.map +1 -0
- package/dist/pubsub/errors.d.ts +5 -0
- package/dist/pubsub/errors.js +6 -0
- package/dist/pubsub/errors.js.map +1 -0
- package/dist/pubsub/index.d.ts +48 -0
- package/dist/pubsub/index.js +152 -0
- package/dist/pubsub/index.js.map +1 -0
- package/dist/pubsub/scheduler.d.ts +58 -0
- package/dist/pubsub/scheduler.js +249 -0
- package/dist/pubsub/scheduler.js.map +1 -0
- package/dist/pubsub/service.d.ts +100 -0
- package/dist/pubsub/service.js +650 -0
- package/dist/pubsub/service.js.map +1 -0
- package/dist/pubsub/types.d.ts +119 -0
- package/dist/pubsub/types.js +2 -0
- package/dist/pubsub/types.js.map +1 -0
- package/dist/register-flow.js +1 -1
- package/dist/register-flow.js.map +1 -1
- package/dist/storage/lowlevel.js +49 -8
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/read-cache.d.ts +7 -3
- package/dist/storage/read-cache.js +137 -18
- package/dist/storage/read-cache.js.map +1 -1
- package/dist/storage/vfs.d.ts +1 -0
- package/dist/storage/vfs.js +12 -4
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +1 -1
- package/dist/tools/cross-sdk-agent.js +4 -2
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/tools/pubsub-actor.d.ts +27 -0
- package/dist/tools/pubsub-actor.js +260 -0
- package/dist/tools/pubsub-actor.js.map +1 -0
- package/dist/transport.d.ts +26 -2
- package/dist/transport.js +182 -17
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { PubSubError } from './errors.js';
|
|
2
|
+
import { ConnectionError, TimeoutError } from '../errors.js';
|
|
3
|
+
import { SDKChannel, object, identifier } from './channel.js';
|
|
4
|
+
const ingress = () => ({ queues: new Map(), ready: [], active: new Set(), count: 0, bytes: 0, aidCounts: new Map() });
|
|
5
|
+
export class EventServiceBinding {
|
|
6
|
+
service;
|
|
7
|
+
sdk;
|
|
8
|
+
options;
|
|
9
|
+
publishExpiry;
|
|
10
|
+
capacityUnsubscribe;
|
|
11
|
+
running = false;
|
|
12
|
+
channel;
|
|
13
|
+
starting;
|
|
14
|
+
closing;
|
|
15
|
+
tasks = new Set();
|
|
16
|
+
drainWaiters = new Set();
|
|
17
|
+
registrationId;
|
|
18
|
+
registrationDeadline = 0;
|
|
19
|
+
renewTimer;
|
|
20
|
+
expiryTimer;
|
|
21
|
+
renewing;
|
|
22
|
+
stateSubscription;
|
|
23
|
+
registrationGeneration = 0;
|
|
24
|
+
queues = { publish: ingress(), management: ingress(), lease: ingress() };
|
|
25
|
+
replies = [[], []];
|
|
26
|
+
replyActive = [0, 0];
|
|
27
|
+
replyBytes = [0, 0];
|
|
28
|
+
constructor(service, sdk, options = {}) {
|
|
29
|
+
this.service = service;
|
|
30
|
+
this.sdk = sdk;
|
|
31
|
+
this.options = options;
|
|
32
|
+
}
|
|
33
|
+
async start() {
|
|
34
|
+
if (this.closing)
|
|
35
|
+
await this.closing;
|
|
36
|
+
if (this.starting)
|
|
37
|
+
return this.starting;
|
|
38
|
+
if (this.running && this.leaseActive())
|
|
39
|
+
return this;
|
|
40
|
+
if (this.running)
|
|
41
|
+
await this.close();
|
|
42
|
+
if (this.sdk.aid !== this.service.service_aid)
|
|
43
|
+
throw new PubSubError('SERVICE_IDENTITY_MISMATCH');
|
|
44
|
+
this.starting = (async () => {
|
|
45
|
+
this.channel = new SDKChannel(this.sdk, this.service.service_aid, (sender, payload, route) => this.receive(sender, payload, route), this.service.clock, true);
|
|
46
|
+
this.service.setSend(async (to, payload, ttl, messageId, background, deadline, route) => { const remaining = this.registrationDeadline - performance.now(); if (!this.leaseActive() || remaining < 1000)
|
|
47
|
+
throw new PubSubError('SERVICE_LEASE_LOST'); return this.channel.send(to, payload, Math.min(ttl, Math.floor(remaining / 1000)), messageId, background, Math.min(deadline ?? Number(payload.expires_at), Date.now() + remaining), route); });
|
|
48
|
+
this.registrationId = identifier();
|
|
49
|
+
this.registrationGeneration++;
|
|
50
|
+
try {
|
|
51
|
+
await this.service.start();
|
|
52
|
+
this.channel.start();
|
|
53
|
+
await this.registrationCall('register');
|
|
54
|
+
this.running = true;
|
|
55
|
+
this.capacityUnsubscribe = this.service.onPublishCapacity(() => { this.pump('publish'); this.resumePulls(); });
|
|
56
|
+
this.stateSubscription = this.sdk.on('state_change', this.stateChange);
|
|
57
|
+
this.resumePulls();
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
this.running = false;
|
|
62
|
+
this.clearRegistrationTimers();
|
|
63
|
+
this.channel?.close();
|
|
64
|
+
this.channel = undefined;
|
|
65
|
+
this.registrationId = undefined;
|
|
66
|
+
await this.service.close();
|
|
67
|
+
throw this.registrationError(error);
|
|
68
|
+
}
|
|
69
|
+
})();
|
|
70
|
+
try {
|
|
71
|
+
return await this.starting;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
this.starting = undefined;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
registrationError(error) {
|
|
78
|
+
if (error instanceof PubSubError)
|
|
79
|
+
return error;
|
|
80
|
+
const failure = error;
|
|
81
|
+
return new PubSubError(failure?.data?.code || failure?.stringCode || (typeof failure?.code === 'string' ? failure.code : error instanceof TimeoutError ? 'TIMEOUT' : error instanceof ConnectionError ? 'CONNECTION_ERROR' : 'SERVICE_UNAVAILABLE'), failure?.message);
|
|
82
|
+
}
|
|
83
|
+
clearRegistrationTimers() { if (this.renewTimer)
|
|
84
|
+
clearTimeout(this.renewTimer); if (this.expiryTimer)
|
|
85
|
+
clearTimeout(this.expiryTimer); this.renewTimer = this.expiryTimer = undefined; }
|
|
86
|
+
stateChange = (value) => { if (value?.state === 'ready' && this.running)
|
|
87
|
+
void this.renewRegistration(); };
|
|
88
|
+
leaseActive() { return this.running && performance.now() < this.registrationDeadline; }
|
|
89
|
+
async registrationCall(operation) {
|
|
90
|
+
const generation = this.registrationGeneration, registrationId = this.registrationId, started = performance.now();
|
|
91
|
+
const deadline = Date.now() + Math.min(10_000, operation === 'renew' ? Math.max(1, this.registrationDeadline - performance.now()) : 10_000);
|
|
92
|
+
let result;
|
|
93
|
+
for (let attempt = 0;; attempt++) {
|
|
94
|
+
try {
|
|
95
|
+
result = await this.sdk.call(`message.evtsvc.${operation}`, { service: 'event_service', registration_id: registrationId }, { background: false, deadline });
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const failure = this.registrationError(error);
|
|
100
|
+
if (operation !== 'register' || attempt || !['TIMEOUT', 'CONNECTION_ERROR'].includes(failure.code) || Date.now() >= deadline)
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (generation !== this.registrationGeneration)
|
|
105
|
+
return;
|
|
106
|
+
const expires = Number(result?.expires_at), interval = Number(result?.renew_after_seconds), ttl = Number(result?.ttl_seconds);
|
|
107
|
+
if (result?.registration_id !== registrationId || !Number.isFinite(expires) || !Number.isFinite(ttl) || ttl <= 0 || !Number.isFinite(interval) || interval <= 0)
|
|
108
|
+
throw new PubSubError('SERVICE_UNAVAILABLE');
|
|
109
|
+
this.registrationDeadline = started + ttl * 1000;
|
|
110
|
+
if (performance.now() >= this.registrationDeadline)
|
|
111
|
+
throw new PubSubError('SERVICE_LEASE_LOST');
|
|
112
|
+
this.clearRegistrationTimers();
|
|
113
|
+
this.expiryTimer = setTimeout(() => { this.expiryTimer = undefined; if (this.running && generation === this.registrationGeneration)
|
|
114
|
+
void this.close(); }, Math.max(1, this.registrationDeadline - performance.now()));
|
|
115
|
+
this.renewTimer = setTimeout(() => { this.renewTimer = undefined; void this.renewRegistration(); }, Math.max(1, Math.min(interval * 1000, this.registrationDeadline - performance.now() - 1)));
|
|
116
|
+
}
|
|
117
|
+
renewRegistration() {
|
|
118
|
+
if (this.renewing)
|
|
119
|
+
return this.renewing;
|
|
120
|
+
if (!this.running || !this.registrationId)
|
|
121
|
+
return Promise.resolve();
|
|
122
|
+
const generation = this.registrationGeneration;
|
|
123
|
+
this.renewing = this.registrationCall('renew').catch(async (error) => {
|
|
124
|
+
if (!this.running || generation !== this.registrationGeneration)
|
|
125
|
+
return;
|
|
126
|
+
const failure = this.registrationError(error);
|
|
127
|
+
if (['SERVICE_LEASE_LOST', 'DEVICE_CONFLICT', 'SERVICE_NOT_STARTED'].includes(failure.code) || performance.now() >= this.registrationDeadline) {
|
|
128
|
+
await this.close();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (this.renewTimer)
|
|
132
|
+
clearTimeout(this.renewTimer);
|
|
133
|
+
this.renewTimer = setTimeout(() => { this.renewTimer = undefined; void this.renewRegistration(); }, Math.max(1, Math.min(1000, this.registrationDeadline - performance.now())));
|
|
134
|
+
}).finally(() => { this.renewing = undefined; });
|
|
135
|
+
return this.renewing;
|
|
136
|
+
}
|
|
137
|
+
close() {
|
|
138
|
+
if (this.closing)
|
|
139
|
+
return this.closing;
|
|
140
|
+
const closing = this.stop().finally(() => { if (this.closing === closing)
|
|
141
|
+
this.closing = undefined; });
|
|
142
|
+
this.closing = closing;
|
|
143
|
+
return closing;
|
|
144
|
+
}
|
|
145
|
+
async stop() {
|
|
146
|
+
if (this.starting) {
|
|
147
|
+
try {
|
|
148
|
+
await this.starting;
|
|
149
|
+
}
|
|
150
|
+
catch { }
|
|
151
|
+
}
|
|
152
|
+
const registrationId = this.registrationId;
|
|
153
|
+
this.registrationId = undefined;
|
|
154
|
+
this.registrationGeneration++;
|
|
155
|
+
this.clearRegistrationTimers();
|
|
156
|
+
this.stateSubscription?.unsubscribe();
|
|
157
|
+
this.sdk.off?.('state_change', this.stateChange);
|
|
158
|
+
this.stateSubscription = undefined;
|
|
159
|
+
this.running = false;
|
|
160
|
+
if (this.publishExpiry)
|
|
161
|
+
clearTimeout(this.publishExpiry);
|
|
162
|
+
this.publishExpiry = undefined;
|
|
163
|
+
this.capacityUnsubscribe?.();
|
|
164
|
+
this.capacityUnsubscribe = undefined;
|
|
165
|
+
this.channel?.close();
|
|
166
|
+
this.channel = undefined;
|
|
167
|
+
for (const queue of Object.values(this.queues)) {
|
|
168
|
+
for (const items of queue.queues.values())
|
|
169
|
+
for (const item of items) {
|
|
170
|
+
this.account(queue, item, -1);
|
|
171
|
+
this.releaseBody(item);
|
|
172
|
+
}
|
|
173
|
+
queue.queues.clear();
|
|
174
|
+
queue.ready = [];
|
|
175
|
+
}
|
|
176
|
+
for (let i = 0; i < this.replies.length; i++) {
|
|
177
|
+
for (const item of this.replies[i])
|
|
178
|
+
this.replyBytes[i] -= item.size;
|
|
179
|
+
this.replies[i] = [];
|
|
180
|
+
}
|
|
181
|
+
this.changed();
|
|
182
|
+
const serviceClosing = this.service.close();
|
|
183
|
+
await Promise.allSettled([...this.tasks]);
|
|
184
|
+
await serviceClosing;
|
|
185
|
+
if (registrationId) {
|
|
186
|
+
try {
|
|
187
|
+
await this.sdk.call('message.evtsvc.unregister', { service: 'event_service', registration_id: registrationId }, { background: false, deadline: Date.now() + 10_000 });
|
|
188
|
+
}
|
|
189
|
+
catch { }
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async drain() {
|
|
193
|
+
while (Object.values(this.queues).some(queue => queue.count) || this.replies.some((queue, i) => queue.length || this.replyActive[i]))
|
|
194
|
+
await new Promise(resolve => { this.drainWaiters.add(resolve); });
|
|
195
|
+
await this.service.drain();
|
|
196
|
+
}
|
|
197
|
+
changed() { for (const wake of this.drainWaiters)
|
|
198
|
+
wake(); this.drainWaiters.clear(); }
|
|
199
|
+
limit(name, fallback) { const value = this.service.limits[name]; return typeof value === 'number' && value > 0 ? value : fallback; }
|
|
200
|
+
account(queue, item, direction) {
|
|
201
|
+
queue.count += direction;
|
|
202
|
+
queue.bytes += direction * item.size;
|
|
203
|
+
const count = (queue.aidCounts.get(item.sender) ?? 0) + direction;
|
|
204
|
+
if (count)
|
|
205
|
+
queue.aidCounts.set(item.sender, count);
|
|
206
|
+
else
|
|
207
|
+
queue.aidCounts.delete(item.sender);
|
|
208
|
+
}
|
|
209
|
+
releaseBody(item) { if (item.reservation?.bytes) {
|
|
210
|
+
const size = item.reservation.bytes;
|
|
211
|
+
item.reservation.bytes = 0;
|
|
212
|
+
this.service.releaseIngressBody(size);
|
|
213
|
+
} }
|
|
214
|
+
resumePulls() { if (this.running && this.publishCapacity())
|
|
215
|
+
this.sdk._controlMessages?.().resumePubsubPulls?.(); }
|
|
216
|
+
publishCapacity(size = 0) { const queue = this.queues.publish; return queue.count + (this.service.fanoutCount ?? 0) < Math.min(this.limit('ingress_items', 64), 64) && queue.bytes + size <= Math.min(this.limit('ingress_bytes', 2 * 1024 * 1024), 64 * 1024 * 1024) && this.service.publishCapacityAvailable(size); }
|
|
217
|
+
receive(sender, payload, route) {
|
|
218
|
+
if (!this.leaseActive())
|
|
219
|
+
return this.starting ? false : undefined;
|
|
220
|
+
if (!object(payload) || payload.op === 'event' || String(payload.op ?? '').endsWith('.result') || Number(payload.expires_at ?? 0) <= this.service.clock())
|
|
221
|
+
return;
|
|
222
|
+
const kind = payload.op === 'publish' ? 'publish' : ['renew', 'unsubscribe', 'revoke_grant'].includes(String(payload.op)) ? 'lease' : 'management';
|
|
223
|
+
const queue = this.queues[kind], size = new TextEncoder().encode(JSON.stringify(payload)).byteLength;
|
|
224
|
+
const prefix = kind === 'publish' ? 'ingress' : kind === 'lease' ? 'lease' : 'management';
|
|
225
|
+
if (kind === 'publish' && !this.publishCapacity(size))
|
|
226
|
+
return false;
|
|
227
|
+
if (queue.count >= this.limit(`${prefix}_items`, kind === 'publish' ? 64 : 128) || queue.bytes + size > this.limit(`${prefix}_bytes`, kind === 'publish' ? 2 * 1024 * 1024 : 1024 * 1024) || (queue.aidCounts.get(sender) ?? 0) >= this.limit('ingress_aid_items', 64)) {
|
|
228
|
+
if (kind === 'publish')
|
|
229
|
+
return false;
|
|
230
|
+
this.enqueueReply(sender, payload, undefined, { code: 'OVERLOADED', message: 'OVERLOADED' }, route);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (kind === 'publish' && !this.service.reserveIngressBody(size))
|
|
234
|
+
return false;
|
|
235
|
+
const item = { route, sender, payload: structuredClone(payload), size, ...(kind === 'publish' ? { reservation: { bytes: size } } : {}) };
|
|
236
|
+
let items = queue.queues.get(sender);
|
|
237
|
+
if (!items) {
|
|
238
|
+
items = [];
|
|
239
|
+
queue.queues.set(sender, items);
|
|
240
|
+
}
|
|
241
|
+
items.push(item);
|
|
242
|
+
this.account(queue, item, 1);
|
|
243
|
+
if (items.length === 1 && !queue.active.has(sender))
|
|
244
|
+
queue.ready.push(sender);
|
|
245
|
+
this.pump(kind);
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
pump(kind) {
|
|
249
|
+
const queue = this.queues[kind], max = kind === 'publish' ? this.options.publishWorkers ?? 4 : kind === 'lease' ? this.options.leaseWorkers ?? 2 : this.options.requestWorkers ?? 2;
|
|
250
|
+
if (kind === 'publish' && this.publishExpiry) {
|
|
251
|
+
clearTimeout(this.publishExpiry);
|
|
252
|
+
this.publishExpiry = undefined;
|
|
253
|
+
}
|
|
254
|
+
let waiting = queue.ready.length;
|
|
255
|
+
while (this.leaseActive() && queue.active.size < max && queue.ready.length) {
|
|
256
|
+
const first = queue.queues.get(queue.ready[0])[0];
|
|
257
|
+
if (kind === 'publish' && Number(first.payload.expires_at) > this.service.clock() && !this.service.publishCapacityAvailable(first.size, first.reservation?.bytes ?? 0)) {
|
|
258
|
+
queue.ready.push(queue.ready.shift());
|
|
259
|
+
if (--waiting <= 0)
|
|
260
|
+
break;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
waiting = queue.ready.length - 1;
|
|
264
|
+
const sender = queue.ready.shift(), item = queue.queues.get(sender).shift();
|
|
265
|
+
queue.active.add(sender);
|
|
266
|
+
const task = this.handle(item).finally(() => {
|
|
267
|
+
queue.active.delete(sender);
|
|
268
|
+
this.account(queue, item, -1);
|
|
269
|
+
if (queue.queues.get(sender)?.length)
|
|
270
|
+
queue.ready.push(sender);
|
|
271
|
+
else
|
|
272
|
+
queue.queues.delete(sender);
|
|
273
|
+
this.tasks.delete(task);
|
|
274
|
+
this.releaseBody(item);
|
|
275
|
+
this.pump(kind);
|
|
276
|
+
if (kind === 'publish')
|
|
277
|
+
this.resumePulls();
|
|
278
|
+
this.changed();
|
|
279
|
+
});
|
|
280
|
+
this.tasks.add(task);
|
|
281
|
+
}
|
|
282
|
+
if (kind === 'publish' && this.leaseActive() && queue.ready.length && queue.active.size < max) {
|
|
283
|
+
const deadline = Math.min(...queue.ready.map(sender => Number(queue.queues.get(sender)[0].payload.expires_at)));
|
|
284
|
+
this.publishExpiry = setTimeout(() => { this.publishExpiry = undefined; this.pump('publish'); this.resumePulls(); }, Math.max(1, deadline - this.service.clock()));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async handle(item) {
|
|
288
|
+
const payload = item.payload;
|
|
289
|
+
if (!this.leaseActive() || Number(payload.expires_at ?? 0) <= this.service.clock())
|
|
290
|
+
return;
|
|
291
|
+
try {
|
|
292
|
+
const result = item.route ? await this.service.handle(item.sender, payload, item.reservation, item.route) : item.reservation ? await this.service.handle(item.sender, payload, item.reservation) : await this.service.handle(item.sender, payload);
|
|
293
|
+
this.enqueueReply(item.sender, payload, result, undefined, item.route);
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
const e = error;
|
|
297
|
+
this.enqueueReply(item.sender, payload, undefined, { code: e.code ?? 'INTERNAL_ERROR', message: e.message }, item.route);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
enqueueReply(sender, request, result, error, route) {
|
|
301
|
+
if (!this.leaseActive() || request.op === 'publish' && request.reply_mode !== 'accepted' || !request.request_id)
|
|
302
|
+
return;
|
|
303
|
+
const index = request.op === 'publish' ? 1 : 0;
|
|
304
|
+
const replyRequest = { type: 'app.pubsub.v1', op: request.op, request_id: request.request_id, expires_at: request.expires_at, reply_mode: request.reply_mode, ...(request.event_id ? { event_id: request.event_id } : {}) };
|
|
305
|
+
const size = new TextEncoder().encode(JSON.stringify({ sender, request: replyRequest, result, error })).byteLength + 128;
|
|
306
|
+
if (this.replies[index].length + this.replyActive[index] >= this.limit('reply_items', 128) || this.replyBytes[index] + size > this.limit('reply_bytes', 1024 * 1024))
|
|
307
|
+
return;
|
|
308
|
+
this.replies[index].push({ route, sender, request: replyRequest, result, error, size });
|
|
309
|
+
this.replyBytes[index] += size;
|
|
310
|
+
this.pumpReplies(index);
|
|
311
|
+
}
|
|
312
|
+
pumpReplies(index) {
|
|
313
|
+
while (this.leaseActive() && this.replyActive[index] < 2 && this.replies[index].length) {
|
|
314
|
+
const item = this.replies[index].shift();
|
|
315
|
+
this.replyActive[index]++;
|
|
316
|
+
const task = this.reply(item.sender, item.request, item.result, item.error, item.route).finally(() => { this.replyActive[index]--; this.replyBytes[index] -= item.size; this.tasks.delete(task); this.pumpReplies(index); this.changed(); });
|
|
317
|
+
this.tasks.add(task);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
async reply(sender, request, result, error, route) {
|
|
321
|
+
if (request.op === 'publish' && request.reply_mode !== 'accepted' || !request.request_id)
|
|
322
|
+
return;
|
|
323
|
+
const reply = { type: 'app.pubsub.v1', op: `${request.op}.result`, service_aid: this.service.service_aid, request_id: request.request_id, expires_at: Math.min(this.service.clock() + 60_000, Number(request.expires_at)), ...(request.event_id ? { event_id: request.event_id } : {}), ...(error ? { error } : { result }) };
|
|
324
|
+
for (let attempt = 0; attempt < (this.service.limits.send_attempts ?? 2); attempt++) {
|
|
325
|
+
const ttl = Math.floor((Number(reply.expires_at) - this.service.clock()) / 1000);
|
|
326
|
+
if (!this.leaseActive() || !this.channel || ttl < 1)
|
|
327
|
+
return;
|
|
328
|
+
const remaining = this.registrationDeadline - performance.now();
|
|
329
|
+
if (remaining < 1000)
|
|
330
|
+
return;
|
|
331
|
+
try {
|
|
332
|
+
await this.channel.send(sender, reply, Math.min(ttl, Math.floor(remaining / 1000)), `${request.request_id}:result${route ? ':' + route.device_id + ':' + route.slot_id : ''}`, request.op === 'publish', Math.min(Number(reply.expires_at), Date.now() + remaining), route);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
const failure = error;
|
|
337
|
+
if (!failure?.retryable && !failure?.data?.retryable && !['TIMEOUT', 'CONNECTION_ERROR'].includes(String(failure?.stringCode || failure?.code || '')) && !/timeout|connection/i.test(String(error)))
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/pubsub/binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { EventRoute, JsonMap } from './types.js';
|
|
2
|
+
export interface PubSubSDK {
|
|
3
|
+
aid: string | null;
|
|
4
|
+
call(method: string, params?: any, options?: any): Promise<any>;
|
|
5
|
+
on(event: string, handler: (value: any) => void | Promise<void>): {
|
|
6
|
+
unsubscribe(): void;
|
|
7
|
+
} | void;
|
|
8
|
+
off?(event: string, handler: (value: any) => void | Promise<void>): void;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
export declare const object: (value: unknown) => value is JsonMap;
|
|
12
|
+
export declare const clone: <T>(value: T) => T;
|
|
13
|
+
export declare const wireSize: (value: unknown) => number;
|
|
14
|
+
export declare const identifier: () => string;
|
|
15
|
+
export declare class TokenBucket {
|
|
16
|
+
private readonly clock;
|
|
17
|
+
private calls;
|
|
18
|
+
private bytes;
|
|
19
|
+
private updated;
|
|
20
|
+
constructor(clock?: () => number);
|
|
21
|
+
delay(size: number): number;
|
|
22
|
+
take(size: number): boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare class SDKChannel {
|
|
25
|
+
readonly sdk: PubSubSDK;
|
|
26
|
+
readonly serviceAid: string;
|
|
27
|
+
readonly receiver: (sender: string, payload: JsonMap, route?: EventRoute) => boolean | void;
|
|
28
|
+
readonly clock: () => number;
|
|
29
|
+
readonly publishReceiver: boolean;
|
|
30
|
+
private started;
|
|
31
|
+
private subscription?;
|
|
32
|
+
private unregister?;
|
|
33
|
+
private seen;
|
|
34
|
+
private rate;
|
|
35
|
+
private generation;
|
|
36
|
+
private waits;
|
|
37
|
+
constructor(sdk: PubSubSDK, serviceAid: string, receiver: (sender: string, payload: JsonMap, route?: EventRoute) => boolean | void, clock?: () => number, publishReceiver?: boolean);
|
|
38
|
+
private readonly receiveEvent;
|
|
39
|
+
private readonly receive;
|
|
40
|
+
start(): void;
|
|
41
|
+
close(): void;
|
|
42
|
+
private pause;
|
|
43
|
+
private pressure;
|
|
44
|
+
send(to: string, payload: JsonMap, ttl: number, messageId: string, background?: boolean, deadline?: number, route?: EventRoute): Promise<JsonMap>;
|
|
45
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { PubSubError } from './errors.js';
|
|
2
|
+
export const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
3
|
+
export const clone = (value) => structuredClone(value);
|
|
4
|
+
export const wireSize = (value) => new TextEncoder().encode(JSON.stringify(value)).byteLength;
|
|
5
|
+
export const identifier = () => crypto.randomUUID().replace(/-/g, '');
|
|
6
|
+
export class TokenBucket {
|
|
7
|
+
clock;
|
|
8
|
+
calls = 4;
|
|
9
|
+
bytes = 65536;
|
|
10
|
+
updated;
|
|
11
|
+
constructor(clock = () => performance.now()) {
|
|
12
|
+
this.clock = clock;
|
|
13
|
+
this.updated = clock();
|
|
14
|
+
}
|
|
15
|
+
delay(size) { if (size > 65536)
|
|
16
|
+
throw new PubSubError('MESSAGE_TOO_LARGE'); const now = this.clock(), elapsed = Math.max(0, now - this.updated); this.calls = Math.min(4, this.calls + elapsed * 0.04); this.bytes = Math.min(65536, this.bytes + elapsed * 262.144); this.updated = now; return Math.max(0, (1 - this.calls) / 0.04, (size - this.bytes) / 262.144); }
|
|
17
|
+
take(size) { if (this.delay(size) > 0)
|
|
18
|
+
return false; this.calls--; this.bytes -= size; return true; }
|
|
19
|
+
}
|
|
20
|
+
export class SDKChannel {
|
|
21
|
+
sdk;
|
|
22
|
+
serviceAid;
|
|
23
|
+
receiver;
|
|
24
|
+
clock;
|
|
25
|
+
publishReceiver;
|
|
26
|
+
started = false;
|
|
27
|
+
subscription;
|
|
28
|
+
unregister;
|
|
29
|
+
seen = new Map();
|
|
30
|
+
rate = new TokenBucket();
|
|
31
|
+
generation = 0;
|
|
32
|
+
waits = new Set();
|
|
33
|
+
constructor(sdk, serviceAid, receiver, clock = () => Date.now(), publishReceiver = false) {
|
|
34
|
+
this.sdk = sdk;
|
|
35
|
+
this.serviceAid = serviceAid;
|
|
36
|
+
this.receiver = receiver;
|
|
37
|
+
this.clock = clock;
|
|
38
|
+
this.publishReceiver = publishReceiver;
|
|
39
|
+
}
|
|
40
|
+
receiveEvent = (message) => { this.receive(message); };
|
|
41
|
+
receive = (message) => {
|
|
42
|
+
if (!this.started || !object(message) || message.encrypted !== true || message._decrypt_error || !object(message.payload))
|
|
43
|
+
return;
|
|
44
|
+
if (!object(message.protected_headers) || message.protected_headers.message_class !== 'sdk_control' || message.protected_headers.sdk_control_protocol !== 'aun.pubsub' || message.protected_headers.sdk_control_version !== 1 && message.protected_headers.sdk_control_version !== '1')
|
|
45
|
+
return;
|
|
46
|
+
const sender = message.from ?? message.from_aid ?? message.sender_aid;
|
|
47
|
+
if (typeof sender !== 'string' || !sender || message.payload.type !== 'app.pubsub.v1' || message.to && message.to !== this.sdk.aid)
|
|
48
|
+
return;
|
|
49
|
+
const device = typeof message.sender_device_id === 'string' ? message.sender_device_id.trim() : '', slot = typeof message.sender_slot_id === 'string' ? message.sender_slot_id.trim() : '';
|
|
50
|
+
const route = device && slot ? { device_id: device, slot_id: slot } : undefined;
|
|
51
|
+
if (this.publishReceiver && !route)
|
|
52
|
+
return;
|
|
53
|
+
if (typeof message.message_id === 'string' && message.message_id) {
|
|
54
|
+
const now = this.clock();
|
|
55
|
+
for (const [key, expires] of this.seen)
|
|
56
|
+
if (expires <= now)
|
|
57
|
+
this.seen.delete(key);
|
|
58
|
+
const key = `${sender}\0${message.message_id}`;
|
|
59
|
+
if (this.seen.has(key))
|
|
60
|
+
return true;
|
|
61
|
+
if (this.receiver(sender, message.payload, route) === false)
|
|
62
|
+
return false;
|
|
63
|
+
this.seen.set(key, Math.min(Number(message.payload.expires_at ?? now + 60_000), now + 3_600_000));
|
|
64
|
+
if (this.seen.size > 4096)
|
|
65
|
+
this.seen.delete(this.seen.keys().next().value);
|
|
66
|
+
}
|
|
67
|
+
else if (this.receiver(sender, message.payload, route) === false)
|
|
68
|
+
return false;
|
|
69
|
+
return true;
|
|
70
|
+
};
|
|
71
|
+
start() {
|
|
72
|
+
if (this.started)
|
|
73
|
+
return;
|
|
74
|
+
this.started = true;
|
|
75
|
+
const controls = this.sdk._controlMessages?.();
|
|
76
|
+
if (typeof controls?.registerPubsub === 'function')
|
|
77
|
+
this.unregister = controls.registerPubsub(this.receive, { serviceAid: this.serviceAid, clock: this.clock, publishReceiver: this.publishReceiver });
|
|
78
|
+
else if (typeof this.sdk.registerPubSubReceiver === 'function')
|
|
79
|
+
this.unregister = this.sdk.registerPubSubReceiver(this.receive, { serviceAid: this.serviceAid, clock: this.clock, publishReceiver: this.publishReceiver });
|
|
80
|
+
else
|
|
81
|
+
this.subscription = this.sdk.on('message.received', this.receiveEvent);
|
|
82
|
+
}
|
|
83
|
+
close() {
|
|
84
|
+
this.started = false;
|
|
85
|
+
this.generation++;
|
|
86
|
+
for (const cancel of [...this.waits])
|
|
87
|
+
cancel();
|
|
88
|
+
this.unregister?.();
|
|
89
|
+
this.unregister = undefined;
|
|
90
|
+
this.subscription?.unsubscribe();
|
|
91
|
+
this.sdk.off?.('message.received', this.receiveEvent);
|
|
92
|
+
this.subscription = undefined;
|
|
93
|
+
this.seen.clear();
|
|
94
|
+
}
|
|
95
|
+
pause(delay, generation) { return new Promise((resolve, reject) => { const cancel = () => { clearTimeout(timer); this.waits.delete(cancel); reject(new PubSubError('CLOSED')); }; const timer = setTimeout(() => { this.waits.delete(cancel); if (generation !== this.generation)
|
|
96
|
+
reject(new PubSubError('CLOSED'));
|
|
97
|
+
else
|
|
98
|
+
resolve(); }, Math.max(1, delay)); this.waits.add(cancel); }); }
|
|
99
|
+
pressure(transport, timeout, generation) { if (typeof transport?._eventBackpressure !== 'function')
|
|
100
|
+
return Promise.resolve(Number(transport?.foregroundWaiting ?? 0) > 0 || Number(transport?._ws?.bufferedAmount ?? 0) >= 65536); return new Promise((resolve, reject) => { const request = transport._eventBackpressure(timeout); const cancel = () => { request.cancel?.(); this.waits.delete(cancel); reject(new PubSubError('CLOSED')); }; this.waits.add(cancel); Promise.resolve(request).then(value => { if (generation !== this.generation)
|
|
101
|
+
reject(new PubSubError('CLOSED'));
|
|
102
|
+
else
|
|
103
|
+
resolve(value); }, reject).finally(() => this.waits.delete(cancel)); }); }
|
|
104
|
+
async send(to, payload, ttl, messageId, background = false, deadline, route) {
|
|
105
|
+
const generation = this.generation, expires = Number(payload.expires_at ?? this.clock() + ttl * 1000), operationDeadline = Math.min(expires, deadline ?? Infinity);
|
|
106
|
+
if (background) {
|
|
107
|
+
const size = wireSize(payload), transport = this.sdk._transport;
|
|
108
|
+
while (true) {
|
|
109
|
+
if (generation !== this.generation)
|
|
110
|
+
throw new PubSubError('CLOSED');
|
|
111
|
+
if (this.clock() >= operationDeadline)
|
|
112
|
+
throw new PubSubError(operationDeadline < expires ? 'TIMEOUT' : 'EXPIRED');
|
|
113
|
+
if (expires - this.clock() < 1000)
|
|
114
|
+
throw new PubSubError('EXPIRED');
|
|
115
|
+
const blocked = await this.pressure(transport, operationDeadline - this.clock(), generation);
|
|
116
|
+
if (generation !== this.generation)
|
|
117
|
+
throw new PubSubError('CLOSED');
|
|
118
|
+
if (blocked) {
|
|
119
|
+
await this.pause(Math.min(10, operationDeadline - this.clock()), generation);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (this.rate.take(size))
|
|
123
|
+
break;
|
|
124
|
+
await this.pause(Math.min(this.rate.delay(size), operationDeadline - this.clock()), generation);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const remaining = Math.floor((expires - this.clock()) / 1000);
|
|
128
|
+
ttl = Math.min(ttl, remaining, 3600);
|
|
129
|
+
if (!Number.isInteger(ttl) || ttl < 1)
|
|
130
|
+
throw new PubSubError('EXPIRED');
|
|
131
|
+
if (this.publishReceiver && (!route?.device_id || !route.slot_id))
|
|
132
|
+
throw new PubSubError('INVALID_TARGET');
|
|
133
|
+
const headers = { message_class: 'sdk_control', sdk_control_protocol: 'aun.pubsub', sdk_control_version: 1, ...(this.publishReceiver ? { target_device_id: route.device_id, target_slot_id: route.slot_id } : { service_target: 'event_service' }) };
|
|
134
|
+
return this.sdk.call('message.send', { to, payload, ttl, message_id: messageId, encrypt: true, ...(route ? { device_id: route.device_id } : {}), message_class: 'sdk_control', sdk_control_protocol: 'aun.pubsub', sdk_control_version: 1, protected_headers: headers, _rpc_background_kind: background ? 'event' : undefined, _rpc_deadline: operationDeadline }, { background: background ? 'event' : false, deadline: operationDeadline });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/pubsub/channel.ts"],"names":[],"mappings":"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"}
|