@may-db/core 0.1.0 → 0.1.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.
- package/README.md +98 -0
- package/dist/MayDb.d.ts +26 -9
- package/dist/MayDb.d.ts.map +1 -1
- package/dist/MayDb.js +114 -74
- package/dist/MayDb.js.map +1 -1
- package/dist/Room.d.ts +40 -57
- package/dist/Room.d.ts.map +1 -1
- package/dist/Room.js +212 -232
- package/dist/Room.js.map +1 -1
- package/dist/authStorage.d.ts +7 -7
- package/dist/authStorage.d.ts.map +1 -1
- package/dist/authStorage.js +8 -8
- package/dist/authStorage.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/loginFlow.d.ts +10 -3
- package/dist/loginFlow.d.ts.map +1 -1
- package/dist/loginFlow.js +19 -14
- package/dist/loginFlow.js.map +1 -1
- package/dist/matrix-crdt-shim.d.ts +43 -0
- package/dist/matrix-crdt-shim.d.ts.map +1 -0
- package/dist/matrix-crdt-shim.js +2 -0
- package/dist/matrix-crdt-shim.js.map +1 -0
- package/dist/singletonRoom.d.ts.map +1 -1
- package/dist/singletonRoom.js +5 -36
- package/dist/singletonRoom.js.map +1 -1
- package/dist/types.d.ts +7 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# @may-db/core
|
|
2
|
+
|
|
3
|
+
Build collaborative apps on Matrix.
|
|
4
|
+
Bring your own server. No app backend.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
pnpm add @may-db/core @may-db/react
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Tiny React example
|
|
13
|
+
|
|
14
|
+
One shared value (`Y.Text`), manual Yjs subscription.
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
import { useEffect, useMemo, useState } from "react";
|
|
18
|
+
import type { MayDb } from "@may-db/core";
|
|
19
|
+
import { useMayDb, useRoom } from "@may-db/react";
|
|
20
|
+
|
|
21
|
+
export function TinyNoteApp() {
|
|
22
|
+
const { status, db, login, userId } = useMayDb({ namespace: "com.may-db.tiny-note" });
|
|
23
|
+
const [roomId, setRoomId] = useState<string | null>(null);
|
|
24
|
+
|
|
25
|
+
if (status === "signed_out") {
|
|
26
|
+
return <button onClick={login}>Log in with Matrix</button>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (status !== "ready" || !db) {
|
|
30
|
+
return <p>Loading...</p>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!roomId) {
|
|
34
|
+
return (
|
|
35
|
+
<main>
|
|
36
|
+
<p>Connected as {userId}</p>
|
|
37
|
+
<button
|
|
38
|
+
onClick={async () => {
|
|
39
|
+
const room = await db.rooms.create({ name: "Tiny Note" });
|
|
40
|
+
setRoomId(room.id);
|
|
41
|
+
}}
|
|
42
|
+
>
|
|
43
|
+
Create note room
|
|
44
|
+
</button>
|
|
45
|
+
</main>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return <TinyNoteRoom db={db} roomId={roomId} />;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function TinyNoteRoom({ db, roomId }: { db: MayDb; roomId: string }) {
|
|
53
|
+
const { doc, ready, canEdit } = useRoom({ db, roomId });
|
|
54
|
+
const note = useMemo(() => doc.getText("note"), [doc]);
|
|
55
|
+
const [, invalidate] = useState(0);
|
|
56
|
+
|
|
57
|
+
// Minimal Yjs -> React subscription to illustrate. Libraries exist to handle this.
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
const onChange = () => invalidate((n) => n + 1);
|
|
60
|
+
note.observe(onChange);
|
|
61
|
+
return () => note.unobserve(onChange);
|
|
62
|
+
}, [note]);
|
|
63
|
+
|
|
64
|
+
if (!ready) {
|
|
65
|
+
return <p>Syncing room...</p>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<textarea
|
|
70
|
+
value={note.toString()}
|
|
71
|
+
onChange={(e) => {
|
|
72
|
+
const next = e.target.value;
|
|
73
|
+
note.doc?.transact(() => {
|
|
74
|
+
note.delete(0, note.length);
|
|
75
|
+
note.insert(0, next);
|
|
76
|
+
});
|
|
77
|
+
}}
|
|
78
|
+
disabled={!canEdit}
|
|
79
|
+
/>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## API surface (app-facing)
|
|
85
|
+
|
|
86
|
+
- `useMayDb({ namespace })` -> Matrix auth/session + `db`
|
|
87
|
+
- `db.rooms.create/open/getOrCreateSingleton(...)`
|
|
88
|
+
- `useRoom({ db, roomId })` -> `doc`, `ready`, `canEdit`, `name`
|
|
89
|
+
- `room.members.*` to share a room with users
|
|
90
|
+
- `room.delegates.*` to share a room with the members of other rooms
|
|
91
|
+
- `db.invites.monitor(...)` to subscribe to newly-shared rooms
|
|
92
|
+
- `useRoomPresence(...)` to exchange presence/cursor with other users
|
|
93
|
+
|
|
94
|
+
## Mental model
|
|
95
|
+
|
|
96
|
+
1. Pick a stable `namespace` for your app.
|
|
97
|
+
2. Create/open a Matrix room.
|
|
98
|
+
3. Store collaborative data in `room.doc` (Yjs).
|
package/dist/MayDb.d.ts
CHANGED
|
@@ -1,20 +1,37 @@
|
|
|
1
1
|
import { Room } from "./Room";
|
|
2
|
-
import type {
|
|
2
|
+
import type { Session, MatrixClient, InviteInfo, InviteMonitorOptions } from "./types";
|
|
3
3
|
export declare class MayDb {
|
|
4
|
-
readonly
|
|
4
|
+
readonly session: Session;
|
|
5
5
|
readonly userId: string;
|
|
6
6
|
readonly namespace: string;
|
|
7
7
|
/** @internal */
|
|
8
8
|
readonly matrixClient: MatrixClient;
|
|
9
9
|
private readonly roomCache;
|
|
10
|
-
constructor(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
constructor(options: {
|
|
11
|
+
session: Session;
|
|
12
|
+
namespace: string;
|
|
13
|
+
});
|
|
14
|
+
readonly rooms: {
|
|
15
|
+
open: (roomId: string) => Room;
|
|
16
|
+
create: (options: {
|
|
17
|
+
name: string;
|
|
18
|
+
kind?: "room" | "space";
|
|
19
|
+
}) => Promise<Room>;
|
|
20
|
+
getOrCreateSingleton: (options: {
|
|
21
|
+
key: string;
|
|
22
|
+
name: string;
|
|
23
|
+
kind?: "room" | "space";
|
|
24
|
+
}) => Promise<Room>;
|
|
25
|
+
};
|
|
26
|
+
readonly invites: {
|
|
27
|
+
listPending: () => Promise<InviteInfo[]>;
|
|
28
|
+
monitor: (options: InviteMonitorOptions) => (() => void);
|
|
29
|
+
};
|
|
17
30
|
disposeAll(): void;
|
|
18
31
|
logout(): Promise<void>;
|
|
32
|
+
private openRoom;
|
|
33
|
+
private createMatrixRoom;
|
|
34
|
+
private getOrCreateSingletonRoomId;
|
|
35
|
+
private fetchPendingInvites;
|
|
19
36
|
}
|
|
20
37
|
//# sourceMappingURL=MayDb.d.ts.map
|
package/dist/MayDb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MayDb.d.ts","sourceRoot":"","sources":["../src/MayDb.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"MayDb.d.ts","sourceRoot":"","sources":["../src/MayDb.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,UAAU,EACV,oBAAoB,EAErB,MAAM,SAAS,CAAC;AAEjB,qBAAa,KAAK;IAChB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gBAAgB;IAChB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;gBAEzC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAa5D,QAAQ,CAAC,KAAK;uBACG,MAAM,KAAG,IAAI;0BAEJ;YACtB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;SACzB,KAAG,OAAO,CAAC,IAAI,CAAC;wCAKqB;YACpC,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;SACzB,KAAG,OAAO,CAAC,IAAI,CAAC;MAIjB;IAEF,QAAQ,CAAC,OAAO;2BACS,OAAO,CAAC,UAAU,EAAE,CAAC;2BAEzB,oBAAoB,KAAG,CAAC,MAAM,IAAI,CAAC;MAwCtD;IAEF,UAAU,IAAI,IAAI;IAOZ,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,OAAO,CAAC,QAAQ;YAaF,gBAAgB;YA2BhB,0BAA0B;YAwD1B,mBAAmB;CAuElC"}
|
package/dist/MayDb.js
CHANGED
|
@@ -1,25 +1,89 @@
|
|
|
1
1
|
import * as sdk from "matrix-js-sdk";
|
|
2
2
|
import { Room } from "./Room";
|
|
3
|
-
import {
|
|
3
|
+
import { clearStoredSession } from "./authStorage";
|
|
4
4
|
export class MayDb {
|
|
5
|
-
|
|
5
|
+
session;
|
|
6
6
|
userId;
|
|
7
7
|
namespace;
|
|
8
8
|
/** @internal */
|
|
9
9
|
matrixClient;
|
|
10
10
|
roomCache = new Map();
|
|
11
|
-
constructor(
|
|
12
|
-
|
|
13
|
-
this.
|
|
11
|
+
constructor(options) {
|
|
12
|
+
const { session, namespace } = options;
|
|
13
|
+
this.session = session;
|
|
14
|
+
this.userId = session.userId;
|
|
14
15
|
this.namespace = namespace;
|
|
15
16
|
this.matrixClient = sdk.createClient({
|
|
16
|
-
baseUrl:
|
|
17
|
-
accessToken:
|
|
18
|
-
userId:
|
|
19
|
-
deviceId:
|
|
17
|
+
baseUrl: session.homeserver,
|
|
18
|
+
accessToken: session.accessToken,
|
|
19
|
+
userId: session.userId,
|
|
20
|
+
deviceId: session.deviceId,
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
+
rooms = {
|
|
24
|
+
open: (roomId) => this.openRoom(roomId),
|
|
25
|
+
create: async (options) => {
|
|
26
|
+
const roomId = await this.createMatrixRoom(options);
|
|
27
|
+
return this.openRoom(roomId);
|
|
28
|
+
},
|
|
29
|
+
getOrCreateSingleton: async (options) => {
|
|
30
|
+
const roomId = await this.getOrCreateSingletonRoomId(options);
|
|
31
|
+
return this.openRoom(roomId);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
invites = {
|
|
35
|
+
listPending: async () => this.fetchPendingInvites(),
|
|
36
|
+
monitor: (options) => {
|
|
37
|
+
const { shouldJoin = (invite) => invite.alias?.startsWith(`#${this.namespace}-`) ?? false, onJoined, pollIntervalMs = 30000, } = options;
|
|
38
|
+
let stopped = false;
|
|
39
|
+
const checkInvites = async () => {
|
|
40
|
+
if (stopped)
|
|
41
|
+
return;
|
|
42
|
+
try {
|
|
43
|
+
const invites = await this.fetchPendingInvites();
|
|
44
|
+
for (const invite of invites) {
|
|
45
|
+
if (!shouldJoin(invite))
|
|
46
|
+
continue;
|
|
47
|
+
if (this.matrixClient.getRoom(invite.roomId))
|
|
48
|
+
continue;
|
|
49
|
+
await this.matrixClient.joinRoom(invite.roomId);
|
|
50
|
+
await onJoined(invite);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.error("Invite monitor error:", err);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
void checkInvites();
|
|
58
|
+
const interval = setInterval(() => {
|
|
59
|
+
if (!stopped) {
|
|
60
|
+
void checkInvites();
|
|
61
|
+
}
|
|
62
|
+
}, pollIntervalMs);
|
|
63
|
+
return () => {
|
|
64
|
+
stopped = true;
|
|
65
|
+
clearInterval(interval);
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
disposeAll() {
|
|
70
|
+
for (const room of this.roomCache.values()) {
|
|
71
|
+
room.dispose();
|
|
72
|
+
}
|
|
73
|
+
this.roomCache.clear();
|
|
74
|
+
}
|
|
75
|
+
async logout() {
|
|
76
|
+
this.disposeAll();
|
|
77
|
+
try {
|
|
78
|
+
await this.matrixClient.logout();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Ignore logout errors (e.g. network issues during logout)
|
|
82
|
+
}
|
|
83
|
+
this.matrixClient.stopClient();
|
|
84
|
+
clearStoredSession();
|
|
85
|
+
}
|
|
86
|
+
openRoom(roomId) {
|
|
23
87
|
let room = this.roomCache.get(roomId);
|
|
24
88
|
if (!room) {
|
|
25
89
|
const services = {
|
|
@@ -31,20 +95,16 @@ export class MayDb {
|
|
|
31
95
|
}
|
|
32
96
|
return room;
|
|
33
97
|
}
|
|
34
|
-
async
|
|
35
|
-
const
|
|
36
|
-
return this.getRoom(roomId);
|
|
37
|
-
}
|
|
38
|
-
async createMatrixRoom(title) {
|
|
98
|
+
async createMatrixRoom(options) {
|
|
99
|
+
const { name } = options;
|
|
39
100
|
const timestamp = Date.now();
|
|
40
101
|
const randomSuffix = Math.random().toString(36).substring(2, 8);
|
|
41
102
|
const localAlias = `${this.namespace}-${timestamp}-${randomSuffix}`;
|
|
42
103
|
const response = await this.matrixClient.createRoom({
|
|
43
|
-
name
|
|
104
|
+
name,
|
|
44
105
|
room_alias_name: localAlias,
|
|
45
106
|
visibility: sdk.Visibility.Private,
|
|
46
107
|
preset: sdk.Preset.PrivateChat,
|
|
47
|
-
creation_content: { type: "m.space" },
|
|
48
108
|
initial_state: [
|
|
49
109
|
{
|
|
50
110
|
type: "m.room.history_visibility",
|
|
@@ -59,6 +119,43 @@ export class MayDb {
|
|
|
59
119
|
});
|
|
60
120
|
return response.room_id;
|
|
61
121
|
}
|
|
122
|
+
async getOrCreateSingletonRoomId(options) {
|
|
123
|
+
const { key, name } = options;
|
|
124
|
+
const userId = this.matrixClient.getUserId();
|
|
125
|
+
if (!userId)
|
|
126
|
+
throw new Error("Not logged in");
|
|
127
|
+
let roomId = null;
|
|
128
|
+
try {
|
|
129
|
+
const accountData = (await this.matrixClient.getAccountDataFromServer(this.namespace));
|
|
130
|
+
roomId = accountData?.[key] ?? null;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// No account data yet
|
|
134
|
+
}
|
|
135
|
+
if (roomId) {
|
|
136
|
+
try {
|
|
137
|
+
if (!this.matrixClient.getRoom(roomId)) {
|
|
138
|
+
await this.matrixClient.joinRoom(roomId);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
roomId = null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (!roomId) {
|
|
146
|
+
roomId = await this.createMatrixRoom({ name });
|
|
147
|
+
let existingData = {};
|
|
148
|
+
try {
|
|
149
|
+
existingData =
|
|
150
|
+
(await this.matrixClient.getAccountDataFromServer(this.namespace)) || {};
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// No existing data
|
|
154
|
+
}
|
|
155
|
+
await this.matrixClient.setAccountData(this.namespace, { ...existingData, [key]: roomId });
|
|
156
|
+
}
|
|
157
|
+
return roomId;
|
|
158
|
+
}
|
|
62
159
|
async fetchPendingInvites() {
|
|
63
160
|
const filter = {
|
|
64
161
|
room: {
|
|
@@ -101,62 +198,5 @@ export class MayDb {
|
|
|
101
198
|
}
|
|
102
199
|
return invites;
|
|
103
200
|
}
|
|
104
|
-
startInviteMonitor(options) {
|
|
105
|
-
const { shouldJoin = (invite) => invite.alias?.startsWith(`#${this.namespace}-`) ?? false, onJoined, pollIntervalMs = 30000, } = options;
|
|
106
|
-
let stopped = false;
|
|
107
|
-
const checkInvites = async () => {
|
|
108
|
-
if (stopped)
|
|
109
|
-
return;
|
|
110
|
-
try {
|
|
111
|
-
const invites = await this.fetchPendingInvites();
|
|
112
|
-
for (const invite of invites) {
|
|
113
|
-
if (!shouldJoin(invite))
|
|
114
|
-
continue;
|
|
115
|
-
if (this.matrixClient.getRoom(invite.roomId))
|
|
116
|
-
continue;
|
|
117
|
-
await this.matrixClient.joinRoom(invite.roomId);
|
|
118
|
-
await onJoined(invite);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
catch (err) {
|
|
122
|
-
console.error("Invite monitor error:", err);
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
checkInvites();
|
|
126
|
-
const interval = setInterval(() => {
|
|
127
|
-
if (!stopped)
|
|
128
|
-
checkInvites();
|
|
129
|
-
}, pollIntervalMs);
|
|
130
|
-
return () => {
|
|
131
|
-
stopped = true;
|
|
132
|
-
clearInterval(interval);
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
async hasMarkerEvent(roomId) {
|
|
136
|
-
try {
|
|
137
|
-
const state = await this.matrixClient.roomState(roomId);
|
|
138
|
-
return state.some((e) => e.type === this.namespace);
|
|
139
|
-
}
|
|
140
|
-
catch {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
disposeAll() {
|
|
145
|
-
for (const room of this.roomCache.values()) {
|
|
146
|
-
room.dispose();
|
|
147
|
-
}
|
|
148
|
-
this.roomCache.clear();
|
|
149
|
-
}
|
|
150
|
-
async logout() {
|
|
151
|
-
this.disposeAll();
|
|
152
|
-
try {
|
|
153
|
-
await this.matrixClient.logout();
|
|
154
|
-
}
|
|
155
|
-
catch {
|
|
156
|
-
// Ignore logout errors (e.g. network issues during logout)
|
|
157
|
-
}
|
|
158
|
-
this.matrixClient.stopClient();
|
|
159
|
-
removeAuth();
|
|
160
|
-
}
|
|
161
201
|
}
|
|
162
202
|
//# sourceMappingURL=MayDb.js.map
|
package/dist/MayDb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MayDb.js","sourceRoot":"","sources":["../src/MayDb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"MayDb.js","sourceRoot":"","sources":["../src/MayDb.ts"],"names":[],"mappings":"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"}
|
package/dist/Room.d.ts
CHANGED
|
@@ -1,81 +1,64 @@
|
|
|
1
1
|
import { Doc } from "yjs";
|
|
2
|
-
import type { RoomStatus,
|
|
2
|
+
import type { RoomStatus, RoomMember, AccessLevel, RoomServices, RoomState } from "./types";
|
|
3
3
|
import type { ToDeviceEvent } from "./presence";
|
|
4
|
-
export interface
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
onCanWriteChange: (canWrite: boolean) => void;
|
|
4
|
+
export interface RoomDelegate {
|
|
5
|
+
roomId: string;
|
|
6
|
+
name: string;
|
|
8
7
|
}
|
|
9
8
|
export declare class Room {
|
|
10
|
-
readonly
|
|
9
|
+
readonly id: string;
|
|
11
10
|
readonly doc: Doc;
|
|
12
|
-
services
|
|
11
|
+
private readonly services;
|
|
13
12
|
private provider;
|
|
14
13
|
private connectPromise;
|
|
15
|
-
private
|
|
16
|
-
private _canWrite;
|
|
17
|
-
private _metadata;
|
|
14
|
+
private _state;
|
|
18
15
|
private listeners;
|
|
19
16
|
constructor(services: RoomServices, roomId: string);
|
|
17
|
+
get state(): RoomState;
|
|
20
18
|
get status(): RoomStatus;
|
|
21
|
-
get
|
|
19
|
+
get canEdit(): boolean;
|
|
22
20
|
get isConnected(): boolean;
|
|
23
|
-
get
|
|
21
|
+
get name(): string | null;
|
|
24
22
|
get userId(): string | null;
|
|
25
23
|
get userDisplayName(): string | null;
|
|
26
|
-
subscribe(listener:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
* Safe to call multiple times - will no-op if already connected.
|
|
46
|
-
* Resolves when the Y.js document is available (synced from Matrix).
|
|
47
|
-
*/
|
|
24
|
+
subscribe(listener: (state: RoomState) => void): () => void;
|
|
25
|
+
readonly members: {
|
|
26
|
+
list: () => Promise<RoomMember[]>;
|
|
27
|
+
invite: (userId: string, access: AccessLevel) => Promise<void>;
|
|
28
|
+
setAccess: (userId: string, access: AccessLevel) => Promise<void>;
|
|
29
|
+
remove: (userId: string) => Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
readonly delegates: {
|
|
32
|
+
list: () => Promise<RoomDelegate[]>;
|
|
33
|
+
add: (delegateRoomId: string) => Promise<void>;
|
|
34
|
+
remove: (delegateRoomId: string) => Promise<void>;
|
|
35
|
+
};
|
|
36
|
+
readonly toDevice: {
|
|
37
|
+
send: (eventType: string, content: unknown) => Promise<void>;
|
|
38
|
+
poll: (sinceToken: string | null) => Promise<{
|
|
39
|
+
events: ToDeviceEvent[];
|
|
40
|
+
nextBatch: string;
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
48
43
|
connect(): Promise<void>;
|
|
49
44
|
disconnect(): void;
|
|
50
|
-
/**
|
|
51
|
-
* Fully dispose this room instance (disconnects and removes from cache).
|
|
52
|
-
*/
|
|
53
45
|
dispose(): void;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
invite(userId: string, access: AccessLevel): Promise<void>;
|
|
57
|
-
setAccess(userId: string, access: AccessLevel): Promise<void>;
|
|
58
|
-
kick(userId: string): Promise<void>;
|
|
59
|
-
join(): Promise<boolean>;
|
|
60
|
-
/**
|
|
61
|
-
* Ensure the current user is a member of this room.
|
|
62
|
-
* No-op if already joined. Attempts to join otherwise.
|
|
63
|
-
* Throws if the join fails.
|
|
64
|
-
*/
|
|
46
|
+
refresh(): Promise<RoomState>;
|
|
47
|
+
rename(name: string): Promise<void>;
|
|
65
48
|
ensureJoined(): Promise<void>;
|
|
66
|
-
addDelegateRoom(delegateRoomId: string): Promise<void>;
|
|
67
|
-
removeDelegateRoom(delegateRoomId: string): Promise<void>;
|
|
68
|
-
sendToDevice(eventType: string, content: unknown): Promise<void>;
|
|
69
|
-
/**
|
|
70
|
-
* Internal/private implementation details.
|
|
71
|
-
*/
|
|
72
49
|
private get matrixClient();
|
|
50
|
+
private emitState;
|
|
51
|
+
private setStatus;
|
|
73
52
|
private doConnect;
|
|
74
|
-
private
|
|
53
|
+
private getRoomName;
|
|
54
|
+
private getMembers;
|
|
55
|
+
private isMember;
|
|
56
|
+
private getRoomMemberIds;
|
|
57
|
+
private getDelegateRoomIds;
|
|
58
|
+
private pollToDeviceEvents;
|
|
59
|
+
private canUserEdit;
|
|
75
60
|
private accessToPowerLevel;
|
|
76
61
|
private powerLevelToAccess;
|
|
77
62
|
private setUserPowerLevel;
|
|
78
|
-
private emit;
|
|
79
|
-
private setStatus;
|
|
80
63
|
}
|
|
81
64
|
//# sourceMappingURL=Room.d.ts.map
|
package/dist/Room.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Room.d.ts","sourceRoot":"","sources":["../src/Room.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Room.d.ts","sourceRoot":"","sources":["../src/Room.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,IAAI;IACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IAExC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,MAAM,CAIZ;IACF,OAAO,CAAC,SAAS,CAAyC;gBAE9C,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM;IAMlD,IAAI,KAAK,IAAI,SAAS,CAErB;IAED,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAExB;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED,IAAI,eAAe,IAAI,MAAM,GAAG,IAAI,CAInC;IAED,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAK3D,QAAQ,CAAC,OAAO;oBACE,OAAO,CAAC,UAAU,EAAE,CAAC;yBAEd,MAAM,UAAU,WAAW,KAAG,OAAO,CAAC,IAAI,CAAC;4BAMxC,MAAM,UAAU,WAAW,KAAG,OAAO,CAAC,IAAI,CAAC;yBAK9C,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;MAG7C;IAEF,QAAQ,CAAC,SAAS;oBACA,OAAO,CAAC,YAAY,EAAE,CAAC;8BAUX,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;iCAoBnB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;MAsBrD;IAEF,QAAQ,CAAC,QAAQ;0BACS,MAAM,WAAW,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC;2BAmBvC,MAAM,GAAG,IAAI,KAAG,OAAO,CAAC;YAC/C,MAAM,EAAE,aAAa,EAAE,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;MACF;IAEI,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,UAAU,IAAI,IAAI;IAalB,OAAO,IAAI,IAAI;IAMT,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;IAc7B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,SAAS;YAUH,SAAS;YAkDT,WAAW;YAYX,UAAU;YAwBV,QAAQ;YAaR,gBAAgB;YAQhB,kBAAkB;YAsBlB,kBAAkB;YAmClB,WAAW;IAkBzB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,kBAAkB;YAMZ,iBAAiB;CAyBhC"}
|