From c1d4e1e33d4070f9f95ffa464271656d09f6eacf Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Thu, 26 May 2022 21:17:42 +0100 Subject: [PATCH] chore: bump revolt-api; add mocking --- package.json | 4 +- src/Client.ts | 192 +++++++++++++++++++++++++++++++++++++++++--------- src/config.ts | 2 +- yarn.lock | 18 ++--- 4 files changed, 169 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index e41fc3e1..2bfc1977 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "revolt.js", - "version": "6.0.0-2", + "version": "6.0.0-3", "main": "dist/index.js", "typings": "dist/index.d.ts", "module": "esm/index.js", @@ -17,7 +17,7 @@ "lodash.isequal": "^4.5.0", "long": "^5.2.0", "mobx": "^6.3.2", - "revolt-api": "0.5.3-5-patch.3", + "revolt-api": "0.5.3-5-patch.4", "ulid": "^2.3.0", "ws": "^8.2.2" }, diff --git a/src/Client.ts b/src/Client.ts index c0edd92d..fad41ed6 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,7 +1,13 @@ import EventEmitter from "eventemitter3"; import defaultsDeep from "lodash.defaultsdeep"; import { action, makeObservable, observable } from "mobx"; -import type { DataCreateAccount, DataLogin, DataOnboard, InviteResponse, Session } from "revolt-api"; +import type { + DataCreateAccount, + DataLogin, + DataOnboard, + InviteResponse, + Session, +} from "revolt-api"; import type { RevoltConfig, Metadata } from "revolt-api"; import { API, MemberCompositeKey, Role } from "revolt-api"; @@ -62,14 +68,23 @@ export declare interface Client { on(event: "message", listener: (message: Message) => void): this; on(event: "message/update", listener: (message: Message) => void): this; - on(event: "message/delete", listener: (id: string, message?: Message) => void): this; + on( + event: "message/delete", + listener: (id: string, message?: Message) => void, + ): this; on(event: "channel/create", listener: (channel: Channel) => void): this; on(event: "channel/update", listener: (channel: Channel) => void): this; - on(event: "channel/delete", listener: (id: string, channel?: Channel) => void): this; + on( + event: "channel/delete", + listener: (id: string, channel?: Channel) => void, + ): this; on(event: "server/update", listener: (server: Server) => void): this; - on(event: "server/delete", listener: (id: string, server?: Server) => void): this; + on( + event: "server/delete", + listener: (id: string, server?: Server) => void, + ): this; on( event: "role/update", @@ -99,10 +114,10 @@ export const RE_SPOILER = /!!.+!!/g; export type FileArgs = [ options?: { - max_side?: number, - size?: number, - width?: number, - height?: number + max_side?: number; + size?: number; + width?: number; + height?: number; }, allowAnimation?: boolean, fallback?: string, @@ -220,8 +235,8 @@ export class Client extends EventEmitter { this.api = new API({ baseURL: this.apiURL, authentication: { - revolt: this.session - } + revolt: this.session, + }, }); } @@ -233,7 +248,7 @@ export class Client extends EventEmitter { async login(details: DataLogin) { await this.fetchConfiguration(); const data = await this.api.post("/auth/session/login", details); - if (data.result === 'Success') { + if (data.result === "Success") { this.session = data; return await this.$connect(); } else { @@ -283,10 +298,7 @@ export class Client extends EventEmitter { * @param data Onboarding data object * @param loginAfterSuccess Defines whether to automatically log in and connect after onboarding finishes */ - async completeOnboarding( - data: DataOnboard, - loginAfterSuccess?: boolean, - ) { + async completeOnboarding(data: DataOnboard, loginAfterSuccess?: boolean) { await this.api.post("/onboard/complete", data); if (loginAfterSuccess) { await this.websocket.connect(); @@ -303,7 +315,7 @@ export class Client extends EventEmitter { * @returns Invite information. */ async fetchInvite(code: string) { - return await this.api.get(`/invites/${code as ''}`); + return await this.api.get(`/invites/${code as ""}`); } async joinInvite(code: string): Promise; @@ -315,16 +327,16 @@ export class Client extends EventEmitter { * @returns Data provided by invite. */ async joinInvite(invite: string | InviteResponse) { - const code = typeof invite === 'string' ? invite : invite.code; + const code = typeof invite === "string" ? invite : invite.code; - if (typeof invite === 'object') { + if (typeof invite === "object") { switch (invite.type) { - case 'Group': { + case "Group": { const group = this.channels.get(invite.channel_id); if (group) return group; break; } - case 'Server': { + case "Server": { const server = this.servers.get(invite.server_id); if (server) return server; } @@ -332,8 +344,12 @@ export class Client extends EventEmitter { } const response = await this.api.post(`/invites/${code}`); - if (response.type === 'Server') { - return await this.servers.fetch(response.server._id, response.server, response.channels); + if (response.type === "Server") { + return await this.servers.fetch( + response.server._id, + response.server, + response.channels, + ); } else { throw "Unsupported invite type."; } @@ -344,7 +360,7 @@ export class Client extends EventEmitter { * @param code The invite code. */ async deleteInvite(code: string) { - await this.api.delete(`/invites/${code as ''}`); + await this.api.delete(`/invites/${code as ""}`); } /** @@ -372,13 +388,10 @@ export class Client extends EventEmitter { typeof value === "string" ? value : JSON.stringify(value); } - await this.api.post( - `/sync/settings/set`, - { - ...requestData, - timestamp - } - ); + await this.api.post(`/sync/settings/set`, { + ...requestData, + timestamp, + }); } /** @@ -469,7 +482,12 @@ export class Client extends EventEmitter { * @returns Generated URL or nothing */ generateFileURL( - attachment?: { tag: string; _id: string; content_type?: string, metadata?: Metadata }, + attachment?: { + tag: string; + _id: string; + content_type?: string; + metadata?: Metadata; + }, ...args: FileArgs ) { const [options, allowAnimation, fallback] = args; @@ -481,10 +499,12 @@ export class Client extends EventEmitter { const { tag, _id, content_type, metadata } = attachment; // ! FIXME: These limits should be done on Autumn. - if (metadata?.type === 'Image') { - if (Math.min(metadata.width, metadata.height) <= 0 || - (content_type === "image/gif" - && Math.max(metadata.width, metadata.height) >= 1024)) + if (metadata?.type === "Image") { + if ( + Math.min(metadata.width, metadata.height) <= 0 || + (content_type === "image/gif" && + Math.max(metadata.width, metadata.height) >= 1024) + ) return fallback; } @@ -501,4 +521,106 @@ export class Client extends EventEmitter { return `${autumn.url}/${tag}/${_id}${query}`; } + + /** + * Configure mock data ("demo mode") + */ + async mock() { + this.configuration = { + revolt: "0.5.3", + features: { + captcha: { + enabled: true, + key: "", + }, + email: true, + invite_only: false, + autumn: { enabled: true, url: "https://autumn.revolt.chat" }, + january: { enabled: true, url: "https://jan.revolt.chat" }, + voso: { + enabled: true, + url: "https://vortex.revolt.chat", + ws: "wss://vortex.revolt.chat", + }, + }, + ws: "wss://ws.revolt.chat", + app: "https://app.revolt.chat", + vapid: "", + }; + + this.user = await this.users.fetch("user", { + _id: "user", + username: "insert", + online: true, + status: { + presence: "Online", + text: "gaming frfr", + }, + profile: { + content: "profile text", + background: { + _id: "7B3pdjRfTd7NriBWRYFdqKTQpUiskBzHkZ67tJiMtE", + tag: "backgrounds", + filename: "tenor.gif", + metadata: { + type: "Image", + width: 498, + height: 292, + }, + content_type: "image/gif", + size: 1073166, + }, + }, + avatar: { + _id: "6rgg372gI2LrxCUx0CiA2R1Qs6eTtmC-2NpMq1Xa_3", + tag: "avatars", + filename: "e4332b6d70619b8a98086e532dbd4b9e.png", + metadata: { + type: "Image", + width: 128, + height: 128, + }, + content_type: "image/png", + size: 23321, + }, + }); + + const names = [ + "Server Name", + "My Server", + "Joe Nuts", + "F", + "G", + "Deez", + "A B C D E F", + ]; + + for (let i = 0; i < names.length; i++) { + const _id = i.toString(); + + this.channels.fetch(_id, { + _id, + channel_type: "TextChannel", + name: "General", + server: _id, + }); + + this.servers.fetch(_id, { + _id, + name: names[i], + channels: [], + default_permissions: 0, + owner: "user", + }); + + if (Math.random() > 0.75) { + const count = Math.floor(Math.random() * 10); + for (let i = 0; i < count; i++) { + this.unreads?.markMention(_id, "mid"); + } + } else if (Math.random() > 0.5) { + this.unreads?.markUnread(_id, "mid"); + } + } + } } diff --git a/src/config.ts b/src/config.ts index b66ff2ac..b22cdfcf 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,4 @@ -export const LIBRARY_VERSION = "6.0.0"; +export const LIBRARY_VERSION = "6.0.0-3"; export const defaultConfig = { apiURL: "https://api.revolt.chat", diff --git a/yarn.lock b/yarn.lock index bfba2f92..db092257 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,10 +41,10 @@ resolved "https://registry.yarnpkg.com/@insertish/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#5bcd6f73b93efa9ccdb6abf887ae808d40827169" integrity sha512-kFD/p8T4Hkqr992QrdkbW/cQ/W/q2d9MPCobwzBv2PwTKLkCD9RaYDy6m17qRnSLQQ5PU0kHCG8kaOwAqzj1vQ== -"@insertish/oapi@0.1.15": - version "0.1.15" - resolved "https://registry.yarnpkg.com/@insertish/oapi/-/oapi-0.1.15.tgz#ee58b82d879ed5af54db846699941b8ad0262e7b" - integrity sha512-2G8eFxrojF651tBoRutQ8CJOw0u8UjYSlw/LQU+xycw5KpXslhWp/KSR86uIFyDIPddwfMCNA91vwHGCFRA63w== +"@insertish/oapi@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@insertish/oapi/-/oapi-0.1.16.tgz#1149547a3ded6c1c087318bf9649e231836408ed" + integrity sha512-dxuLdNKBmnbVw8BBRzE1APZ3d7wErhNWQepXdNM3ueeQrheo6Sjg8FGFCQG7zCrEKns08lg5ITmxhqbYXVXZBQ== dependencies: typescript "^4.6.2" optionalDependencies: @@ -1015,12 +1015,12 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -revolt-api@0.5.3-5-patch.3: - version "0.5.3-5-patch.3" - resolved "https://registry.yarnpkg.com/revolt-api/-/revolt-api-0.5.3-5-patch.3.tgz#73a0614a02a210adac2b946fc0fc35f4304fb348" - integrity sha512-xESgQ9kp8T5iupeixt/yJIiGDiM11pm1b2E6srM/+jrV7Jyrj/vPgDPv3hEeJFhNmUK6EP5tKxkmTBhcqNE/Vw== +revolt-api@0.5.3-5-patch.4: + version "0.5.3-5-patch.4" + resolved "https://registry.yarnpkg.com/revolt-api/-/revolt-api-0.5.3-5-patch.4.tgz#c80da9c02a62ba8736420cf878d2a77e7c93a277" + integrity sha512-ITcKvMBJyx24+rcG/tzGLBZR7fBlYuDla9WMYVIE24dPehGnCzgx9r0ncuwM+RvjbHWGRRDGqc2MA9phT/PZsg== dependencies: - "@insertish/oapi" "0.1.15" + "@insertish/oapi" "0.1.16" axios "^0.26.1" lodash.defaultsdeep "^4.6.1"