Messing with timeline stuff a bit

This commit is contained in:
tezlm 2023-12-26 01:50:48 -08:00
parent b0cf2ad840
commit b72a379d79
Signed by: tezlm
GPG key ID: 649733FCD94AFBBA
16 changed files with 311 additions and 41 deletions

4
dist/src/client.js vendored
View file

@ -13,7 +13,7 @@ class Rooms extends Map {
});
}
async create(options) {
return this.client.net.createRoom({
return this.client.net.roomCreate({
room_version: options.version,
initial_state: options.initialState?.map(ev => ({
type: ev.type,
@ -24,7 +24,7 @@ class Rooms extends Map {
});
}
async join(roomIdOrAlias, reason) {
return this.client.net.joinRoom(roomIdOrAlias, reason);
return this.client.net.roomJoin(roomIdOrAlias, reason);
}
subscribe(roomId, subscription) {
this.client.conn.roomSubscribe(roomId, subscription);

7
dist/src/net.d.ts vendored
View file

@ -11,9 +11,10 @@ export declare class Network {
private fetch;
private fetchSkipQueue;
sync(options: t.SyncRequest, signal: AbortSignal): Promise<t.SyncResponse>;
createRoom(options: t.CreateRoomRequest): Promise<t.CreateRoomResponse>;
leaveRoom(roomId: t.RoomId, reason?: string): Promise<void>;
joinRoom(roomIdOrAlias: t.RoomId | string, reason?: string): Promise<void>;
roomCreate(options: t.CreateRoomRequest): Promise<t.CreateRoomResponse>;
roomLeave(roomId: t.RoomId, reason?: string): Promise<void>;
roomJoin(roomIdOrAlias: t.RoomId | string, reason?: string): Promise<void>;
roomInvite(roomId: t.RoomId, userId: t.UserId, reason?: string): Promise<void>;
fetchEvent(roomId: t.RoomId, eventId: t.EventId): Promise<t.ApiEvent>;
fetchContext(roomId: t.RoomId, eventId: t.EventId, limit?: number): Promise<t.ContextResponse>;
fetchMessages(opts: {

32
dist/src/net.js vendored
View file

@ -101,27 +101,34 @@ export class Network {
extra: { signal },
});
}
async createRoom(options) {
async roomCreate(options) {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/createRoom`,
body: options,
});
}
async leaveRoom(roomId, reason) {
async roomLeave(roomId, reason) {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/rooms/${e(roomId)}/leave`,
body: { reason },
});
}
async joinRoom(roomIdOrAlias, reason) {
async roomJoin(roomIdOrAlias, reason) {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/join/${e(roomIdOrAlias)}`,
body: { reason },
});
}
async roomInvite(roomId, userId, reason) {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/rooms/${e(roomId)}/invite`,
body: { reason, user_id: userId },
});
}
async fetchEvent(roomId, eventId) {
return this.fetch({
method: "GET",
@ -231,4 +238,23 @@ export class Network {
});
}
}
/*
new apis?
POST /rooms/{roomId}/relations/{eventId}
{
limit: uint,
from: Option<String>,
to: Option<String>,
dir: "b" | "f",
event_types: Vec<String>,
rel_types: Vec<String>,
}
{
chunk: Vec<Event>,
next_batch: Option<String>,
}
*/
//# sourceMappingURL=net.js.map

2
dist/src/net.js.map vendored

File diff suppressed because one or more lines are too long

2
dist/src/room.js vendored
View file

@ -118,7 +118,7 @@ export class Room extends EventEmitter {
});
}
async leave(reason) {
await this.client.net.leaveRoom(this.id, reason);
await this.client.net.roomLeave(this.id, reason);
}
async ack(eventId) {
await this.client.net.ack({

2
dist/src/sync.js vendored
View file

@ -78,7 +78,7 @@ export class Connection {
if (!list)
continue;
list.count = json.lists[listId].count;
for (const op of json.lists[listId].ops) {
for (const op of json.lists[listId].ops || []) {
switch (op.op) {
case "SYNC":
list.rooms.splice(op.range[0], op.range[1] - op.range[0] + 1, ...op.room_ids.map(id => rooms.get(id)));

View file

@ -1 +1 @@
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"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"}

View file

@ -17,19 +17,19 @@ declare abstract class Timeline extends Timeline_base {
prevBatch: string | undefined;
nextBatch: string | undefined;
getEvents(): Array<Event>;
abstract paginate(dir: "f" | "b", limit: number): Promise<boolean>;
abstract paginate(dir: "f" | "b", limit: number): Promise<number>;
}
export declare class RoomTimeline extends Timeline implements TypedEmitter<TimelineEvents<RoomTimeline>> {
private timelineSet;
room: Room;
constructor(timelineSet: RoomTimelineSet, room: Room);
paginate(dir: "f" | "b", limit?: number): Promise<boolean>;
paginate(dir: "f" | "b", limit?: number): Promise<number>;
}
export declare class ThreadTimeline extends Timeline implements TypedEmitter<TimelineEvents<ThreadTimeline>> {
private timelineSet;
thread: Thread;
constructor(timelineSet: ThreadTimelineSet, thread: Thread);
paginate(dir: "f" | "b", limit?: number): Promise<boolean>;
paginate(dir: "f" | "b", limit?: number): Promise<number>;
}
declare abstract class TimelineSet {
abstract timelines: Set<Timeline>;

111
dist/src/timeline.js vendored
View file

@ -66,9 +66,9 @@ export class RoomTimeline extends Timeline {
}
async paginate(dir, limit = 50) {
if (dir === "b" && this.isAtBeginning)
return false;
return 0;
if (dir === "f" && this.isAtEnd)
return false;
return 0;
const from = dir === "f" ? this.nextBatch : this.prevBatch;
const data = await this.room.client.net.fetchMessages({
roomId: this.room.id,
@ -88,6 +88,7 @@ export class RoomTimeline extends Timeline {
for (const event of events)
this.room.events.set(event.id, event);
this.emit("timelineUpdate", events, false);
return events.length;
}
else {
const events = data.chunk.reverse().map(intoEvent(this.room));
@ -111,8 +112,8 @@ export class RoomTimeline extends Timeline {
}
}
this.emit("timelineUpdate", events, true);
return events.length;
}
return true;
}
}
export class ThreadTimeline extends Timeline {
@ -133,9 +134,9 @@ export class ThreadTimeline extends Timeline {
}
async paginate(dir, limit = 50) {
if (dir === "b" && this.isAtBeginning)
return false;
return 0;
if (dir === "f" && this.isAtEnd)
return false;
return 0;
const { room } = this.thread;
const from = dir === "f" ? this.nextBatch : this.prevBatch;
const data = await room.client.net.fetchRelations(room.id, this.thread.baseEvent.id, {
@ -156,7 +157,7 @@ export class ThreadTimeline extends Timeline {
for (const event of events)
room.events.set(event.id, event);
this.emit("timelineUpdate", events, false);
return !!data.next_batch;
return events.length;
}
else {
const events = data.chunk.map(intoEvent(room));
@ -180,7 +181,7 @@ export class ThreadTimeline extends Timeline {
}
}
this.emit("timelineUpdate", events, true);
return !!data.prev_batch;
return events.length;
}
}
}
@ -195,6 +196,93 @@ class TimelineSet {
return null;
}
}
function merge2(timelines, tl) {
// [_, _, 2, 3, 4, 5, _, _, _] (current)
// [_, _, _, 3, 4, 5, 6, 7, 8] (other1)
// [0, 1, 2, 3, 4, _, _, _, _] (other2)
// [0, 1, 2, 3, 4, 5, 6, 7, 8] (other3)
// [_, _, 2, 3, 4, 5, 6, 7, 8] (other4)
// event = 3, thisIdx = 3, otherIdx1 = 0
// event = 2, thisIdx = 0, otherIdx2 = 2
// event = 2, thisIdx = 0, otherIdx3 = 2
// event = 2, thisIdx = 0, otherIdx4 = 0
// [1, 2] + [4, 5] (events = [2, 3, 4])
const events = tl._eventList;
// let otherTl;
for (const event of events) {
const other = timelines.timelineMap.get(event.id);
if (!other)
continue;
if (tl === other)
continue;
// console.log("merge ", tl, other);
const idx = other._eventList.indexOf(event);
other._eventList.unshift(...events.slice(0, idx));
other.isAtBeginning = tl.isAtBeginning;
for (const event of events.slice(0, idx)) {
timelines.timelineMap.set(event.id, other);
}
timelines.timelines.delete(tl);
tl = other;
}
// for (const event of events) {
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// console.log("merge ", tl, other);
// // const idx = other._eventList.indexOf(event);
// // other._eventList.splice(idx, other._eventList.length - idx);
// // other._eventList.push(...events.slice(idx));
// other.isAtEnd = tl.isAtEnd;
// tl = other;
// }
// for (let i = events.length - 1; i >= 0; i--) {
// const event = events[i];
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// const idx = other._eventList.lastIndexOf(event);
// other._eventList.push(...events.slice(idx));
// for (const event of events.slice(0, idx)) {
// timelines.timelineMap.set(event.id, other);
// }
// timelines.timelines.delete(tl);
// tl = other;
// }
return tl;
}
// function merge(timelines: ThreadTimelineSet, events: Array<Event>): ThreadTimeline | null {
// for (const event of events) {
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// console.log("merge earliest with ", other);
// const idx = other._eventList.indexOf(event);
// other._eventList.unshift(...events.slice(0, idx));
// other.isAtBeginning = true;
// return other;
// }
// return null;
// }
// const realTimeline = merge(this, tl._eventList) ?? tl;
// function merge(timelines: ThreadTimelineSet, events: Array<Event>): ThreadTimeline | null {
// // [_, _, _, _, (4), 5, 6, 7]
// // [0, 1, 2, 3, 4 , 5]
// // ^
// for (const event of events) {
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// console.log("merge live with ", other);
// const idx = other._eventList.indexOf(event);
// other._eventList.splice(idx, other._eventList.length - idx); // delete 4, 5
// other._eventList.push(...events.slice(idx)); // push 4, 5, 6, 7
// other.isAtEnd = true;
// return other;
// }
// return null;
// }
// const realTimeline = merge(this, tl._eventList);
export class ThreadTimelineSet extends TimelineSet {
constructor(thread) {
super();
@ -239,6 +327,13 @@ export class ThreadTimelineSet extends TimelineSet {
if (fetchCount > 0)
await this.live.paginate("b", fetchCount);
return this.live;
const tl = this.live;
const realTimeline = merge2(this, tl);
if (realTimeline) {
this.timelines.delete(tl);
this.live = realTimeline;
}
return realTimeline ?? tl;
}
else if (at === "start") {
const existing = [...this.timelines].find(i => i.isAtBeginning);
@ -253,6 +348,8 @@ export class ThreadTimelineSet extends TimelineSet {
await tl.paginate("b", limit);
this.timelines.add(tl);
return tl;
const realTimeline = merge2(this, tl) ?? tl;
return realTimeline;
}
}
else {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -64,7 +64,7 @@ class Rooms extends Map<string, Room> {
}
async create(options: CreateRoom): Promise<unknown> {
return this.client.net.createRoom({
return this.client.net.roomCreate({
room_version: options.version,
initial_state: options.initialState?.map(ev => ({
type: ev.type,
@ -76,7 +76,7 @@ class Rooms extends Map<string, Room> {
}
async join(roomIdOrAlias: RoomId | string, reason?: string): Promise<unknown> {
return this.client.net.joinRoom(roomIdOrAlias, reason);
return this.client.net.roomJoin(roomIdOrAlias, reason);
}
subscribe(roomId: RoomId, subscription: RoomSubscription) {

View file

@ -116,7 +116,7 @@ export class Network {
});
}
public async createRoom(options: t.CreateRoomRequest): Promise<t.CreateRoomResponse> {
public async roomCreate(options: t.CreateRoomRequest): Promise<t.CreateRoomResponse> {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/createRoom`,
@ -124,7 +124,7 @@ export class Network {
});
}
public async leaveRoom(roomId: t.RoomId, reason?: string): Promise<void> {
public async roomLeave(roomId: t.RoomId, reason?: string): Promise<void> {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/rooms/${e(roomId)}/leave`,
@ -132,7 +132,7 @@ export class Network {
});
}
public async joinRoom(roomIdOrAlias: t.RoomId | string, reason?: string): Promise<void> {
public async roomJoin(roomIdOrAlias: t.RoomId | string, reason?: string): Promise<void> {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/join/${e(roomIdOrAlias)}`,
@ -140,6 +140,14 @@ export class Network {
});
}
public async roomInvite(roomId: t.RoomId, userId: t.UserId, reason?: string): Promise<void> {
return this.fetch({
method: "POST",
path: `/_matrix/client/v3/rooms/${e(roomId)}/invite`,
body: { reason, user_id: userId },
});
}
public async fetchEvent(roomId: t.RoomId, eventId: t.EventId): Promise<t.ApiEvent> {
return this.fetch({
method: "GET",
@ -264,3 +272,23 @@ export class Network {
});
}
}
/*
new apis?
POST /rooms/{roomId}/relations/{eventId}
{
limit: uint,
from: Option<String>,
to: Option<String>,
dir: "b" | "f",
event_types: Vec<String>,
rel_types: Vec<String>,
}
{
chunk: Vec<Event>,
next_batch: Option<String>,
}
*/

View file

@ -121,7 +121,7 @@ room.unban(userid)
}
async leave(reason?: string) {
await this.client.net.leaveRoom(this.id, reason);
await this.client.net.roomLeave(this.id, reason);
}
async ack(eventId?: EventId) {

View file

@ -53,7 +53,7 @@ export class Connection {
list.count = json.lists[listId].count;
for (const op of json.lists[listId].ops) {
for (const op of json.lists[listId].ops || []) {
switch (op.op) {
case "SYNC":
list.rooms.splice(op.range[0], op.range[1] - op.range[0] + 1, ...op.room_ids.map(id => rooms.get(id)!));

View file

@ -44,7 +44,7 @@ abstract class Timeline extends (EventEmitter as unknown as new () => TypedEmitt
return this._eventList;
}
public abstract paginate(dir: "f" | "b", limit: number): Promise<boolean>;
public abstract paginate(dir: "f" | "b", limit: number): Promise<number>;
}
export class RoomTimeline extends Timeline implements TypedEmitter<TimelineEvents<RoomTimeline>> {
@ -55,9 +55,9 @@ export class RoomTimeline extends Timeline implements TypedEmitter<TimelineEvent
super();
}
public async paginate(dir: "f" | "b", limit: number = 50): Promise<boolean> {
if (dir === "b" && this.isAtBeginning) return false;
if (dir === "f" && this.isAtEnd) return false;
public async paginate(dir: "f" | "b", limit: number = 50): Promise<number> {
if (dir === "b" && this.isAtBeginning) return 0;
if (dir === "f" && this.isAtEnd) return 0;
const from = dir === "f" ? this.nextBatch : this.prevBatch;
const data = await this.room.client.net.fetchMessages({
@ -76,6 +76,7 @@ export class RoomTimeline extends Timeline implements TypedEmitter<TimelineEvent
this._eventList.push(...events);
for (const event of events) this.room.events.set(event.id, event);
this.emit("timelineUpdate", events, false);
return events.length;
} else {
const events = data.chunk.reverse().map(intoEvent(this.room));
if (data.end) {
@ -95,8 +96,8 @@ export class RoomTimeline extends Timeline implements TypedEmitter<TimelineEvent
}
}
this.emit("timelineUpdate", events, true);
return events.length;
}
return true;
}
}
@ -108,9 +109,9 @@ export class ThreadTimeline extends Timeline implements TypedEmitter<TimelineEve
super();
}
public async paginate(dir: "f" | "b", limit: number = 50): Promise<boolean> {
if (dir === "b" && this.isAtBeginning) return false;
if (dir === "f" && this.isAtEnd) return false;
public async paginate(dir: "f" | "b", limit: number = 50): Promise<number> {
if (dir === "b" && this.isAtBeginning) return 0;
if (dir === "f" && this.isAtEnd) return 0;
const { room } = this.thread;
const from = dir === "f" ? this.nextBatch : this.prevBatch;
@ -130,7 +131,7 @@ export class ThreadTimeline extends Timeline implements TypedEmitter<TimelineEve
this._eventList.push(...events);
for (const event of events) room.events.set(event.id, event);
this.emit("timelineUpdate", events, false);
return !!data.next_batch;
return events.length;
} else {
const events = data.chunk.map(intoEvent(room));
if (data.prev_batch) {
@ -150,7 +151,7 @@ export class ThreadTimeline extends Timeline implements TypedEmitter<TimelineEve
}
}
this.emit("timelineUpdate", events, true);
return !!data.prev_batch;
return events.length;
}
}
}
@ -169,6 +170,112 @@ abstract class TimelineSet {
}
}
function merge2(timelines: ThreadTimelineSet, tl: ThreadTimeline): ThreadTimeline {
// [_, _, 2, 3, 4, 5, _, _, _] (current)
// [_, _, _, 3, 4, 5, 6, 7, 8] (other1)
// [0, 1, 2, 3, 4, _, _, _, _] (other2)
// [0, 1, 2, 3, 4, 5, 6, 7, 8] (other3)
// [_, _, 2, 3, 4, 5, 6, 7, 8] (other4)
// event = 3, thisIdx = 3, otherIdx1 = 0
// event = 2, thisIdx = 0, otherIdx2 = 2
// event = 2, thisIdx = 0, otherIdx3 = 2
// event = 2, thisIdx = 0, otherIdx4 = 0
// [1, 2] + [4, 5] (events = [2, 3, 4])
const events = tl._eventList;
// let otherTl;
for (const event of events) {
const other = timelines.timelineMap.get(event.id);
if (!other) continue;
if (tl === other) continue;
// console.log("merge ", tl, other);
const idx = other._eventList.indexOf(event);
other._eventList.unshift(...events.slice(0, idx));
other.isAtBeginning = tl.isAtBeginning;
for (const event of events.slice(0, idx)) {
timelines.timelineMap.set(event.id, other);
}
timelines.timelines.delete(tl);
tl = other;
}
// for (const event of events) {
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// console.log("merge ", tl, other);
// // const idx = other._eventList.indexOf(event);
// // other._eventList.splice(idx, other._eventList.length - idx);
// // other._eventList.push(...events.slice(idx));
// other.isAtEnd = tl.isAtEnd;
// tl = other;
// }
// for (let i = events.length - 1; i >= 0; i--) {
// const event = events[i];
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// const idx = other._eventList.lastIndexOf(event);
// other._eventList.push(...events.slice(idx));
// for (const event of events.slice(0, idx)) {
// timelines.timelineMap.set(event.id, other);
// }
// timelines.timelines.delete(tl);
// tl = other;
// }
return tl;
}
// function merge(timelines: ThreadTimelineSet, events: Array<Event>): ThreadTimeline | null {
// for (const event of events) {
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// console.log("merge earliest with ", other);
// const idx = other._eventList.indexOf(event);
// other._eventList.unshift(...events.slice(0, idx));
// other.isAtBeginning = true;
// return other;
// }
// return null;
// }
// const realTimeline = merge(this, tl._eventList) ?? tl;
// function merge(timelines: ThreadTimelineSet, events: Array<Event>): ThreadTimeline | null {
// // [_, _, _, _, (4), 5, 6, 7]
// // [0, 1, 2, 3, 4 , 5]
// // ^
// for (const event of events) {
// const other = timelines.timelineMap.get(event.id);
// if (!other) continue;
// if (tl === other) continue;
// console.log("merge live with ", other);
// const idx = other._eventList.indexOf(event);
// other._eventList.splice(idx, other._eventList.length - idx); // delete 4, 5
// other._eventList.push(...events.slice(idx)); // push 4, 5, 6, 7
// other.isAtEnd = true;
// return other;
// }
// return null;
// }
// const realTimeline = merge(this, tl._eventList);
export class ThreadTimelineSet extends TimelineSet {
// This is the one live timeline
public client = this.thread.room.client;
@ -188,6 +295,15 @@ export class ThreadTimelineSet extends TimelineSet {
const fetchCount = limit - this.live.getEvents().length;
if (fetchCount > 0) await this.live.paginate("b", fetchCount);
return this.live;
const tl = this.live;
const realTimeline = merge2(this, tl);
if (realTimeline) {
this.timelines.delete(tl);
this.live = realTimeline;
}
return realTimeline ?? tl;
} else if (at === "start") {
const existing = [...this.timelines].find(i => i.isAtBeginning);
if (existing) {
@ -199,6 +315,8 @@ export class ThreadTimelineSet extends TimelineSet {
await tl.paginate("b", limit);
this.timelines.add(tl);
return tl;
const realTimeline = merge2(this, tl) ?? tl;
return realTimeline;
}
} else {
// TODO: respect limit?