Loading package-lock.json +13 −14 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ "eventemitter3": "^5.0.1", "express": "^4.21.2", "morgan": "^1.10.0", "signed": "^2.1.0", "turndown": "^7.2.0" }, "devDependencies": { Loading Loading @@ -1549,7 +1550,6 @@ "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" Loading @@ -1559,7 +1559,6 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } Loading @@ -1574,7 +1573,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", Loading @@ -1586,7 +1584,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", Loading @@ -1597,8 +1594,7 @@ "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/json-schema": { "version": "7.0.15", Loading @@ -1609,8 +1605,7 @@ "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/morgan": { "version": "1.9.9", Loading Loading @@ -1658,20 +1653,17 @@ "node_modules/@types/qs": { "version": "6.9.17", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", "dev": true "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" Loading @@ -1681,7 +1673,6 @@ "version": "1.15.7", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", "@types/node": "*", Loading Loading @@ -3937,6 +3928,14 @@ "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signed": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/signed/-/signed-2.1.0.tgz", "integrity": "sha512-QEw2xsFVbR+4xy+7OeUpMCHlJdR+UDikzJuDrrHXtTgcVvXDWDgbcbvgZV13aVkHVyosuuZPAUQtxgTthb0vRA==", "dependencies": { "@types/express": "^4.17.2" } }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", Loading package.json +4 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,10 @@ "eventemitter3": "^5.0.1", "express": "^4.21.2", "morgan": "^1.10.0", "signed": "^2.1.0", "turndown": "^7.2.0" }, "overrides": { "@types/express": "^5.0.0" } } src/discord.ts +2 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import { Typing, User, Webhook, WebhookMessageCreateOptions, WebhookType, parseEmoji, } from "discord.js"; Loading Loading @@ -1286,7 +1287,7 @@ class Discord_ { roles: [], } as const, embeds: [] as APIEmbed[], }; } satisfies WebhookMessageCreateOptions; let messageId: string | undefined; Loading src/lib/matrix.ts +10 −6 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ import { } from "../types/matrix"; import { FriendlyError } from "./utils"; import { Secrets } from "./secrets"; import { Signed } from "./signed"; /** * Homeserver friendly name (not direct access) Loading Loading @@ -497,16 +498,17 @@ export class Matrix { * @param mxc * @returns */ static getMediaURL(mxc?: MXC, use: "internal" | "external" = "external") { static getMediaURL(mxc?: MXC) { if (!mxc) return undefined; return mxc.replace( "mxc://", `${this.getHomeserver(use)}/_matrix/media/v3/download/` ); const encoded = Buffer.from(mxc).toString("base64url"); return Signed.sign(`https://${process.env.HOST}/mxc/${encoded}`); } static async loadMediaURL(mxc: MXC) { static async loadMediaURL(mxc: MXC): Promise<ArrayBuffer>; static async loadMediaURL(mxc: MXC, raw: true): Promise<Response>; static async loadMediaURL(mxc: MXC, raw?: boolean) { const request = await Matrix.rawFetch( `/_matrix/client/v1/media/download/${mxc.replace("mxc://", "")}` ); Loading @@ -514,6 +516,8 @@ export class Matrix { if (request.status > 399) throw new Error("Unknown status: " + request.status); if (raw) return request; return request.arrayBuffer(); } Loading src/lib/secrets.ts +7 −1 Original line number Diff line number Diff line import fs from "node:fs"; type SecretName = "MATRIX_AS_TOKEN" | "MATRIX_HS_TOKEN" | "DISCORD_TOKEN"; type SecretName = | "MATRIX_AS_TOKEN" | "MATRIX_HS_TOKEN" | "DISCORD_TOKEN" | "SIGNED_SECRET"; export class Secrets { private static instance: Secrets; Loading @@ -8,6 +12,7 @@ export class Secrets { MATRIX_AS_TOKEN: "", MATRIX_HS_TOKEN: "", DISCORD_TOKEN: "", SIGNED_SECRET: "", }; constructor() { Loading @@ -15,6 +20,7 @@ export class Secrets { this.load("DISCORD_TOKEN"); this.load("MATRIX_AS_TOKEN"); this.load("MATRIX_HS_TOKEN"); this.load("SIGNED_SECRET"); } private load(secret: SecretName) { Loading Loading
package-lock.json +13 −14 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ "eventemitter3": "^5.0.1", "express": "^4.21.2", "morgan": "^1.10.0", "signed": "^2.1.0", "turndown": "^7.2.0" }, "devDependencies": { Loading Loading @@ -1549,7 +1550,6 @@ "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" Loading @@ -1559,7 +1559,6 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } Loading @@ -1574,7 +1573,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", Loading @@ -1586,7 +1584,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", Loading @@ -1597,8 +1594,7 @@ "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/json-schema": { "version": "7.0.15", Loading @@ -1609,8 +1605,7 @@ "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/morgan": { "version": "1.9.9", Loading Loading @@ -1658,20 +1653,17 @@ "node_modules/@types/qs": { "version": "6.9.17", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", "dev": true "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" Loading @@ -1681,7 +1673,6 @@ "version": "1.15.7", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", "@types/node": "*", Loading Loading @@ -3937,6 +3928,14 @@ "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signed": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/signed/-/signed-2.1.0.tgz", "integrity": "sha512-QEw2xsFVbR+4xy+7OeUpMCHlJdR+UDikzJuDrrHXtTgcVvXDWDgbcbvgZV13aVkHVyosuuZPAUQtxgTthb0vRA==", "dependencies": { "@types/express": "^4.17.2" } }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", Loading
package.json +4 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,10 @@ "eventemitter3": "^5.0.1", "express": "^4.21.2", "morgan": "^1.10.0", "signed": "^2.1.0", "turndown": "^7.2.0" }, "overrides": { "@types/express": "^5.0.0" } }
src/discord.ts +2 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import { Typing, User, Webhook, WebhookMessageCreateOptions, WebhookType, parseEmoji, } from "discord.js"; Loading Loading @@ -1286,7 +1287,7 @@ class Discord_ { roles: [], } as const, embeds: [] as APIEmbed[], }; } satisfies WebhookMessageCreateOptions; let messageId: string | undefined; Loading
src/lib/matrix.ts +10 −6 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ import { } from "../types/matrix"; import { FriendlyError } from "./utils"; import { Secrets } from "./secrets"; import { Signed } from "./signed"; /** * Homeserver friendly name (not direct access) Loading Loading @@ -497,16 +498,17 @@ export class Matrix { * @param mxc * @returns */ static getMediaURL(mxc?: MXC, use: "internal" | "external" = "external") { static getMediaURL(mxc?: MXC) { if (!mxc) return undefined; return mxc.replace( "mxc://", `${this.getHomeserver(use)}/_matrix/media/v3/download/` ); const encoded = Buffer.from(mxc).toString("base64url"); return Signed.sign(`https://${process.env.HOST}/mxc/${encoded}`); } static async loadMediaURL(mxc: MXC) { static async loadMediaURL(mxc: MXC): Promise<ArrayBuffer>; static async loadMediaURL(mxc: MXC, raw: true): Promise<Response>; static async loadMediaURL(mxc: MXC, raw?: boolean) { const request = await Matrix.rawFetch( `/_matrix/client/v1/media/download/${mxc.replace("mxc://", "")}` ); Loading @@ -514,6 +516,8 @@ export class Matrix { if (request.status > 399) throw new Error("Unknown status: " + request.status); if (raw) return request; return request.arrayBuffer(); } Loading
src/lib/secrets.ts +7 −1 Original line number Diff line number Diff line import fs from "node:fs"; type SecretName = "MATRIX_AS_TOKEN" | "MATRIX_HS_TOKEN" | "DISCORD_TOKEN"; type SecretName = | "MATRIX_AS_TOKEN" | "MATRIX_HS_TOKEN" | "DISCORD_TOKEN" | "SIGNED_SECRET"; export class Secrets { private static instance: Secrets; Loading @@ -8,6 +12,7 @@ export class Secrets { MATRIX_AS_TOKEN: "", MATRIX_HS_TOKEN: "", DISCORD_TOKEN: "", SIGNED_SECRET: "", }; constructor() { Loading @@ -15,6 +20,7 @@ export class Secrets { this.load("DISCORD_TOKEN"); this.load("MATRIX_AS_TOKEN"); this.load("MATRIX_HS_TOKEN"); this.load("SIGNED_SECRET"); } private load(secret: SecretName) { Loading