@may-db/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Client.d.ts +20 -0
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +163 -0
- package/dist/Client.js.map +1 -0
- package/dist/MayDb.d.ts +20 -0
- package/dist/MayDb.d.ts.map +1 -0
- package/dist/MayDb.js +162 -0
- package/dist/MayDb.js.map +1 -0
- package/dist/Room.d.ts +81 -0
- package/dist/Room.d.ts.map +1 -0
- package/dist/Room.js +382 -0
- package/dist/Room.js.map +1 -0
- package/dist/authStorage.d.ts +8 -0
- package/dist/authStorage.d.ts.map +1 -0
- package/dist/authStorage.js +29 -0
- package/dist/authStorage.js.map +1 -0
- package/dist/hooks/useAllowedRooms.d.ts +12 -0
- package/dist/hooks/useAllowedRooms.d.ts.map +1 -0
- package/dist/hooks/useAllowedRooms.js +29 -0
- package/dist/hooks/useAllowedRooms.js.map +1 -0
- package/dist/hooks/useAsync.d.ts +8 -0
- package/dist/hooks/useAsync.d.ts.map +1 -0
- package/dist/hooks/useAsync.js +29 -0
- package/dist/hooks/useAsync.js.map +1 -0
- package/dist/hooks/useAuth.d.ts +11 -0
- package/dist/hooks/useAuth.d.ts.map +1 -0
- package/dist/hooks/useAuth.js +45 -0
- package/dist/hooks/useAuth.js.map +1 -0
- package/dist/hooks/usePresence.d.ts +30 -0
- package/dist/hooks/usePresence.d.ts.map +1 -0
- package/dist/hooks/usePresence.js +95 -0
- package/dist/hooks/usePresence.js.map +1 -0
- package/dist/hooks/useRoom.d.ts +11 -0
- package/dist/hooks/useRoom.d.ts.map +1 -0
- package/dist/hooks/useRoom.js +37 -0
- package/dist/hooks/useRoom.js.map +1 -0
- package/dist/hooks/useRoomMembers.d.ts +12 -0
- package/dist/hooks/useRoomMembers.d.ts.map +1 -0
- package/dist/hooks/useRoomMembers.js +37 -0
- package/dist/hooks/useRoomMembers.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/loginFlow.d.ts +4 -0
- package/dist/loginFlow.d.ts.map +1 -0
- package/dist/loginFlow.js +48 -0
- package/dist/loginFlow.js.map +1 -0
- package/dist/matrixId.d.ts +9 -0
- package/dist/matrixId.d.ts.map +1 -0
- package/dist/matrixId.js +14 -0
- package/dist/matrixId.js.map +1 -0
- package/dist/presence.d.ts +36 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +63 -0
- package/dist/presence.js.map +1 -0
- package/dist/singletonRoom.d.ts +3 -0
- package/dist/singletonRoom.d.ts.map +1 -0
- package/dist/singletonRoom.js +39 -0
- package/dist/singletonRoom.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/presenceColors.d.ts +3 -0
- package/dist/utils/presenceColors.d.ts.map +1 -0
- package/dist/utils/presenceColors.js +21 -0
- package/dist/utils/presenceColors.js.map +1 -0
- package/package.json +33 -0
package/dist/Room.js
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { MatrixProvider } from "matrix-crdt";
|
|
2
|
+
import * as sdk from "matrix-js-sdk";
|
|
3
|
+
import { Doc } from "yjs";
|
|
4
|
+
import { extractLocalpart } from "./matrixId";
|
|
5
|
+
export class Room {
|
|
6
|
+
/*
|
|
7
|
+
* Reactive-safe surface (render-safe reads/subscriptions):
|
|
8
|
+
* these values/listeners are safe to use in React render/computed paths.
|
|
9
|
+
*/
|
|
10
|
+
roomId;
|
|
11
|
+
doc;
|
|
12
|
+
services;
|
|
13
|
+
provider = null;
|
|
14
|
+
connectPromise = null;
|
|
15
|
+
_status = "disconnected";
|
|
16
|
+
_canWrite = false;
|
|
17
|
+
_metadata = null;
|
|
18
|
+
listeners = new Set();
|
|
19
|
+
constructor(services, roomId) {
|
|
20
|
+
this.services = services;
|
|
21
|
+
this.roomId = roomId;
|
|
22
|
+
this.doc = new Doc();
|
|
23
|
+
}
|
|
24
|
+
get status() {
|
|
25
|
+
return this._status;
|
|
26
|
+
}
|
|
27
|
+
get canWrite() {
|
|
28
|
+
return this._canWrite;
|
|
29
|
+
}
|
|
30
|
+
get isConnected() {
|
|
31
|
+
return this._status === "connected";
|
|
32
|
+
}
|
|
33
|
+
get metadata() {
|
|
34
|
+
return this._metadata;
|
|
35
|
+
}
|
|
36
|
+
get userId() {
|
|
37
|
+
return this.matrixClient.getUserId();
|
|
38
|
+
}
|
|
39
|
+
get userDisplayName() {
|
|
40
|
+
const userId = this.userId;
|
|
41
|
+
if (!userId)
|
|
42
|
+
return null;
|
|
43
|
+
return this.matrixClient.getUser(userId)?.displayName ?? null;
|
|
44
|
+
}
|
|
45
|
+
subscribe(listener) {
|
|
46
|
+
this.listeners.add(listener);
|
|
47
|
+
return () => this.listeners.delete(listener);
|
|
48
|
+
}
|
|
49
|
+
/*
|
|
50
|
+
* Imperative reads (async, not reactively wired):
|
|
51
|
+
* these return snapshots and won't trigger rerenders unless the caller wires state updates.
|
|
52
|
+
*/
|
|
53
|
+
async getRoomName(roomId = this.roomId) {
|
|
54
|
+
try {
|
|
55
|
+
const state = await this.matrixClient.roomState(roomId);
|
|
56
|
+
const nameEvent = state.find((e) => e.type === "m.room.name");
|
|
57
|
+
return String(nameEvent?.content?.name ?? "Untitled");
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return "Untitled";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async getMembers() {
|
|
64
|
+
const state = await this.matrixClient.roomState(this.roomId);
|
|
65
|
+
const powerLevelsEvent = state.find((e) => e.type === "m.room.power_levels");
|
|
66
|
+
const powerLevels = powerLevelsEvent?.content || {};
|
|
67
|
+
const userPowerLevels = powerLevels.users || {};
|
|
68
|
+
const members = state
|
|
69
|
+
.filter((e) => e.type === "m.room.member")
|
|
70
|
+
.filter((e) => e.content?.membership === "join" ||
|
|
71
|
+
e.content?.membership === "invite")
|
|
72
|
+
.map((e) => {
|
|
73
|
+
const userId = e.state_key;
|
|
74
|
+
const displayName = e.content?.displayname || extractLocalpart(userId);
|
|
75
|
+
const userPL = userPowerLevels[userId] ?? 0;
|
|
76
|
+
const accessLevel = this.powerLevelToAccess(userPL);
|
|
77
|
+
return { userId, displayName, accessLevel };
|
|
78
|
+
});
|
|
79
|
+
return members;
|
|
80
|
+
}
|
|
81
|
+
async isMember() {
|
|
82
|
+
try {
|
|
83
|
+
const state = await this.matrixClient.roomState(this.roomId);
|
|
84
|
+
const userId = this.matrixClient.getUserId();
|
|
85
|
+
const memberEvent = state.find((e) => e.type === "m.room.member" && e.state_key === userId);
|
|
86
|
+
return memberEvent?.content?.membership === "join";
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async getRoomMemberIds() {
|
|
93
|
+
const state = await this.matrixClient.roomState(this.roomId);
|
|
94
|
+
return state
|
|
95
|
+
.filter((e) => e.type === "m.room.member")
|
|
96
|
+
.filter((e) => e.content?.membership === "join")
|
|
97
|
+
.map((e) => e.state_key);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Resolve delegate rooms currently allowed via restricted join rules.
|
|
101
|
+
*/
|
|
102
|
+
async getDelegateRoomIds() {
|
|
103
|
+
try {
|
|
104
|
+
const state = await this.matrixClient.roomState(this.roomId);
|
|
105
|
+
const joinRulesEvent = state.find((e) => e.type === "m.room.join_rules");
|
|
106
|
+
const content = joinRulesEvent?.content;
|
|
107
|
+
if (content?.join_rule === "restricted" && content.allow) {
|
|
108
|
+
return content.allow
|
|
109
|
+
.filter((r) => r.type === "m.room_membership")
|
|
110
|
+
.map((r) => r.room_id);
|
|
111
|
+
}
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Poll for to-device events using a minimal Matrix sync.
|
|
120
|
+
* Returns new events and the next sync token for incremental polling.
|
|
121
|
+
*/
|
|
122
|
+
async pollToDeviceEvents(sinceToken) {
|
|
123
|
+
const client = this.matrixClient;
|
|
124
|
+
const filter = {
|
|
125
|
+
presence: { types: [] },
|
|
126
|
+
room: { rooms: [] },
|
|
127
|
+
account_data: { types: [] },
|
|
128
|
+
};
|
|
129
|
+
const filterParam = encodeURIComponent(JSON.stringify(filter));
|
|
130
|
+
const sinceParam = sinceToken ? `&since=${sinceToken}` : "";
|
|
131
|
+
const homeserver = client.getHomeserverUrl();
|
|
132
|
+
const accessToken = client.getAccessToken();
|
|
133
|
+
const response = await fetch(`${homeserver}/_matrix/client/v3/sync?filter=${filterParam}&timeout=0${sinceParam}`, {
|
|
134
|
+
headers: {
|
|
135
|
+
Authorization: `Bearer ${accessToken}`,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw new Error(`Sync request failed: ${response.status}`);
|
|
140
|
+
}
|
|
141
|
+
const data = await response.json();
|
|
142
|
+
return {
|
|
143
|
+
events: data.to_device?.events || [],
|
|
144
|
+
nextBatch: data.next_batch,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/*
|
|
148
|
+
* Imperative commands/writes (side effects):
|
|
149
|
+
* these perform mutations/network actions and should be called in callbacks/effects.
|
|
150
|
+
*/
|
|
151
|
+
/**
|
|
152
|
+
* Connect the Y.js store to Matrix for this room.
|
|
153
|
+
* Safe to call multiple times - will no-op if already connected.
|
|
154
|
+
* Resolves when the Y.js document is available (synced from Matrix).
|
|
155
|
+
*/
|
|
156
|
+
async connect() {
|
|
157
|
+
if (this._status === "connected")
|
|
158
|
+
return;
|
|
159
|
+
if (this.connectPromise)
|
|
160
|
+
return this.connectPromise;
|
|
161
|
+
this.connectPromise = this.doConnect();
|
|
162
|
+
return this.connectPromise;
|
|
163
|
+
}
|
|
164
|
+
disconnect() {
|
|
165
|
+
if (this.provider) {
|
|
166
|
+
try {
|
|
167
|
+
this.provider.dispose();
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// matrix-crdt dispose() can throw if pendingPollRequest lacks abort()
|
|
171
|
+
}
|
|
172
|
+
this.provider = null;
|
|
173
|
+
}
|
|
174
|
+
this.setStatus("disconnected");
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Fully dispose this room instance (disconnects and removes from cache).
|
|
178
|
+
*/
|
|
179
|
+
dispose() {
|
|
180
|
+
this.disconnect();
|
|
181
|
+
this.listeners.clear();
|
|
182
|
+
this.services.removeRoom(this.roomId);
|
|
183
|
+
}
|
|
184
|
+
async refreshMetadata() {
|
|
185
|
+
const [name, canEdit] = await Promise.all([
|
|
186
|
+
this.getRoomName(),
|
|
187
|
+
this.canEdit(),
|
|
188
|
+
]);
|
|
189
|
+
this._metadata = { title: name };
|
|
190
|
+
const canWriteChanged = this._canWrite !== canEdit;
|
|
191
|
+
this._canWrite = canEdit;
|
|
192
|
+
this.emit("onMetadataChange", this._metadata);
|
|
193
|
+
if (canWriteChanged) {
|
|
194
|
+
this.emit("onCanWriteChange", this._canWrite);
|
|
195
|
+
}
|
|
196
|
+
return this._metadata;
|
|
197
|
+
}
|
|
198
|
+
async setRoomName(title) {
|
|
199
|
+
await this.matrixClient.setRoomName(this.roomId, title);
|
|
200
|
+
await this.refreshMetadata();
|
|
201
|
+
}
|
|
202
|
+
async invite(userId, access) {
|
|
203
|
+
await this.matrixClient.invite(this.roomId, userId);
|
|
204
|
+
const powerLevel = this.accessToPowerLevel(access);
|
|
205
|
+
await this.setUserPowerLevel(userId, powerLevel);
|
|
206
|
+
}
|
|
207
|
+
async setAccess(userId, access) {
|
|
208
|
+
const powerLevel = this.accessToPowerLevel(access);
|
|
209
|
+
await this.setUserPowerLevel(userId, powerLevel);
|
|
210
|
+
}
|
|
211
|
+
async kick(userId) {
|
|
212
|
+
await this.matrixClient.kick(this.roomId, userId);
|
|
213
|
+
}
|
|
214
|
+
async join() {
|
|
215
|
+
try {
|
|
216
|
+
await this.matrixClient.joinRoom(this.roomId);
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
console.error("Failed to join room:", err);
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Ensure the current user is a member of this room.
|
|
226
|
+
* No-op if already joined. Attempts to join otherwise.
|
|
227
|
+
* Throws if the join fails.
|
|
228
|
+
*/
|
|
229
|
+
async ensureJoined() {
|
|
230
|
+
if (await this.isMember())
|
|
231
|
+
return;
|
|
232
|
+
await this.matrixClient.joinRoom(this.roomId);
|
|
233
|
+
}
|
|
234
|
+
async addDelegateRoom(delegateRoomId) {
|
|
235
|
+
const existing = await this.getDelegateRoomIds();
|
|
236
|
+
if (existing.includes(delegateRoomId))
|
|
237
|
+
return;
|
|
238
|
+
const allow = [...existing, delegateRoomId].map((room_id) => ({
|
|
239
|
+
type: sdk.RestrictedAllowType.RoomMembership,
|
|
240
|
+
room_id,
|
|
241
|
+
}));
|
|
242
|
+
await this.matrixClient.sendStateEvent(this.roomId, "m.room.join_rules", {
|
|
243
|
+
join_rule: sdk.JoinRule.Restricted,
|
|
244
|
+
allow,
|
|
245
|
+
}, "");
|
|
246
|
+
}
|
|
247
|
+
async removeDelegateRoom(delegateRoomId) {
|
|
248
|
+
const remaining = (await this.getDelegateRoomIds()).filter((id) => id !== delegateRoomId);
|
|
249
|
+
await this.matrixClient.sendStateEvent(this.roomId, "m.room.join_rules", remaining.length > 0
|
|
250
|
+
? {
|
|
251
|
+
join_rule: sdk.JoinRule.Restricted,
|
|
252
|
+
allow: remaining.map((room_id) => ({
|
|
253
|
+
type: sdk.RestrictedAllowType.RoomMembership,
|
|
254
|
+
room_id,
|
|
255
|
+
})),
|
|
256
|
+
}
|
|
257
|
+
: {
|
|
258
|
+
join_rule: sdk.JoinRule.Invite,
|
|
259
|
+
}, "");
|
|
260
|
+
}
|
|
261
|
+
async sendToDevice(eventType, content) {
|
|
262
|
+
const localUserId = this.matrixClient.getUserId();
|
|
263
|
+
if (!localUserId)
|
|
264
|
+
return;
|
|
265
|
+
const memberIds = await this.getRoomMemberIds();
|
|
266
|
+
const otherMembers = memberIds.filter((id) => id !== localUserId);
|
|
267
|
+
if (otherMembers.length === 0)
|
|
268
|
+
return;
|
|
269
|
+
// Build the messages map: Map<userId, Map<deviceId, content>>
|
|
270
|
+
// Using "*" as device ID sends to all devices of the user
|
|
271
|
+
const messages = new Map();
|
|
272
|
+
for (const userId of otherMembers) {
|
|
273
|
+
const deviceMap = new Map();
|
|
274
|
+
deviceMap.set("*", content);
|
|
275
|
+
messages.set(userId, deviceMap);
|
|
276
|
+
}
|
|
277
|
+
const txnId = `todevice-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
278
|
+
await this.matrixClient.sendToDevice(eventType, messages, txnId);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Internal/private implementation details.
|
|
282
|
+
*/
|
|
283
|
+
get matrixClient() {
|
|
284
|
+
return this.services.matrixClient;
|
|
285
|
+
}
|
|
286
|
+
async doConnect() {
|
|
287
|
+
this.setStatus("connecting");
|
|
288
|
+
try {
|
|
289
|
+
this.provider = new MatrixProvider(this.doc, this.matrixClient, { type: "id", id: this.roomId }, undefined, {
|
|
290
|
+
translator: {
|
|
291
|
+
updatesAsRegularMessages: true,
|
|
292
|
+
},
|
|
293
|
+
writer: {
|
|
294
|
+
flushInterval: 500,
|
|
295
|
+
retryIfForbiddenInterval: 30000,
|
|
296
|
+
},
|
|
297
|
+
reader: {
|
|
298
|
+
snapshotInterval: 30,
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
const documentAvailable = new Promise((resolve) => {
|
|
302
|
+
this.provider.onDocumentAvailable(() => {
|
|
303
|
+
this.setStatus("connected");
|
|
304
|
+
resolve();
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
this.provider.onCanWriteChanged(() => {
|
|
308
|
+
this._canWrite = this.provider?.canWrite ?? false;
|
|
309
|
+
this.emit("onCanWriteChange", this._canWrite);
|
|
310
|
+
});
|
|
311
|
+
this.provider.initialize();
|
|
312
|
+
await Promise.all([documentAvailable, this.refreshMetadata()]);
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
this.setStatus("error");
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
async canEdit() {
|
|
320
|
+
try {
|
|
321
|
+
const userId = this.matrixClient.getUserId();
|
|
322
|
+
if (!userId)
|
|
323
|
+
return false;
|
|
324
|
+
const state = await this.matrixClient.roomState(this.roomId);
|
|
325
|
+
const powerLevelsEvent = state.find((e) => e.type === "m.room.power_levels");
|
|
326
|
+
const powerLevels = powerLevelsEvent?.content || {};
|
|
327
|
+
const userPowerLevels = powerLevels.users || {};
|
|
328
|
+
const eventsDefault = powerLevels.events_default ?? 0;
|
|
329
|
+
const userPL = userPowerLevels[userId] ?? 0;
|
|
330
|
+
return userPL >= eventsDefault;
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
accessToPowerLevel(access) {
|
|
337
|
+
switch (access) {
|
|
338
|
+
case "view":
|
|
339
|
+
return -10;
|
|
340
|
+
case "edit":
|
|
341
|
+
return 0;
|
|
342
|
+
case "owner":
|
|
343
|
+
return 100;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
powerLevelToAccess(pl) {
|
|
347
|
+
if (pl >= 100)
|
|
348
|
+
return "owner";
|
|
349
|
+
if (pl >= 0)
|
|
350
|
+
return "edit";
|
|
351
|
+
return "view";
|
|
352
|
+
}
|
|
353
|
+
async setUserPowerLevel(userId, powerLevel) {
|
|
354
|
+
const state = await this.matrixClient.roomState(this.roomId);
|
|
355
|
+
const powerLevelsEvent = state.find((e) => e.type === "m.room.power_levels");
|
|
356
|
+
const currentPowerLevels = powerLevelsEvent?.content || {};
|
|
357
|
+
const users = currentPowerLevels.users || {};
|
|
358
|
+
const newPowerLevels = {
|
|
359
|
+
...currentPowerLevels,
|
|
360
|
+
users: {
|
|
361
|
+
...users,
|
|
362
|
+
[userId]: powerLevel,
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
await this.matrixClient.sendStateEvent(this.roomId, "m.room.power_levels", newPowerLevels, "");
|
|
366
|
+
}
|
|
367
|
+
emit(event, ...args) {
|
|
368
|
+
for (const listener of this.listeners) {
|
|
369
|
+
const handler = listener[event];
|
|
370
|
+
// TypeScript cannot narrow function signature from mapped type lookup
|
|
371
|
+
if (handler)
|
|
372
|
+
handler(...args);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
setStatus(status) {
|
|
376
|
+
if (this._status !== status) {
|
|
377
|
+
this._status = status;
|
|
378
|
+
this.emit("onStatusChange", status);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=Room.js.map
|
package/dist/Room.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Room.js","sourceRoot":"","sources":["../src/Room.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AuthData } from "./types";
|
|
2
|
+
export declare function getAuth(): AuthData | null;
|
|
3
|
+
export declare function saveAuth(auth: AuthData): void;
|
|
4
|
+
export declare function removeAuth(): void;
|
|
5
|
+
export declare function getHomeserver(): string | null;
|
|
6
|
+
export declare function saveHomeserver(homeserver: string): void;
|
|
7
|
+
export declare function removeHomeserver(): void;
|
|
8
|
+
//# sourceMappingURL=authStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authStorage.d.ts","sourceRoot":"","sources":["../src/authStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,wBAAgB,OAAO,IAAI,QAAQ,GAAG,IAAI,CAUzC;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const STORAGE_KEY = "may_db_auth";
|
|
2
|
+
export function getAuth() {
|
|
3
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
4
|
+
if (stored) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(stored);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
export function saveAuth(auth) {
|
|
15
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(auth));
|
|
16
|
+
}
|
|
17
|
+
export function removeAuth() {
|
|
18
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
19
|
+
}
|
|
20
|
+
export function getHomeserver() {
|
|
21
|
+
return localStorage.getItem(`${STORAGE_KEY}_homeserver`);
|
|
22
|
+
}
|
|
23
|
+
export function saveHomeserver(homeserver) {
|
|
24
|
+
localStorage.setItem(`${STORAGE_KEY}_homeserver`, homeserver);
|
|
25
|
+
}
|
|
26
|
+
export function removeHomeserver() {
|
|
27
|
+
localStorage.removeItem(`${STORAGE_KEY}_homeserver`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=authStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authStorage.js","sourceRoot":"","sources":["../src/authStorage.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,UAAU,OAAO;IACrB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAc;IACrC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,WAAW,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,YAAY,CAAC,OAAO,CAAC,GAAG,WAAW,aAAa,EAAE,UAAU,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,YAAY,CAAC,UAAU,CAAC,GAAG,WAAW,aAAa,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Room } from "../Room";
|
|
2
|
+
export interface AllowedRoomInfo {
|
|
3
|
+
roomId: string;
|
|
4
|
+
title: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function useAllowedRooms(room: Room): {
|
|
7
|
+
allowedRooms: AllowedRoomInfo[];
|
|
8
|
+
loading: boolean;
|
|
9
|
+
error: Error | null;
|
|
10
|
+
refresh: () => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useAllowedRooms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAllowedRooms.d.ts","sourceRoot":"","sources":["../../src/hooks/useAllowedRooms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI;;;;;EA+BzC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from "react";
|
|
2
|
+
export function useAllowedRooms(room) {
|
|
3
|
+
const [allowedRooms, setAllowedRooms] = useState([]);
|
|
4
|
+
const [loading, setLoading] = useState(true);
|
|
5
|
+
const [error, setError] = useState(null);
|
|
6
|
+
const refresh = useCallback(async () => {
|
|
7
|
+
setLoading(true);
|
|
8
|
+
setError(null);
|
|
9
|
+
try {
|
|
10
|
+
const ids = await room.getAllowedRoomIds();
|
|
11
|
+
const rooms = await Promise.all(ids.map(async (roomId) => ({
|
|
12
|
+
roomId,
|
|
13
|
+
title: await room.getRoomName(roomId),
|
|
14
|
+
})));
|
|
15
|
+
setAllowedRooms(rooms);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
setError(err instanceof Error ? err : new Error("Failed to fetch allowed rooms"));
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
setLoading(false);
|
|
22
|
+
}
|
|
23
|
+
}, [room]);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
refresh();
|
|
26
|
+
}, [refresh]);
|
|
27
|
+
return { allowedRooms, loading, error, refresh };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=useAllowedRooms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAllowedRooms.js","sourceRoot":"","sources":["../../src/hooks/useAllowedRooms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAQzD,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM;gBACN,KAAK,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;aACtC,CAAC,CAAC,CACJ,CAAC;YACF,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CACN,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CACxE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DependencyList } from "react";
|
|
2
|
+
export interface AsyncState<T> {
|
|
3
|
+
data: T | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: Error | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function useAsync<T>(factory: () => Promise<T>, deps: DependencyList): AsyncState<T>;
|
|
8
|
+
//# sourceMappingURL=useAsync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAsync.d.ts","sourceRoot":"","sources":["../../src/hooks/useAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,IAAI,EAAE,cAAc,GACnB,UAAU,CAAC,CAAC,CAAC,CAgCf"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useState, useEffect } from "react";
|
|
2
|
+
export function useAsync(factory, deps) {
|
|
3
|
+
const [state, setState] = useState({
|
|
4
|
+
data: null,
|
|
5
|
+
loading: true,
|
|
6
|
+
error: null,
|
|
7
|
+
});
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
let mounted = true;
|
|
10
|
+
setState({ data: null, loading: true, error: null });
|
|
11
|
+
factory().then((data) => {
|
|
12
|
+
if (mounted)
|
|
13
|
+
setState({ data, loading: false, error: null });
|
|
14
|
+
}, (err) => {
|
|
15
|
+
if (mounted)
|
|
16
|
+
setState({
|
|
17
|
+
data: null,
|
|
18
|
+
loading: false,
|
|
19
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
return () => {
|
|
23
|
+
mounted = false;
|
|
24
|
+
};
|
|
25
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
26
|
+
}, deps);
|
|
27
|
+
return state;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=useAsync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAsync.js","sourceRoot":"","sources":["../../src/hooks/useAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAQjE,MAAM,UAAU,QAAQ,CACtB,OAAyB,EACzB,IAAoB;IAEpB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB;QAChD,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAErD,OAAO,EAAE,CAAC,IAAI,CACZ,CAAC,IAAI,EAAE,EAAE;YACP,IAAI,OAAO;gBAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,OAAO;gBACT,QAAQ,CAAC;oBACP,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;iBAC3D,CAAC,CAAC;QACP,CAAC,CACF,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Client } from "../Client";
|
|
2
|
+
import type { RoomConfig } from "../types";
|
|
3
|
+
type AuthState = "loading" | "unauthenticated" | "authenticated";
|
|
4
|
+
export declare function useAuth(config: RoomConfig): {
|
|
5
|
+
state: AuthState;
|
|
6
|
+
client: Client | null;
|
|
7
|
+
error: string | null;
|
|
8
|
+
logout: () => Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=useAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,KAAK,SAAS,GAAG,SAAS,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAEjE,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU;;;;;EA2CzC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from "react";
|
|
2
|
+
import { Client } from "../Client";
|
|
3
|
+
import { getAuth } from "../authStorage";
|
|
4
|
+
import { completeLogin } from "../loginFlow";
|
|
5
|
+
export function useAuth(config) {
|
|
6
|
+
const [state, setState] = useState("loading");
|
|
7
|
+
const [client, setClient] = useState(null);
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
async function init() {
|
|
11
|
+
try {
|
|
12
|
+
const callbackAuth = await completeLogin();
|
|
13
|
+
if (callbackAuth) {
|
|
14
|
+
setClient(new Client(callbackAuth, config));
|
|
15
|
+
setState("authenticated");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const storedAuth = getAuth();
|
|
19
|
+
if (storedAuth) {
|
|
20
|
+
try {
|
|
21
|
+
setClient(new Client(storedAuth, config));
|
|
22
|
+
setState("authenticated");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Stored auth invalid, continue to login
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
setState("unauthenticated");
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
setError(err instanceof Error ? err.message : "Initialization failed");
|
|
33
|
+
setState("unauthenticated");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
init();
|
|
37
|
+
}, [config]);
|
|
38
|
+
const logout = useCallback(async () => {
|
|
39
|
+
await client?.logout();
|
|
40
|
+
setClient(null);
|
|
41
|
+
setState("unauthenticated");
|
|
42
|
+
}, [client]);
|
|
43
|
+
return { state, client, error, logout };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=useAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAK7C,MAAM,UAAU,OAAO,CAAC,MAAkB;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,CAAC;IACzD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,UAAU,IAAI;YACjB,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,aAAa,EAAE,CAAC;gBAC3C,IAAI,YAAY,EAAE,CAAC;oBACjB,SAAS,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC5C,QAAQ,CAAC,eAAe,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBAED,MAAM,UAAU,GAAG,OAAO,EAAE,CAAC;gBAC7B,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC;wBACH,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;wBAC1C,QAAQ,CAAC,eAAe,CAAC,CAAC;wBAC1B,OAAO;oBACT,CAAC;oBAAC,MAAM,CAAC;wBACP,yCAAyC;oBAC3C,CAAC;gBACH,CAAC;gBAED,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBACvE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Room } from '../Room';
|
|
2
|
+
export declare const PRESENCE_EVENT = "com.matrixsheets.presence";
|
|
3
|
+
export interface PresenceContent {
|
|
4
|
+
roomId: string;
|
|
5
|
+
focus: string | null;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
user: {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
color: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface RemotePresence {
|
|
14
|
+
userId: string;
|
|
15
|
+
name: string;
|
|
16
|
+
color: string;
|
|
17
|
+
focus: string;
|
|
18
|
+
}
|
|
19
|
+
export interface UsePresenceOptions {
|
|
20
|
+
room: Room;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Hook for managing presence via Matrix to-device messages.
|
|
24
|
+
* Broadcasts local focus changes to room members and receives their presence updates.
|
|
25
|
+
*/
|
|
26
|
+
export declare function usePresence({ room }: UsePresenceOptions): {
|
|
27
|
+
remotePresences: RemotePresence[];
|
|
28
|
+
setLocalFocus: (focus: string | null) => void;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=usePresence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePresence.d.ts","sourceRoot":"","sources":["../../src/hooks/usePresence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAKpC,eAAO,MAAM,cAAc,8BAA8B,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,kBAAkB;;2BAsC5C,MAAM,GAAG,IAAI;EA6DxB"}
|