From 805dc642a238fca7ddcec578fd2377e67672785f Mon Sep 17 00:00:00 2001 From: Kristina Date: Wed, 25 Dec 2024 17:06:20 +0400 Subject: [PATCH] Init sqlite wasm client (#8) * Init client sqlite-wasm --- bun.lockb | Bin 102304 -> 102896 bytes packages/client-sqlite/package.json | 19 ++++ packages/client-sqlite/src/client.ts | 157 +++++++++++++++++++++++++++ packages/client-sqlite/src/index.ts | 2 + packages/client-sqlite/tsconfig.json | 9 ++ 5 files changed, 187 insertions(+) create mode 100644 packages/client-sqlite/package.json create mode 100644 packages/client-sqlite/src/client.ts create mode 100644 packages/client-sqlite/src/index.ts create mode 100644 packages/client-sqlite/tsconfig.json diff --git a/bun.lockb b/bun.lockb index 3bdd61c26d229dbfe9b10bd7edc768e618bbe2ed..ecf187af96e4354f27cb4a87c734623b2bd2eedf 100755 GIT binary patch delta 14158 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 delta 14033 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 diff --git a/packages/client-sqlite/package.json b/packages/client-sqlite/package.json new file mode 100644 index 0000000000..55565de3c5 --- /dev/null +++ b/packages/client-sqlite/package.json @@ -0,0 +1,19 @@ +{ + "name": "@communication/client-sqlite", + "version": "0.1.0", + "main": "src/index.ts", + "module": "src/index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "^1.1.14" + }, + "dependencies": { + "@communication/types": "workspace:*", + "@communication/sdk-types": "workspace:*", + "@communication/sqlite-wasm": "workspace:*", + "fast-equals": "^5.0.1" + }, + "peerDependencies": { + "typescript": "^5.6.3" + } +} diff --git a/packages/client-sqlite/src/client.ts b/packages/client-sqlite/src/client.ts new file mode 100644 index 0000000000..fb0edd5c66 --- /dev/null +++ b/packages/client-sqlite/src/client.ts @@ -0,0 +1,157 @@ +import { + type CardID, + type Message, + type FindMessagesParams, + type MessageID, + type RichText, + type SocialID, + type ContextID, + type NotificationContextUpdate, + type FindNotificationContextParams, + type NotificationContext, + type FindNotificationsParams, + type Notification +} from '@communication/types' +import { + type Client, + type MessageCreatedEvent, + type DbAdapter, + EventType, + type BroadcastEvent, +} from '@communication/sdk-types' +import { createDbAdapter as createSqliteDbAdapter } from '@communication/sqlite-wasm' + +class DbClient implements Client { + onEvent: (event: BroadcastEvent) => void = () => {} + + constructor( + private readonly db: DbAdapter, + private readonly workspace: string, + private readonly personWorkspace: string + ) {} + + async createMessage(card: CardID, content: RichText, creator: SocialID): Promise { + const created = new Date() + const id = await this.db.createMessage(content, creator, created) + await this.db.placeMessage(id, card, this.workspace) + + const event: MessageCreatedEvent = { + type: EventType.MessageCreated, + card, + message: { + id, + content, + creator, + created, + edited: created, + reactions: [], + attachments: [] + } + } + + this.onEvent(event) + + return id + } + + async removeMessage(message: MessageID) { + await this.db.removeMessage(message) + this.onEvent({ type: EventType.MessageRemoved, message }) + } + + async createPatch(message: MessageID, content: RichText, creator: SocialID): Promise { + const created = new Date() + await this.db.createPatch(message, content, creator, created) + this.onEvent({ type: EventType.PatchCreated, patch: { message, content, creator, created } }) + } + + async createReaction(message: MessageID, reaction: string, creator: SocialID): Promise { + const created = new Date() + await this.db.createReaction(message, reaction, creator, created) + this.onEvent({ type: EventType.ReactionCreated, reaction: { message, reaction, creator, created } }) + } + + async removeReaction(message: MessageID, reaction: string, creator: SocialID): Promise { + await this.db.removeReaction(message, reaction, creator) + this.onEvent({ type: EventType.ReactionRemoved, message, reaction, creator }) + } + + async createAttachment(message: MessageID, card: CardID, creator: SocialID): Promise { + const created = new Date() + await this.db.createAttachment(message, card, creator, created) + this.onEvent({ type: EventType.AttachmentCreated, attachment: { message, card, creator, created } }) + } + + async removeAttachment(message: MessageID, card: CardID): Promise { + await this.db.removeAttachment(message, card) + this.onEvent({ type: EventType.AttachmentRemoved, message, card }) + } + + async findMessages(params: FindMessagesParams): Promise { + const rawMessages = await this.db.findMessages(this.workspace, params) + return rawMessages.map(this.toMessage) + } + + async findMessage(params: FindMessagesParams): Promise { + return (await this.findMessages({ ...params, limit: 1 }))[0] + } + + toMessage(raw: any): Message { + return { + id: raw.id, + content: raw.content, + creator: raw.creator, + created: new Date(raw.created), + edited: new Date(raw.edited), + reactions: raw.reactions, + attachments: raw.attachments + } + } + + async createNotification(message: MessageID, context: ContextID): Promise { + await this.db.createNotification(message, context) + } + + async removeNotification(message: MessageID, context: ContextID): Promise { + await this.db.removeNotification(message, context) + } + + async createNotificationContext(card: CardID, lastView?: Date, lastUpdate?: Date): Promise { + return await this.db.createContext(this.workspace, card, this.personWorkspace, lastView, lastUpdate) + } + + async updateNotificationContext(context: ContextID, update: NotificationContextUpdate): Promise { + await this.db.updateContext(context, update) + } + + async removeNotificationContext(context: ContextID): Promise { + await this.db.removeContext(context) + } + + async findNotificationContexts(params: FindNotificationContextParams): Promise { + //TODO: should we filter by workspace? + return await this.db.findContexts(params, [this.personWorkspace]) + } + + async findNotifications(params: FindNotificationsParams): Promise { + //TODO: should we filter by workspace? + return await this.db.findNotifications(params, this.personWorkspace) + } + + async unsubscribeQuery() { + //ignore + } + + close() { + this.db.close() + } +} + +export async function getSqliteClient( + workspace: string, + personWorkspace: string, + dbUrl = 'file:communication.sqlite3?vfs=opfs' +): Promise { + const db = await createSqliteDbAdapter(dbUrl) + return new DbClient(db, workspace, personWorkspace) +} diff --git a/packages/client-sqlite/src/index.ts b/packages/client-sqlite/src/index.ts new file mode 100644 index 0000000000..666c7eef50 --- /dev/null +++ b/packages/client-sqlite/src/index.ts @@ -0,0 +1,2 @@ +export { type Client } from '@communication/sdk-types' +export * from './client' diff --git a/packages/client-sqlite/tsconfig.json b/packages/client-sqlite/tsconfig.json new file mode 100644 index 0000000000..3ae07cd3fa --- /dev/null +++ b/packages/client-sqlite/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src"] +}