@meshline/sdk 0.0.0-stage → 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -2
  3. package/dist/channels/repository.d.ts +73 -0
  4. package/dist/channels/repository.d.ts.map +1 -0
  5. package/dist/channels/repository.js +367 -0
  6. package/dist/channels/repository.js.map +1 -0
  7. package/dist/client/account-operations.d.ts +41 -0
  8. package/dist/client/account-operations.d.ts.map +1 -0
  9. package/dist/client/account-operations.js +304 -0
  10. package/dist/client/account-operations.js.map +1 -0
  11. package/dist/client/conversations.d.ts +36 -0
  12. package/dist/client/conversations.d.ts.map +1 -0
  13. package/dist/client/conversations.js +144 -0
  14. package/dist/client/conversations.js.map +1 -0
  15. package/dist/client.d.ts +53 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +162 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/components/account.d.ts +38 -0
  20. package/dist/components/account.d.ts.map +1 -0
  21. package/dist/components/account.js +243 -0
  22. package/dist/components/account.js.map +1 -0
  23. package/dist/components/channel.d.ts +78 -0
  24. package/dist/components/channel.d.ts.map +1 -0
  25. package/dist/components/channel.js +475 -0
  26. package/dist/components/channel.js.map +1 -0
  27. package/dist/components/component.d.ts +49 -0
  28. package/dist/components/component.d.ts.map +1 -0
  29. package/dist/components/component.js +194 -0
  30. package/dist/components/component.js.map +1 -0
  31. package/dist/components/device.d.ts +60 -0
  32. package/dist/components/device.d.ts.map +1 -0
  33. package/dist/components/device.js +648 -0
  34. package/dist/components/device.js.map +1 -0
  35. package/dist/components/group.d.ts +141 -0
  36. package/dist/components/group.d.ts.map +1 -0
  37. package/dist/components/group.js +933 -0
  38. package/dist/components/group.js.map +1 -0
  39. package/dist/components/message.d.ts +63 -0
  40. package/dist/components/message.d.ts.map +1 -0
  41. package/dist/components/message.js +439 -0
  42. package/dist/components/message.js.map +1 -0
  43. package/dist/components/profile.d.ts +37 -0
  44. package/dist/components/profile.d.ts.map +1 -0
  45. package/dist/components/profile.js +232 -0
  46. package/dist/components/profile.js.map +1 -0
  47. package/dist/crypto/groups.d.ts +56 -0
  48. package/dist/crypto/groups.d.ts.map +1 -0
  49. package/dist/crypto/groups.js +163 -0
  50. package/dist/crypto/groups.js.map +1 -0
  51. package/dist/crypto/messages.d.ts +52 -0
  52. package/dist/crypto/messages.d.ts.map +1 -0
  53. package/dist/crypto/messages.js +180 -0
  54. package/dist/crypto/messages.js.map +1 -0
  55. package/dist/crypto/primitives.d.ts +30 -0
  56. package/dist/crypto/primitives.d.ts.map +1 -0
  57. package/dist/crypto/primitives.js +102 -0
  58. package/dist/crypto/primitives.js.map +1 -0
  59. package/dist/errors.d.ts +11 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +14 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/groups/account-sync.d.ts +28 -0
  64. package/dist/groups/account-sync.d.ts.map +1 -0
  65. package/dist/groups/account-sync.js +235 -0
  66. package/dist/groups/account-sync.js.map +1 -0
  67. package/dist/groups/messages.d.ts +39 -0
  68. package/dist/groups/messages.d.ts.map +1 -0
  69. package/dist/groups/messages.js +141 -0
  70. package/dist/groups/messages.js.map +1 -0
  71. package/dist/groups/operations.d.ts +57 -0
  72. package/dist/groups/operations.d.ts.map +1 -0
  73. package/dist/groups/operations.js +225 -0
  74. package/dist/groups/operations.js.map +1 -0
  75. package/dist/groups/repository.d.ts +56 -0
  76. package/dist/groups/repository.d.ts.map +1 -0
  77. package/dist/groups/repository.js +254 -0
  78. package/dist/groups/repository.js.map +1 -0
  79. package/dist/groups/secrets.d.ts +67 -0
  80. package/dist/groups/secrets.d.ts.map +1 -0
  81. package/dist/groups/secrets.js +452 -0
  82. package/dist/groups/secrets.js.map +1 -0
  83. package/dist/groups/state.d.ts +39 -0
  84. package/dist/groups/state.d.ts.map +1 -0
  85. package/dist/groups/state.js +201 -0
  86. package/dist/groups/state.js.map +1 -0
  87. package/dist/identity/identifiers.d.ts +9 -0
  88. package/dist/identity/identifiers.d.ts.map +1 -0
  89. package/dist/identity/identifiers.js +37 -0
  90. package/dist/identity/identifiers.js.map +1 -0
  91. package/dist/identity/neo.d.ts +11 -0
  92. package/dist/identity/neo.d.ts.map +1 -0
  93. package/dist/identity/neo.js +77 -0
  94. package/dist/identity/neo.js.map +1 -0
  95. package/dist/index.d.ts +53 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +46 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/interactions.d.ts +31 -0
  100. package/dist/interactions.d.ts.map +1 -0
  101. package/dist/interactions.js +2 -0
  102. package/dist/interactions.js.map +1 -0
  103. package/dist/messages/account-sender.d.ts +9 -0
  104. package/dist/messages/account-sender.d.ts.map +1 -0
  105. package/dist/messages/account-sender.js +46 -0
  106. package/dist/messages/account-sender.js.map +1 -0
  107. package/dist/messages/contacts.d.ts +103 -0
  108. package/dist/messages/contacts.d.ts.map +1 -0
  109. package/dist/messages/contacts.js +525 -0
  110. package/dist/messages/contacts.js.map +1 -0
  111. package/dist/messages/outbox.d.ts +66 -0
  112. package/dist/messages/outbox.d.ts.map +1 -0
  113. package/dist/messages/outbox.js +167 -0
  114. package/dist/messages/outbox.js.map +1 -0
  115. package/dist/messages/receiver.d.ts +35 -0
  116. package/dist/messages/receiver.d.ts.map +1 -0
  117. package/dist/messages/receiver.js +113 -0
  118. package/dist/messages/receiver.js.map +1 -0
  119. package/dist/messages/repository.d.ts +89 -0
  120. package/dist/messages/repository.d.ts.map +1 -0
  121. package/dist/messages/repository.js +295 -0
  122. package/dist/messages/repository.js.map +1 -0
  123. package/dist/models/authentication.d.ts +37 -0
  124. package/dist/models/authentication.d.ts.map +1 -0
  125. package/dist/models/authentication.js +53 -0
  126. package/dist/models/authentication.js.map +1 -0
  127. package/dist/models/channels.d.ts +141 -0
  128. package/dist/models/channels.d.ts.map +1 -0
  129. package/dist/models/channels.js +258 -0
  130. package/dist/models/channels.js.map +1 -0
  131. package/dist/models/contacts.d.ts +68 -0
  132. package/dist/models/contacts.d.ts.map +1 -0
  133. package/dist/models/contacts.js +186 -0
  134. package/dist/models/contacts.js.map +1 -0
  135. package/dist/models/content.d.ts +37 -0
  136. package/dist/models/content.d.ts.map +1 -0
  137. package/dist/models/content.js +137 -0
  138. package/dist/models/content.js.map +1 -0
  139. package/dist/models/device-state.d.ts +8 -0
  140. package/dist/models/device-state.d.ts.map +1 -0
  141. package/dist/models/device-state.js +22 -0
  142. package/dist/models/device-state.js.map +1 -0
  143. package/dist/models/group-admission.d.ts +111 -0
  144. package/dist/models/group-admission.d.ts.map +1 -0
  145. package/dist/models/group-admission.js +153 -0
  146. package/dist/models/group-admission.js.map +1 -0
  147. package/dist/models/group-keys.d.ts +30 -0
  148. package/dist/models/group-keys.d.ts.map +1 -0
  149. package/dist/models/group-keys.js +52 -0
  150. package/dist/models/group-keys.js.map +1 -0
  151. package/dist/models/group-management.d.ts +190 -0
  152. package/dist/models/group-management.d.ts.map +1 -0
  153. package/dist/models/group-management.js +263 -0
  154. package/dist/models/group-management.js.map +1 -0
  155. package/dist/models/groups.d.ts +81 -0
  156. package/dist/models/groups.d.ts.map +1 -0
  157. package/dist/models/groups.js +127 -0
  158. package/dist/models/groups.js.map +1 -0
  159. package/dist/models/identity.d.ts +47 -0
  160. package/dist/models/identity.d.ts.map +1 -0
  161. package/dist/models/identity.js +136 -0
  162. package/dist/models/identity.js.map +1 -0
  163. package/dist/models/messages.d.ts +104 -0
  164. package/dist/models/messages.d.ts.map +1 -0
  165. package/dist/models/messages.js +168 -0
  166. package/dist/models/messages.js.map +1 -0
  167. package/dist/models/profile.d.ts +24 -0
  168. package/dist/models/profile.d.ts.map +1 -0
  169. package/dist/models/profile.js +47 -0
  170. package/dist/models/profile.js.map +1 -0
  171. package/dist/models/relay.d.ts +39 -0
  172. package/dist/models/relay.d.ts.map +1 -0
  173. package/dist/models/relay.js +160 -0
  174. package/dist/models/relay.js.map +1 -0
  175. package/dist/protocol/codec.d.ts +36 -0
  176. package/dist/protocol/codec.d.ts.map +1 -0
  177. package/dist/protocol/codec.js +144 -0
  178. package/dist/protocol/codec.js.map +1 -0
  179. package/dist/protocol/context.d.ts +14 -0
  180. package/dist/protocol/context.d.ts.map +1 -0
  181. package/dist/protocol/context.js +43 -0
  182. package/dist/protocol/context.js.map +1 -0
  183. package/dist/protocol/encoding.d.ts +15 -0
  184. package/dist/protocol/encoding.d.ts.map +1 -0
  185. package/dist/protocol/encoding.js +133 -0
  186. package/dist/protocol/encoding.js.map +1 -0
  187. package/dist/protocol/json.d.ts +16 -0
  188. package/dist/protocol/json.d.ts.map +1 -0
  189. package/dist/protocol/json.js +172 -0
  190. package/dist/protocol/json.js.map +1 -0
  191. package/dist/protocol/validation.d.ts +4 -0
  192. package/dist/protocol/validation.d.ts.map +1 -0
  193. package/dist/protocol/validation.js +18 -0
  194. package/dist/protocol/validation.js.map +1 -0
  195. package/dist/runtime/abort.d.ts +6 -0
  196. package/dist/runtime/abort.d.ts.map +1 -0
  197. package/dist/runtime/abort.js +32 -0
  198. package/dist/runtime/abort.js.map +1 -0
  199. package/dist/runtime/async-gate.d.ts +6 -0
  200. package/dist/runtime/async-gate.d.ts.map +1 -0
  201. package/dist/runtime/async-gate.js +15 -0
  202. package/dist/runtime/async-gate.js.map +1 -0
  203. package/dist/runtime/async-pulse.d.ts +7 -0
  204. package/dist/runtime/async-pulse.d.ts.map +1 -0
  205. package/dist/runtime/async-pulse.js +23 -0
  206. package/dist/runtime/async-pulse.js.map +1 -0
  207. package/dist/runtime/clock.d.ts +16 -0
  208. package/dist/runtime/clock.d.ts.map +1 -0
  209. package/dist/runtime/clock.js +62 -0
  210. package/dist/runtime/clock.js.map +1 -0
  211. package/dist/runtime/events.d.ts +11 -0
  212. package/dist/runtime/events.d.ts.map +1 -0
  213. package/dist/runtime/events.js +45 -0
  214. package/dist/runtime/events.js.map +1 -0
  215. package/dist/runtime/url.d.ts +3 -0
  216. package/dist/runtime/url.d.ts.map +1 -0
  217. package/dist/runtime/url.js +23 -0
  218. package/dist/runtime/url.js.map +1 -0
  219. package/dist/storage/signed-request.d.ts +14 -0
  220. package/dist/storage/signed-request.d.ts.map +1 -0
  221. package/dist/storage/signed-request.js +26 -0
  222. package/dist/storage/signed-request.js.map +1 -0
  223. package/dist/storage/store.d.ts +58 -0
  224. package/dist/storage/store.d.ts.map +1 -0
  225. package/dist/storage/store.js +52 -0
  226. package/dist/storage/store.js.map +1 -0
  227. package/dist/storage/transaction.d.ts +7 -0
  228. package/dist/storage/transaction.d.ts.map +1 -0
  229. package/dist/storage/transaction.js +22 -0
  230. package/dist/storage/transaction.js.map +1 -0
  231. package/dist/transport/client.d.ts +61 -0
  232. package/dist/transport/client.d.ts.map +1 -0
  233. package/dist/transport/client.js +392 -0
  234. package/dist/transport/client.js.map +1 -0
  235. package/dist/transport/discovery.d.ts +19 -0
  236. package/dist/transport/discovery.d.ts.map +1 -0
  237. package/dist/transport/discovery.js +75 -0
  238. package/dist/transport/discovery.js.map +1 -0
  239. package/dist/transport/endpoint.d.ts +6 -0
  240. package/dist/transport/endpoint.d.ts.map +1 -0
  241. package/dist/transport/endpoint.js +35 -0
  242. package/dist/transport/endpoint.js.map +1 -0
  243. package/dist/transport/http.d.ts +52 -0
  244. package/dist/transport/http.d.ts.map +1 -0
  245. package/dist/transport/http.js +128 -0
  246. package/dist/transport/http.js.map +1 -0
  247. package/dist/transport/pool.d.ts +31 -0
  248. package/dist/transport/pool.d.ts.map +1 -0
  249. package/dist/transport/pool.js +137 -0
  250. package/dist/transport/pool.js.map +1 -0
  251. package/dist/transport/relay-error.d.ts +23 -0
  252. package/dist/transport/relay-error.d.ts.map +1 -0
  253. package/dist/transport/relay-error.js +47 -0
  254. package/dist/transport/relay-error.js.map +1 -0
  255. package/dist/transport/rpc.d.ts +31 -0
  256. package/dist/transport/rpc.d.ts.map +1 -0
  257. package/dist/transport/rpc.js +56 -0
  258. package/dist/transport/rpc.js.map +1 -0
  259. package/dist/transport/session.d.ts +49 -0
  260. package/dist/transport/session.d.ts.map +1 -0
  261. package/dist/transport/session.js +169 -0
  262. package/dist/transport/session.js.map +1 -0
  263. package/dist/transport/socket.d.ts +55 -0
  264. package/dist/transport/socket.d.ts.map +1 -0
  265. package/dist/transport/socket.js +266 -0
  266. package/dist/transport/socket.js.map +1 -0
  267. package/dist/transport/subscription.d.ts +36 -0
  268. package/dist/transport/subscription.d.ts.map +1 -0
  269. package/dist/transport/subscription.js +169 -0
  270. package/dist/transport/subscription.js.map +1 -0
  271. package/package.json +35 -4
  272. package/src/channels/repository.ts +244 -0
  273. package/src/client/account-operations.ts +183 -0
  274. package/src/client/conversations.ts +95 -0
  275. package/src/client.ts +108 -0
  276. package/src/components/account.ts +206 -0
  277. package/src/components/channel.ts +253 -0
  278. package/src/components/component.ts +151 -0
  279. package/src/components/device.ts +455 -0
  280. package/src/components/group.ts +546 -0
  281. package/src/components/message.ts +253 -0
  282. package/src/components/profile.ts +179 -0
  283. package/src/crypto/groups.ts +107 -0
  284. package/src/crypto/messages.ts +129 -0
  285. package/src/crypto/primitives.ts +103 -0
  286. package/src/errors.ts +13 -0
  287. package/src/groups/account-sync.ts +144 -0
  288. package/src/groups/messages.ts +89 -0
  289. package/src/groups/operations.ts +145 -0
  290. package/src/groups/repository.ts +161 -0
  291. package/src/groups/secrets.ts +256 -0
  292. package/src/groups/state.ts +138 -0
  293. package/src/identity/identifiers.ts +41 -0
  294. package/src/identity/neo.ts +72 -0
  295. package/src/index.ts +52 -0
  296. package/src/interactions.ts +35 -0
  297. package/src/messages/account-sender.ts +33 -0
  298. package/src/messages/contacts.ts +379 -0
  299. package/src/messages/outbox.ts +152 -0
  300. package/src/messages/receiver.ts +86 -0
  301. package/src/messages/repository.ts +230 -0
  302. package/src/models/authentication.ts +63 -0
  303. package/src/models/channels.ts +155 -0
  304. package/src/models/contacts.ts +141 -0
  305. package/src/models/content.ts +105 -0
  306. package/src/models/device-state.ts +18 -0
  307. package/src/models/group-admission.ts +110 -0
  308. package/src/models/group-keys.ts +34 -0
  309. package/src/models/group-management.ts +182 -0
  310. package/src/models/groups.ts +100 -0
  311. package/src/models/identity.ts +164 -0
  312. package/src/models/messages.ts +139 -0
  313. package/src/models/profile.ts +46 -0
  314. package/src/models/relay.ts +151 -0
  315. package/src/protocol/codec.ts +144 -0
  316. package/src/protocol/context.ts +39 -0
  317. package/src/protocol/encoding.ts +106 -0
  318. package/src/protocol/json.ts +140 -0
  319. package/src/protocol/validation.ts +13 -0
  320. package/src/runtime/abort.ts +27 -0
  321. package/src/runtime/async-gate.ts +16 -0
  322. package/src/runtime/async-pulse.ts +20 -0
  323. package/src/runtime/clock.ts +63 -0
  324. package/src/runtime/events.ts +31 -0
  325. package/src/runtime/url.ts +17 -0
  326. package/src/storage/signed-request.ts +26 -0
  327. package/src/storage/store.ts +90 -0
  328. package/src/storage/transaction.ts +17 -0
  329. package/src/transport/client.ts +328 -0
  330. package/src/transport/discovery.ts +64 -0
  331. package/src/transport/endpoint.ts +32 -0
  332. package/src/transport/http.ts +129 -0
  333. package/src/transport/pool.ts +115 -0
  334. package/src/transport/relay-error.ts +46 -0
  335. package/src/transport/rpc.ts +56 -0
  336. package/src/transport/session.ts +154 -0
  337. package/src/transport/socket.ts +248 -0
  338. package/src/transport/subscription.ts +117 -0
@@ -0,0 +1,475 @@
1
+ import { systemRandom, verifyDevice } from '../crypto/primitives.js';
2
+ import { ProtocolError, StateConflictError } from '../errors.js';
3
+ import { createIdentifier, deriveResourceId, validateIdentifier } from '../identity/identifiers.js';
4
+ import { validateAccountId, validateRelayId } from '../identity/neo.js';
5
+ import { channelCloseRequestCodec, channelDescriptorCodec, channelPayloadCodec, channelPayloadInput, channelPostCodec, channelPostEditCodec, channelReadPageCodec, channelReadQueryCodec, channelReportRequestCodec, channelResolveQueryCodec, channelResolveResultCodec, channelSubscriptionRequestCodec, channelTimelineChangedCodec, validateChannelPayload, validateChannelPostRef, validateChannelReadQuery, validateChannelRef, validateChannelReportRequest, validateChannelTimelineChanged, verifyChannelDescriptor, } from '../models/channels.js';
6
+ import { certificateId } from '../models/identity.js';
7
+ import { ChannelRepository } from '../channels/repository.js';
8
+ import { snapshotReader } from '../messages/repository.js';
9
+ import { nextRevision } from '../protocol/context.js';
10
+ import { canonicalJson, requireObject, requireSafeInteger } from '../protocol/json.js';
11
+ import { AsyncGate } from '../runtime/async-gate.js';
12
+ import { AsyncPulse } from '../runtime/async-pulse.js';
13
+ import { throwIfAborted } from '../runtime/clock.js';
14
+ import { EventHub } from '../runtime/events.js';
15
+ import { RelayError } from '../transport/relay-error.js';
16
+ import { ClientComponent } from './component.js';
17
+ /** Public channels with verified historical permissions, durable exact requests and explicit runtime ownership. */
18
+ export class ChannelManager extends ClientComponent {
19
+ #store;
20
+ #pool;
21
+ #device;
22
+ #random;
23
+ #repository;
24
+ #writes = new AsyncGate();
25
+ #events = new EventHub();
26
+ #subscriptions = new Map();
27
+ #pulse;
28
+ #jobs = [];
29
+ constructor(options) {
30
+ super(options);
31
+ for (const dependency of [options.relayClients, options.deviceManager])
32
+ if (dependency.accountId !== this.accountId || dependency.context.toString() !== this.context.toString())
33
+ throw new ProtocolError('invalid_context', 'Channel dependencies belong to another network or account.');
34
+ this.#store = options.store;
35
+ this.#pool = options.relayClients;
36
+ this.#device = options.deviceManager;
37
+ this.#random = options.random ?? systemRandom;
38
+ this.#repository = new ChannelRepository(this.#store, this.context, this.accountId);
39
+ }
40
+ on(event, listener) { return this.#events.on(event, listener); }
41
+ #notify(event, value) { this.#events.notify(event, value, error => this.notifyBackgroundError({ operation: 'observer', resource: event, error })); }
42
+ #changed(channel, changes) { if (changes.channel)
43
+ this.#notify('channelChanged', changes.channel); if (changes.posts.length)
44
+ this.#notify('timelineChanged', { channel, changes: changes.posts }); }
45
+ async onInitialize(signal) { this.#device.ensureInitialized(); await this.#store.initialize({ context: this.context.toString(), accountId: this.accountId }, signal); }
46
+ async #hosting(relayId, signal) {
47
+ validateRelayId(relayId);
48
+ const relay = await this.#pool.get(relayId, { mode: 'device', signer: this.#device }, signal);
49
+ if (!(await relay.getDescriptor(signal)).capabilities?.includes('channel.host.v1'))
50
+ throw new ProtocolError('unsupported_capability', 'Relay does not support channel hosting.');
51
+ return relay;
52
+ }
53
+ async #resolve(relay, channel, revision, signal) {
54
+ const result = channelResolveResultCodec.decode((await relay.requestHttp('GET', 'channel.resolve', channelResolveQueryCodec.encode({ channelId: channel.channelId, ...(revision === undefined ? {} : { revision }) }), { signal })));
55
+ verifyChannelDescriptor(result, this.context, channel);
56
+ if (revision !== undefined && result.descriptor.revision !== revision)
57
+ throw new ProtocolError('invalid_revision', 'Relay returned another descriptor revision.');
58
+ return result;
59
+ }
60
+ #reader(relay, channel, signal) {
61
+ return {
62
+ read: async (query) => channelReadPageCodec.decode((await relay.requestHttp('GET', 'channel.read', channelReadQueryCodec.encode(query), { signal }))),
63
+ resolve: revision => this.#resolve(relay, channel, revision, signal),
64
+ };
65
+ }
66
+ async #sign(payload, signal) {
67
+ const copy = channelPayloadCodec.decode(channelPayloadCodec.encode(payload));
68
+ validateChannelPayload(copy, this.context);
69
+ const certificate = this.#device.certificate;
70
+ const id = certificateId(certificate, this.context);
71
+ const input = channelPayloadInput(copy, this.context);
72
+ const signature = await this.#device.sign(input, signal);
73
+ if (id !== certificateId(this.#device.certificate, this.context) || !verifyDevice(input, signature, certificate.signingPublicKey))
74
+ throw new StateConflictError('Local channel signing identity changed or returned an invalid signature.');
75
+ return { ...copy, value: { ...copy.value, deviceSignature: signature } };
76
+ }
77
+ #canWrite(descriptor, ownerOnly = false) {
78
+ if (descriptor.status !== 'active')
79
+ throw new ProtocolError('closed_channel', 'Channel is closed.');
80
+ if (descriptor.creator !== this.accountId && (ownerOnly || !descriptor.moderators?.includes(this.accountId)))
81
+ throw new ProtocolError('forbidden', 'Account is not permitted to modify this channel.');
82
+ }
83
+ async #saveOperation(operation, signal) { try {
84
+ await this.#repository.saveOperation(operation, signal);
85
+ }
86
+ finally {
87
+ this.#pulse?.pulse();
88
+ } }
89
+ async #send(relay, operation, recovering, signal) {
90
+ const methods = { 'channel.create': 'POST', 'channel.update': 'PUT', 'channel.close': 'DELETE', 'channel.post': 'PUT', 'channel.post.edit': 'PATCH', 'channel.post.delete': 'DELETE' };
91
+ const value = operation.payload;
92
+ const request = operation.method === 'channel.close' && value.kind === 'descriptor'
93
+ ? channelCloseRequestCodec.encode({ channelId: value.value.channelId, revision: value.value.revision, updatedAt: value.value.updatedAt, deviceSignature: value.value.deviceSignature }) : requireObject(channelPayloadCodec.encode(value));
94
+ try {
95
+ const result = await relay.requestHttp(methods[operation.method], operation.method, request, { signal });
96
+ if (operation.method === 'channel.post') {
97
+ const sequence = requireObject(result).sequence;
98
+ requireSafeInteger(sequence, 1);
99
+ return sequence;
100
+ }
101
+ return undefined;
102
+ }
103
+ catch (error) {
104
+ if (!recovering && error instanceof RelayError && error.isDefinitiveRejection)
105
+ await this.#repository.completeOperation(operation);
106
+ throw error;
107
+ }
108
+ }
109
+ async #publishDescriptor(relay, operation, recovering, signal) {
110
+ if (operation.payload.kind !== 'descriptor')
111
+ throw new ProtocolError('invalid_operation', 'Expected a descriptor operation.');
112
+ const descriptor = operation.payload.value;
113
+ let accepted;
114
+ try {
115
+ accepted = await this.#resolve(relay, operation.channel, descriptor.revision, signal);
116
+ }
117
+ catch (error) {
118
+ if (!(error instanceof RelayError && error.code === 'not_found'))
119
+ throw error;
120
+ }
121
+ if (accepted && channelDescriptorCodec.stringify(accepted.descriptor) !== channelDescriptorCodec.stringify(descriptor)) {
122
+ const changed = await this.#repository.saveDescriptor(operation.channel, accepted, operation);
123
+ if (changed)
124
+ this.#notify('channelChanged', changed);
125
+ throw new StateConflictError('Channel revision is occupied by a different descriptor.');
126
+ }
127
+ if (!accepted) {
128
+ await this.#send(relay, operation, recovering, signal);
129
+ accepted = { descriptor, signerCertificate: this.#device.certificate };
130
+ }
131
+ const changed = await this.#repository.saveDescriptor(operation.channel, accepted, operation);
132
+ if (changed)
133
+ this.#notify('channelChanged', changed);
134
+ this.#pulse?.pulse();
135
+ }
136
+ async #synchronize(relay, channel, after, advance, signal) {
137
+ for (;;) {
138
+ const result = await this.#repository.readPage(channel, { channelId: channel.channelId, after }, this.#reader(relay, channel, signal), advance, signal);
139
+ this.#changed(channel, result.changes);
140
+ if (!result.page.hasMore)
141
+ return;
142
+ after = result.page.events.at(-1).sequence;
143
+ }
144
+ }
145
+ async #publishPost(relay, operation, recovering, signal) {
146
+ if (operation.payload.kind !== 'post')
147
+ throw new ProtocolError('invalid_operation', 'Expected a post publication.');
148
+ const request = operation.payload.value;
149
+ let sequence = operation.acceptedSequence ?? await this.#repository.publication(operation.channel, request, signal);
150
+ if (sequence === undefined) {
151
+ sequence = (await this.#send(relay, operation, recovering, signal));
152
+ operation = await this.#repository.acknowledgePublication(operation, sequence);
153
+ }
154
+ await this.#synchronize(relay, operation.channel, sequence - 1, false, signal);
155
+ await this.#repository.confirmPublication(operation.channel, sequence, request, signal);
156
+ await this.#repository.completeOperation(operation);
157
+ this.#pulse?.pulse();
158
+ return { channel: operation.channel, sequence };
159
+ }
160
+ async #mutate(relay, operation, recovering, signal) {
161
+ if (operation.payload.kind !== 'edit' && operation.payload.kind !== 'delete')
162
+ throw new ProtocolError('invalid_operation', 'Expected a post edit or deletion.');
163
+ await this.#send(relay, operation, recovering, signal);
164
+ const change = await this.#repository.completeOperation(operation, operation.payload.kind === 'delete');
165
+ if (change)
166
+ this.#changed(operation.channel, { posts: [change] });
167
+ this.#pulse?.pulse();
168
+ if (!recovering)
169
+ await this.#synchronize(relay, operation.channel, operation.payload.value.targetSequence - 1, false, signal);
170
+ }
171
+ createChannel(relayId, name, options = {}) {
172
+ validateRelayId(relayId);
173
+ const description = options.description;
174
+ const moderators = options.moderators && [...options.moderators];
175
+ return this.runOperation(scope => this.#writes.run(async () => {
176
+ const relay = await this.#hosting(relayId, scope);
177
+ const nonce = this.#random.bytes(16);
178
+ const now = this.clock.nowSeconds();
179
+ const payload = await this.#sign({ kind: 'descriptor', value: { channelId: deriveResourceId('channel', this.accountId, relayId, nonce, this.context), nonce, creator: this.accountId, relayId,
180
+ name, ...(description === undefined ? {} : { description }), ...(moderators === undefined ? {} : { moderators }), revision: 0, status: 'active', createdAt: now, updatedAt: now, deviceSignature: new Uint8Array(64) } }, scope);
181
+ const channel = { channelId: payload.value.channelId, relayId };
182
+ const operation = { channel, method: 'channel.create', payload };
183
+ await this.#saveOperation(operation, scope);
184
+ await this.#publishDescriptor(relay, operation, false, scope);
185
+ return this.#info(channel, scope);
186
+ }, scope), options.signal);
187
+ }
188
+ async #info(channel, signal) { const record = await this.#repository.get(channel, signal); return { ref: channel, isFollowed: record.isFollowed, ...(record.descriptor ? { descriptor: record.descriptor } : {}) }; }
189
+ getChannel(channel, signal) {
190
+ channel = { ...channel };
191
+ validateChannelRef(channel);
192
+ return this.runOperation(async (scope) => {
193
+ const relay = await this.#hosting(channel.relayId, scope);
194
+ const changed = await this.#repository.saveDescriptor(channel, await this.#resolve(relay, channel, undefined, scope), undefined, scope);
195
+ if (changed)
196
+ this.#notify('channelChanged', changed);
197
+ return this.#info(channel, scope);
198
+ }, signal);
199
+ }
200
+ updateChannel(channel, update, signal) {
201
+ channel = { ...channel };
202
+ validateChannelRef(channel);
203
+ const copy = { ...update, ...(Array.isArray(update.moderators) ? { moderators: [...update.moderators] } : {}) };
204
+ if (copy.name === null)
205
+ throw new TypeError('Channel name cannot be deleted.');
206
+ return this.runOperation(scope => this.#writes.run(async () => {
207
+ const relay = await this.#hosting(channel.relayId, scope);
208
+ const current = (await this.#resolve(relay, channel, undefined, scope)).descriptor;
209
+ this.#canWrite(current, true);
210
+ const { description, moderators, ...base } = current;
211
+ const nextDescription = copy.description === undefined ? description : copy.description;
212
+ const nextModerators = copy.moderators === undefined ? moderators : copy.moderators;
213
+ const payload = await this.#sign({ kind: 'descriptor', value: { ...base, name: copy.name ?? current.name, ...(nextDescription == null ? {} : { description: nextDescription }), ...(nextModerators == null ? {} : { moderators: nextModerators }), revision: nextRevision(current.revision), updatedAt: this.clock.nowSeconds() } }, scope);
214
+ const operation = { channel, method: 'channel.update', payload };
215
+ await this.#saveOperation(operation, scope);
216
+ await this.#publishDescriptor(relay, operation, false, scope);
217
+ return this.#info(channel, scope);
218
+ }, scope), signal);
219
+ }
220
+ closeChannel(channel, signal) {
221
+ channel = { ...channel };
222
+ validateChannelRef(channel);
223
+ return this.runOperation(scope => this.#writes.run(async () => {
224
+ const relay = await this.#hosting(channel.relayId, scope);
225
+ const current = (await this.#resolve(relay, channel, undefined, scope)).descriptor;
226
+ this.#canWrite(current, true);
227
+ const payload = await this.#sign({ kind: 'descriptor', value: { ...current, status: 'closed', revision: nextRevision(current.revision), updatedAt: this.clock.nowSeconds() } }, scope);
228
+ const operation = { channel, method: 'channel.close', payload };
229
+ await this.#saveOperation(operation, scope);
230
+ await this.#publishDescriptor(relay, operation, false, scope);
231
+ }, scope), signal);
232
+ }
233
+ publishPost(channel, draft, signal) {
234
+ channel = { ...channel };
235
+ validateChannelRef(channel);
236
+ const basis = channelPostCodec.decode(channelPostCodec.encode({ ...draft, channelId: channel.channelId, messageId: createIdentifier('message', this.#random), deviceSignature: new Uint8Array(64) }));
237
+ return this.runOperation(scope => this.#writes.run(async () => {
238
+ const relay = await this.#hosting(channel.relayId, scope);
239
+ this.#canWrite((await this.#resolve(relay, channel, undefined, scope)).descriptor);
240
+ const payload = await this.#sign({ kind: 'post', value: basis }, scope);
241
+ const operation = { channel, method: 'channel.post', payload };
242
+ await this.#saveOperation(operation, scope);
243
+ const reference = await this.#publishPost(relay, operation, false, scope);
244
+ const result = await this.#repository.post(reference, scope);
245
+ if (!result)
246
+ throw new ProtocolError('post_deleted', 'The accepted post was already deleted.');
247
+ return result;
248
+ }, scope), signal);
249
+ }
250
+ editPost(post, update, signal) {
251
+ post = { channel: { ...post.channel }, sequence: post.sequence };
252
+ validateChannelPostRef(post);
253
+ const basis = channelPostEditCodec.decode(channelPostEditCodec.encode({ ...update, channelId: post.channel.channelId, targetSequence: post.sequence, deviceSignature: new Uint8Array(64) }));
254
+ return this.runOperation(scope => this.#writes.run(async () => {
255
+ const relay = await this.#hosting(post.channel.relayId, scope);
256
+ this.#canWrite((await this.#resolve(relay, post.channel, undefined, scope)).descriptor);
257
+ const payload = await this.#sign({ kind: 'edit', value: basis }, scope);
258
+ const operation = { channel: post.channel, method: 'channel.post.edit', payload };
259
+ await this.#saveOperation(operation, scope);
260
+ await this.#mutate(relay, operation, false, scope);
261
+ const result = await this.#repository.post(post, scope);
262
+ if (!result)
263
+ throw new ProtocolError('post_unavailable', 'The edited post is no longer available.');
264
+ return result;
265
+ }, scope), signal);
266
+ }
267
+ deletePost(post, signal) {
268
+ post = { channel: { ...post.channel }, sequence: post.sequence };
269
+ validateChannelPostRef(post);
270
+ return this.runOperation(scope => this.#writes.run(async () => {
271
+ const relay = await this.#hosting(post.channel.relayId, scope);
272
+ this.#canWrite((await this.#resolve(relay, post.channel, undefined, scope)).descriptor);
273
+ const payload = await this.#sign({ kind: 'delete', value: { channelId: post.channel.channelId, targetSequence: post.sequence, deviceSignature: new Uint8Array(64) } }, scope);
274
+ const operation = { channel: post.channel, method: 'channel.post.delete', payload };
275
+ await this.#saveOperation(operation, scope);
276
+ await this.#mutate(relay, operation, false, scope);
277
+ }, scope), signal);
278
+ }
279
+ reportPost(post, reason, signal) {
280
+ post = { channel: { ...post.channel }, sequence: post.sequence };
281
+ validateChannelPostRef(post);
282
+ const request = { channelId: post.channel.channelId, targetSequence: post.sequence, reason };
283
+ validateChannelReportRequest(request);
284
+ return this.runOperation(async (scope) => { const relay = await this.#hosting(post.channel.relayId, scope); await relay.requestHttp('PUT', 'channel.post.report', channelReportRequestCodec.encode(request), { signal: scope }); }, signal);
285
+ }
286
+ loadChannelHistory(channel, page = {}, signal) {
287
+ channel = { ...channel };
288
+ validateChannelRef(channel);
289
+ let before;
290
+ if (page.cursor !== undefined) {
291
+ if (!/^(0|[1-9][0-9]*)$/.test(page.cursor))
292
+ throw new TypeError('History cursor must be a nonnegative safe integer.');
293
+ before = Number(page.cursor);
294
+ requireSafeInteger(before, 0);
295
+ }
296
+ const query = { channelId: channel.channelId, ...(before === undefined ? {} : { before }), ...(page.limit === undefined ? {} : { limit: page.limit }) };
297
+ validateChannelReadQuery(query);
298
+ return this.runOperation(scope => this.#writes.run(async () => {
299
+ const relay = await this.#hosting(channel.relayId, scope);
300
+ const result = await this.#repository.readPage(channel, query, this.#reader(relay, channel, scope), false, scope);
301
+ this.#changed(channel, result.changes);
302
+ const items = [];
303
+ for (const event of result.page.events)
304
+ if (event.payload.kind === 'post') {
305
+ const post = await this.#repository.post({ channel, sequence: event.sequence }, scope);
306
+ if (post)
307
+ items.push(post);
308
+ }
309
+ return { items, ...(result.page.hasMore ? { nextCursor: String(result.page.events[0].sequence) } : {}) };
310
+ }, scope), signal);
311
+ }
312
+ getPosts(query = {}, signal) {
313
+ const { channelId, author } = query;
314
+ if (channelId !== undefined)
315
+ validateIdentifier('channel', channelId);
316
+ if (author !== undefined)
317
+ validateAccountId(author);
318
+ return this.runOperation(scope => this.#repository.posts(channelId, author, scope), signal);
319
+ }
320
+ async follow(channel, signal) {
321
+ channel = { ...channel };
322
+ validateChannelRef(channel);
323
+ await this.getChannel(channel, signal);
324
+ const changed = await this.runOperation(scope => this.#repository.follow(channel, true, scope), signal);
325
+ if (changed)
326
+ this.#notify('followChanged', { channel, isFollowed: true });
327
+ this.#pulse?.pulse();
328
+ }
329
+ async unfollow(channel, signal) {
330
+ channel = { ...channel };
331
+ validateChannelRef(channel);
332
+ const changed = await this.runOperation(scope => this.#repository.follow(channel, false, scope), signal);
333
+ if (changed)
334
+ this.#notify('followChanged', { channel, isFollowed: false });
335
+ this.#pulse?.pulse();
336
+ }
337
+ getFollowed(relayId, signal) { if (relayId !== undefined)
338
+ validateRelayId(relayId); return this.runOperation(async (scope) => snapshotReader((await this.#repository.followed(relayId, scope)).map(record => ({ ref: record.channel, isFollowed: record.isFollowed, ...(record.descriptor ? { descriptor: record.descriptor } : {}) }))), signal); }
339
+ async onStart() { void this.#device.certificate; this.#pulse = new AsyncPulse(); this.#jobs = [this.#refresh(this.runtimeSignal), this.#poll(this.runtimeSignal)]; this.#pulse.pulse(); }
340
+ async #poll(signal) { try {
341
+ for (;;) {
342
+ await this.clock.delay(30000, signal);
343
+ this.#pulse?.pulse();
344
+ }
345
+ }
346
+ catch (error) {
347
+ if (!signal.aborted)
348
+ throw error;
349
+ } }
350
+ async #recover(signal) {
351
+ await this.#writes.run(async () => {
352
+ for (const operation of await this.#repository.operations(signal)) {
353
+ try {
354
+ const relay = await this.#hosting(operation.channel.relayId, signal);
355
+ if (operation.payload.kind === 'descriptor')
356
+ await this.#publishDescriptor(relay, operation, true, signal);
357
+ else if (operation.payload.kind === 'post') {
358
+ if (operation.acceptedSequence === undefined)
359
+ await this.#synchronize(relay, operation.channel, (await this.#repository.get(operation.channel, signal)).syncSequence, false, signal);
360
+ await this.#publishPost(relay, operation, true, signal);
361
+ }
362
+ else {
363
+ await this.#synchronize(relay, operation.channel, operation.payload.value.targetSequence - 1, false, signal);
364
+ if (await this.#repository.hasOperation(operation, signal))
365
+ await this.#mutate(relay, operation, true, signal);
366
+ }
367
+ }
368
+ catch (error) {
369
+ throwIfAborted(signal);
370
+ this.notifyBackgroundError({ operation: 'recover_channel', resource: operation.channel.channelId, error });
371
+ }
372
+ }
373
+ }, signal);
374
+ }
375
+ async #subscribe(client, channelIds, signal) {
376
+ if (!(await client.getDescriptor(signal)).endpoints.some(endpoint => endpoint.startsWith('wss://')))
377
+ return;
378
+ const limit = (await client.getInfo(signal)).limits.maxChannelSubscriptions ?? 0;
379
+ const selected = channelIds.slice(0, limit);
380
+ let observed = this.#subscriptions.get(client.relayId);
381
+ if (observed?.client !== client) {
382
+ if (observed) {
383
+ for (const detach of observed.detach)
384
+ detach();
385
+ await observed.subscription.dispose();
386
+ }
387
+ const subscription = client.createSubscription('channel.subscribe', { channel_ids: [] }, { signal, onSubscribed: () => { this.#pulse?.pulse(); }, onError: error => this.notifyBackgroundError({ operation: 'subscribe_channel', resource: client.relayId, error }) });
388
+ observed = { client, subscription, selected: new Set(), detach: [] };
389
+ this.#subscriptions.set(client.relayId, observed);
390
+ const owner = observed;
391
+ owner.detach.push(client.on('notificationReceived', notification => {
392
+ if (notification.method !== 'channel.timeline.changed' || !owner.selected.size)
393
+ return;
394
+ const value = channelTimelineChangedCodec.decode(notification.params);
395
+ validateChannelTimelineChanged(value);
396
+ if (owner.selected.has(value.channelId))
397
+ this.#pulse?.pulse();
398
+ }), client.on('socketConnected', () => { this.#pulse?.pulse(); }), client.on('errorOccurred', error => this.notifyBackgroundError({ operation: 'connect_channel', resource: client.relayId, error })));
399
+ }
400
+ observed.selected = new Set(selected);
401
+ observed.subscription.update(channelSubscriptionRequestCodec.encode({ channelIds: selected }));
402
+ }
403
+ async #refresh(signal) {
404
+ try {
405
+ for (;;) {
406
+ await this.#pulse.wait(signal);
407
+ try {
408
+ await this.#recover(signal);
409
+ const records = await this.#repository.followed(undefined, signal);
410
+ const relays = new Set(records.map(record => record.channel.relayId));
411
+ for (const [id, observed] of this.#subscriptions)
412
+ if (!relays.has(id)) {
413
+ observed.selected.clear();
414
+ observed.subscription.update({ channel_ids: [] });
415
+ }
416
+ for (const id of relays) {
417
+ try {
418
+ const client = await this.#hosting(id, signal);
419
+ const channels = records.filter(record => record.channel.relayId === id);
420
+ try {
421
+ await this.#subscribe(client, channels.map(record => record.channel.channelId), signal);
422
+ }
423
+ catch (error) {
424
+ throwIfAborted(signal);
425
+ this.notifyBackgroundError({ operation: 'subscribe_channel', resource: id, error });
426
+ }
427
+ for (const record of channels) {
428
+ try {
429
+ await this.#writes.run(async () => {
430
+ const changed = await this.#repository.saveDescriptor(record.channel, await this.#resolve(client, record.channel, undefined, signal), undefined, signal);
431
+ if (changed)
432
+ this.#notify('channelChanged', changed);
433
+ await this.#synchronize(client, record.channel, (await this.#repository.get(record.channel, signal)).syncSequence, true, signal);
434
+ }, signal);
435
+ }
436
+ catch (error) {
437
+ throwIfAborted(signal);
438
+ this.notifyBackgroundError({ operation: 'synchronize_channel', resource: record.channel.channelId, error });
439
+ }
440
+ }
441
+ }
442
+ catch (error) {
443
+ throwIfAborted(signal);
444
+ this.notifyBackgroundError({ operation: 'connect_channel', resource: id, error });
445
+ }
446
+ }
447
+ }
448
+ catch (error) {
449
+ throwIfAborted(signal);
450
+ this.notifyBackgroundError({ operation: 'synchronize_channels', error });
451
+ }
452
+ }
453
+ }
454
+ catch (error) {
455
+ if (!signal.aborted)
456
+ throw error;
457
+ }
458
+ }
459
+ async onStop() {
460
+ try {
461
+ await Promise.all(this.#jobs);
462
+ }
463
+ finally {
464
+ for (const observed of this.#subscriptions.values())
465
+ for (const detach of observed.detach)
466
+ detach();
467
+ await Promise.all([...this.#subscriptions.values()].map(observed => observed.subscription.dispose()));
468
+ this.#subscriptions.clear();
469
+ this.#jobs = [];
470
+ this.#pulse = undefined;
471
+ }
472
+ }
473
+ async onDispose() { this.#events.clear(); }
474
+ }
475
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/components/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { NetworkContext } from '../protocol/context.js';
2
+ import { type RuntimeClock } from '../runtime/clock.js';
3
+ import { type EventListener } from '../runtime/events.js';
4
+ export type ComponentState = 'uninitialized' | 'stopped' | 'running' | 'stopping' | 'disposed';
5
+ export interface ClientOptions {
6
+ readonly context: NetworkContext;
7
+ readonly accountId: string;
8
+ readonly clock?: RuntimeClock;
9
+ }
10
+ export interface BackgroundFailure {
11
+ readonly operation: string;
12
+ readonly resource?: string;
13
+ readonly error: unknown;
14
+ }
15
+ export interface ComponentEvents {
16
+ readonly stateChanged: {
17
+ readonly previous: ComponentState;
18
+ readonly current: ComponentState;
19
+ };
20
+ readonly backgroundError: BackgroundFailure;
21
+ }
22
+ /** Constructors do no I/O. The application owns shared stores, signers and relay pools. */
23
+ export declare abstract class ClientComponent {
24
+ #private;
25
+ readonly context: NetworkContext;
26
+ readonly accountId: string;
27
+ protected readonly clock: RuntimeClock;
28
+ protected constructor(options: ClientOptions);
29
+ get lifecycleState(): ComponentState;
30
+ get lastBackgroundError(): BackgroundFailure | undefined;
31
+ onLifecycle<K extends keyof ComponentEvents>(event: K, listener: EventListener<ComponentEvents[K]>): () => void;
32
+ protected get runtimeSignal(): AbortSignal;
33
+ ensureInitialized(): void;
34
+ initialize(signal?: AbortSignal): Promise<void>;
35
+ start(signal?: AbortSignal): Promise<void>;
36
+ stop(signal?: AbortSignal): Promise<void>;
37
+ /** Derived public operations use this scope; emit observer events after it releases. */
38
+ protected runOperation<T>(action: (signal: AbortSignal) => Promise<T>, signal?: AbortSignal): Promise<T>;
39
+ protected reportBackgroundError(failure: BackgroundFailure): Promise<void>;
40
+ /** Runtime jobs must not wait for application handlers that can stop or dispose that same runtime. */
41
+ protected notifyBackgroundError(failure: BackgroundFailure): void;
42
+ dispose(): Promise<void>;
43
+ protected onInitialize(_signal: AbortSignal): Promise<void>;
44
+ /** Use runtimeSignal for background jobs; signal only controls startup. */
45
+ protected onStart(_signal: AbortSignal): Promise<void>;
46
+ protected onStop(): Promise<void>;
47
+ protected onDispose(): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/components/component.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAC/F,MAAM,WAAW,aAAa;IAAG,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE;AAC9H,MAAM,WAAW,iBAAiB;IAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AACtH,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,YAAY,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;KAAE,CAAC;IAC/F,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAC;CAC/C;AAED,2FAA2F;AAC3F,8BAAsB,eAAe;;IAUjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAEvC,SAAS,aAAa,OAAO,EAAE,aAAa,EAG3C;IACD,IAAI,cAAc,IAAI,cAAc,CAAwB;IAC5D,IAAI,mBAAmB,IAAI,iBAAiB,GAAG,SAAS,CAAoC;IAC5F,WAAW,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAA6C;IAI5J,SAAS,KAAK,aAAa,IAAI,WAAW,CAGzC;IAED,iBAAiB,IAAI,IAAI,CAGxB;IACK,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAapD;IACK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/C;IACK,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9C;IAMD,wFAAwF;IACxF,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAQvG;IACD,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE;IACD,sGAAsG;IACtG,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAEhE;IACD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBvB;IACD,UAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAG;IACpE,2EAA2E;IAC3E,UAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAG;IAC/D,UAAgB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IAC1C,UAAgB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;CAChD"}