diff --git a/apps/bridge-frontend/database/migrations/0002-add-signal.ts b/apps/bridge-frontend/database/migrations/0002-add-signal.ts index 86da847..4f7cbd1 100644 --- a/apps/bridge-frontend/database/migrations/0002-add-signal.ts +++ b/apps/bridge-frontend/database/migrations/0002-add-signal.ts @@ -11,10 +11,8 @@ export async function up(db: Kysely): Promise { .addColumn("user_id", "uuid") .addColumn("name", "text") .addColumn("description", "text") - .addColumn("auth_info", "text") - .addColumn("is_verified", "boolean", (col) => - col.notNull().defaultTo(false), - ) + .addColumn("qr_code", "text") + .addColumn("verified", "boolean", (col) => col.notNull().defaultTo(false)) .addColumn("created_at", "timestamptz", (col) => col.notNull().defaultTo(sql`now()`), ) diff --git a/apps/bridge-whatsapp/src/service.ts b/apps/bridge-whatsapp/src/service.ts index 87143f6..5a8a840 100644 --- a/apps/bridge-whatsapp/src/service.ts +++ b/apps/bridge-whatsapp/src/service.ts @@ -107,7 +107,7 @@ export default class WhatsappService extends Service { } else if (connectionState === "open") { console.log("opened connection"); } else if (connectionState === "close") { - console.log("connection closed due to ", lastDisconnect.error); + console.log("connection closed due to ", lastDisconnect?.error); const disconnectStatusCode = (lastDisconnect?.error as any)?.output ?.statusCode; @@ -182,12 +182,12 @@ export default class WhatsappService extends Service { const messageContent = Object.values(message)[0]; let messageType: MediaType; let attachment: string; - let filename: string; - let mimetype: string; + let filename: string | null | undefined; + let mimetype: string | null | undefined; if (isMediaMessage) { if (audioMessage) { messageType = "audio"; - filename = id + "." + audioMessage.mimetype.split("/").pop(); + filename = id + "." + audioMessage.mimetype?.split("/").pop(); mimetype = audioMessage.mimetype; } else if (documentMessage) { messageType = "document"; @@ -195,16 +195,17 @@ export default class WhatsappService extends Service { mimetype = documentMessage.mimetype; } else if (imageMessage) { messageType = "image"; - filename = id + "." + imageMessage.mimetype.split("/").pop(); + filename = id + "." + imageMessage.mimetype?.split("/").pop(); mimetype = imageMessage.mimetype; } else if (videoMessage) { messageType = "video"; - filename = id + "." + videoMessage.mimetype.split("/").pop(); + filename = id + "." + videoMessage.mimetype?.split("/").pop(); mimetype = videoMessage.mimetype; } const stream = await downloadContentFromMessage( messageContent, + // @ts-ignore messageType, ); let buffer = Buffer.from([]); @@ -214,11 +215,13 @@ export default class WhatsappService extends Service { attachment = buffer.toString("base64"); } + // @ts-ignore if (messageContent || attachment) { const receivedMessage = { waMessageId: id, waMessage: JSON.stringify(webMessageInfo), waTimestamp: new Date((messageTimestamp as number) * 1000), + // @ts-ignore attachment, filename, mimetype, diff --git a/apps/bridge-whatsapp/tsconfig.json b/apps/bridge-whatsapp/tsconfig.json index 6f071d0..afdb4f6 100644 --- a/apps/bridge-whatsapp/tsconfig.json +++ b/apps/bridge-whatsapp/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@link-stack/typescript-config", + "extends": "@link-stack/typescript-config/tsconfig.node.json", "compilerOptions": { "module": "commonjs", "target": "es2018", diff --git a/apps/bridge-worker/index.ts b/apps/bridge-worker/index.ts index 3889416..640b7b0 100644 --- a/apps/bridge-worker/index.ts +++ b/apps/bridge-worker/index.ts @@ -6,6 +6,8 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const startWorker = async () => { + console.log("Starting worker..."); + console.log(process.env); await run({ connectionString: process.env.DATABASE_URL, concurrency: 10, diff --git a/apps/bridge-worker/package.json b/apps/bridge-worker/package.json index 64302e3..b7fae9e 100644 --- a/apps/bridge-worker/package.json +++ b/apps/bridge-worker/package.json @@ -7,7 +7,7 @@ "license": "AGPL-3.0-or-later", "scripts": { "build": "tsc -p tsconfig.json", - "dev": "dotenv -- graphile-worker", + "dev": "graphile-worker", "start": "node build/main/index.js" }, "dependencies": { diff --git a/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts b/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts index 0d84a0d..cb1857e 100644 --- a/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts +++ b/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts @@ -1,4 +1,5 @@ /* eslint-disable camelcase */ +/* import { convert } from "html-to-text"; import { URLSearchParams } from "url"; import { withDb, AppDatabase } from "../../lib/db.js"; @@ -181,8 +182,10 @@ const sendToLabelStudio = async (tickets: FormattedZammadTicket[]) => { console.log(JSON.stringify(importResult, undefined, 2)); } }; + */ const importLabelStudioTask = async (): Promise => { + /* withDb(async (db: AppDatabase) => { const { leafcutter: { contributorName }, @@ -204,6 +207,7 @@ const importLabelStudioTask = async (): Promise => { }); } }); + */ }; export default importLabelStudioTask; diff --git a/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts b/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts index 4e125d3..0170262 100644 --- a/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts +++ b/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts @@ -1,4 +1,5 @@ /* eslint-disable camelcase */ +/* import { URLSearchParams } from "url"; import { withDb, AppDatabase } from "../../lib/db.js"; // import { loadConfig } from "@digiresilience/bridge-config"; @@ -143,8 +144,9 @@ const sendToLeafcutter = async (tickets: LabelStudioTicket[]) => { }); console.log({ result }); }; - + */ const importLeafcutterTask = async (): Promise => { + /* withDb(async (db: AppDatabase) => { const { leafcutter: { contributorName }, @@ -169,6 +171,7 @@ const importLeafcutterTask = async (): Promise => { minUpdatedTimestamp: newLastTimestamp, }); }); + */ }; export default importLeafcutterTask; diff --git a/apps/bridge-worker/tasks/signal/fetch-signal-messages.ts b/apps/bridge-worker/tasks/signal/fetch-signal-messages.ts new file mode 100644 index 0000000..4b3a95c --- /dev/null +++ b/apps/bridge-worker/tasks/signal/fetch-signal-messages.ts @@ -0,0 +1,32 @@ +import { db, getWorkerUtils } from "@link-stack/bridge-common"; +import * as signalApi from "@link-stack/signal-api"; +const { Configuration, MessagesApi } = signalApi; + +const fetchSignalMessagesTask = async (): Promise => { + const worker = await getWorkerUtils(); + const rows = await db.selectFrom("SignalBot").selectAll().execute(); + const config = new Configuration({ + basePath: process.env.BRIDGE_SIGNAL_URL, + }); + const messagesClient = new MessagesApi(config); + + for (const row of rows) { + const { id, phoneNumber: number } = row; + const messages = await messagesClient.v1ReceiveNumberGet({ number }); + + for (const msg of messages) { + const { envelope } = msg as any; + const { source } = envelope; + const message = envelope?.dataMessage?.message; + if (source !== number && message) { + await worker.addJob("signal/receive-signal-message", { + token: id, + sender: source, + message, + }); + } + } + } +}; + +export default fetchSignalMessagesTask; diff --git a/apps/bridge-worker/tasks/signal/receive-signal-message.ts b/apps/bridge-worker/tasks/signal/receive-signal-message.ts index 55ca63f..9e87b84 100644 --- a/apps/bridge-worker/tasks/signal/receive-signal-message.ts +++ b/apps/bridge-worker/tasks/signal/receive-signal-message.ts @@ -1,11 +1,33 @@ -// import { db, getWorkerUtils } from "@link-stack/bridge-common"; +import { db, getWorkerUtils } from "@link-stack/bridge-common"; interface ReceiveSignalMessageTaskOptions { - message: any; + token: string; + sender: string; + message: string; } const receiveSignalMessageTask = async ({ + token, + sender, message, -}: ReceiveSignalMessageTaskOptions): Promise => {}; +}: ReceiveSignalMessageTaskOptions): Promise => { + console.log({ token, sender, message }); + const worker = await getWorkerUtils(); + const row = await db + .selectFrom("SignalBot") + .selectAll() + .where("id", "=", token) + .executeTakeFirstOrThrow(); + + console.log(row); + + const backendId = row.id; + const payload = { + message, + recipient: sender, + }; + + await worker.addJob("common/notify-webhooks", { backendId, payload }); +}; export default receiveSignalMessageTask; diff --git a/apps/bridge-worker/tasks/signal/send-signal-message.ts b/apps/bridge-worker/tasks/signal/send-signal-message.ts index b926699..7536678 100644 --- a/apps/bridge-worker/tasks/signal/send-signal-message.ts +++ b/apps/bridge-worker/tasks/signal/send-signal-message.ts @@ -1,11 +1,38 @@ -// import { db, getWorkerUtils } from "@link-stack/bridge-common"; +import { db } from "@link-stack/bridge-common"; +import * as signalApi from "@link-stack/signal-api"; +const { Configuration, MessagesApi } = signalApi; interface SendSignalMessageTaskOptions { + token: string; + recipient: string; message: any; } const sendSignalMessageTask = async ({ message, -}: SendSignalMessageTaskOptions): Promise => {}; + recipient, + token, +}: SendSignalMessageTaskOptions): Promise => { + const bot = await db + .selectFrom("SignalBot") + .selectAll() + .where("token", "=", token) + .executeTakeFirstOrThrow(); + + const { phoneNumber: number } = bot; + const config = new Configuration({ + basePath: process.env.BRIDGE_SIGNAL_URL, + }); + const messagesClient = new MessagesApi(config); + const response = await messagesClient.v2SendPost({ + data: { + number, + recipients: [recipient], + message, + }, + }); + + console.log({ response }); +}; export default sendSignalMessageTask; diff --git a/apps/bridge-worker/tasks/signal/signald-message.ts b/apps/bridge-worker/tasks/signal/signald-message.ts index 190c0b6..b8fb45c 100644 --- a/apps/bridge-worker/tasks/signal/signald-message.ts +++ b/apps/bridge-worker/tasks/signal/signald-message.ts @@ -61,7 +61,7 @@ const notifyWebhooks = async ( return; } - webhooks.forEach(({ id }) => { + webhooks.forEach(({ id }: any) => { const payload = formatPayload(messageInfo); // logger.debug( // { payload }, diff --git a/apps/bridge-worker/tasks/voice/twilio-recording.ts b/apps/bridge-worker/tasks/voice/twilio-recording.ts index 3472b8b..9372b61 100644 --- a/apps/bridge-worker/tasks/voice/twilio-recording.ts +++ b/apps/bridge-worker/tasks/voice/twilio-recording.ts @@ -50,7 +50,7 @@ const notifyWebhooks = async ( const webhooks = await db.webhooks.findAllByBackendId("voice", voiceLineId); if (webhooks && webhooks.length === 0) return; - webhooks.forEach(({ id }) => { + webhooks.forEach(({ id }: any) => { const payload = formatPayload(call, recording); workerUtils.addJob( "notify-webhook", diff --git a/apps/bridge-worker/tsconfig.json b/apps/bridge-worker/tsconfig.json index 9988d30..3e8eeb4 100644 --- a/apps/bridge-worker/tsconfig.json +++ b/apps/bridge-worker/tsconfig.json @@ -1,22 +1,7 @@ { - "extends": "@link-stack/typescript-config", + "extends": "@link-stack/typescript-config/tsconfig.json", "compilerOptions": { - "outDir": "build/main", - "module": "esnext", - "target": "esnext", - "esModuleInterop": true, - "skipLibCheck": true, - "moduleResolution": "node" - }, - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node", - "transpileOnly": true, - "compilerOptions": { - "module": "esNext", - "target": "esNext", - "moduleResolution": "node" - } + "outDir": "build/main" }, "include": ["**/*.ts", "**/.*.ts"], "exclude": ["node_modules", "build"] diff --git a/packages/bridge-common/lib/database.ts b/packages/bridge-common/lib/database.ts index a7224d4..217d8a0 100644 --- a/packages/bridge-common/lib/database.ts +++ b/packages/bridge-common/lib/database.ts @@ -109,7 +109,9 @@ export interface Database { name: string; description: string; phoneNumber: string; - createdBy: string; + qrCode: string; + token: string; + verified: boolean; createdAt: Date; updatedAt: Date; }; diff --git a/packages/bridge-ui/components/Detail.tsx b/packages/bridge-ui/components/Detail.tsx index 5d5a0e5..8cb731e 100644 --- a/packages/bridge-ui/components/Detail.tsx +++ b/packages/bridge-ui/components/Detail.tsx @@ -82,7 +82,7 @@ export const Detail: FC = ({ service, row }) => { Promise; + getValue?: (id: string) => Promise>; refreshInterval?: number; }; @@ -23,13 +23,16 @@ export const QRCode: FC = ({ refreshInterval, }) => { const [value, setValue] = useState(""); + const [kind, setKind] = useState("data"); const { white } = colors; useEffect(() => { if (!verified && getValue && refreshInterval) { const interval = setInterval(async () => { - const result = await getValue(token); - setValue(result); + const { qr, kind } = await getValue(token); + console.log({ kind }); + setValue(qr); + setKind(kind); }, refreshInterval * 1000); return () => clearInterval(interval); } @@ -37,7 +40,11 @@ export const QRCode: FC = ({ return !verified ? ( - + {kind === "data" ? ( + + ) : ( + {name} + )} {helperText} ) : null; diff --git a/packages/bridge-ui/config/signal.ts b/packages/bridge-ui/config/signal.ts index 759ef52..205acb9 100644 --- a/packages/bridge-ui/config/signal.ts +++ b/packages/bridge-ui/config/signal.ts @@ -1,5 +1,13 @@ import { ServiceConfig } from "../lib/service"; +const getQRCode = async (token: string): Promise> => { + const url = `/api/signal/bots/${token}`; + const result = await fetch(url, { cache: "no-store" }); + const { qr } = await result.json(); + + return { qr, kind: "image" }; +}; + export const signalConfig: ServiceConfig = { entity: "signal", table: "SignalBot", @@ -59,6 +67,15 @@ export const signalConfig: ServiceConfig = { label: "Token", copyable: true, }, + { + name: "qrcode", + label: "QR Code", + kind: "qrcode", + size: 4, + getQRCode, + helperText: "Go to link devices in the app, then scan the code", + refreshInterval: 15, + }, ], listColumns: [ { diff --git a/packages/bridge-ui/config/whatsapp.ts b/packages/bridge-ui/config/whatsapp.ts index da612d4..cff5756 100644 --- a/packages/bridge-ui/config/whatsapp.ts +++ b/packages/bridge-ui/config/whatsapp.ts @@ -6,7 +6,7 @@ const getQRCode = async (token: string) => { const result = await fetch(url, { cache: "no-store" }); const { qr } = await result.json(); - return qr ?? ""; + return { qr, kind: "data" }; }; export const whatsappConfig: ServiceConfig = { @@ -73,8 +73,8 @@ export const whatsappConfig: ServiceConfig = { label: "QR Code", kind: "qrcode", size: 4, - getValue: getQRCode, - helperText: "Go ahead, scan it", + getQRCode, + helperText: "Go to link devices in the app, then scan the code", refreshInterval: 15, }, ], diff --git a/packages/bridge-ui/lib/service.ts b/packages/bridge-ui/lib/service.ts index f1034ed..bd4cf5a 100644 --- a/packages/bridge-ui/lib/service.ts +++ b/packages/bridge-ui/lib/service.ts @@ -24,6 +24,7 @@ export type FieldDescription = { label: string; kind?: "text" | "phone" | "select" | "multi" | "qrcode"; getValue?: (token: string) => Promise; + getQRCode?: (token: string) => Promise>; refreshInterval?: number; getOptions?: (formState: any) => Promise; autogenerated?: "token"; diff --git a/packages/bridge-ui/lib/signal.ts b/packages/bridge-ui/lib/signal.ts index df7ec8b..d49eabd 100644 --- a/packages/bridge-ui/lib/signal.ts +++ b/packages/bridge-ui/lib/signal.ts @@ -1,3 +1,45 @@ -import { Service } from "./service"; +import { NextResponse } from "next/server"; +import { db } from "@link-stack/bridge-common"; +import { Configuration, DevicesApi } from "@link-stack/signal-api"; +// import { revalidatePath } from "next/cache"; +import { Service, ServiceParams } from "./service"; -export class Signal extends Service {} +const fetchNoCache = async (url: string, options = {}) => { + // @ts-ignore + options.cache = options.cache || "no-store"; + return fetch(url, options); +}; + +export class Signal extends Service { + async getBot({ params: { token } }: ServiceParams) { + const row = await db + .selectFrom("SignalBot") + .selectAll() + .where("token", "=", token as string) + .executeTakeFirstOrThrow(); + const { name } = row; + if (!row.verified) { + const config = new Configuration({ + basePath: process.env.BRIDGE_SIGNAL_URL, + fetchApi: fetchNoCache, + }); + + const devicesClient = new DevicesApi(config); + const blob: Blob = await devicesClient.v1QrcodelinkGet({ + deviceName: name.replaceAll(" ", "_"), + }); + const arrayBuffer = await blob.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + const qrString = buffer.toString("base64"); + const qr = `data:${blob.type};base64,${qrString}`; + const finalRow = { + ...row, + qr, + }; + + return NextResponse.json(finalRow); + } else { + return NextResponse.json(row); + } + } +} diff --git a/packages/signal-api/apis/DevicesApi.ts b/packages/signal-api/apis/DevicesApi.ts index 69f8753..c1a0094 100644 --- a/packages/signal-api/apis/DevicesApi.ts +++ b/packages/signal-api/apis/DevicesApi.ts @@ -5,278 +5,339 @@ * This is the Signal Cli REST API documentation. * * The version of the OpenAPI document: 1.0 - * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * Do not edit the class manually. */ - -import * as runtime from '../runtime'; +import * as runtime from "../runtime"; import type { ApiAddDeviceRequest, ApiError, ApiRegisterNumberRequest, ApiUnregisterNumberRequest, ApiVerifyNumberSettings, -} from '../models/index'; +} from "../models/index"; import { - ApiAddDeviceRequestFromJSON, - ApiAddDeviceRequestToJSON, - ApiErrorFromJSON, - ApiErrorToJSON, - ApiRegisterNumberRequestFromJSON, - ApiRegisterNumberRequestToJSON, - ApiUnregisterNumberRequestFromJSON, - ApiUnregisterNumberRequestToJSON, - ApiVerifyNumberSettingsFromJSON, - ApiVerifyNumberSettingsToJSON, -} from '../models/index'; + ApiAddDeviceRequestFromJSON, + ApiAddDeviceRequestToJSON, + ApiErrorFromJSON, + ApiErrorToJSON, + ApiRegisterNumberRequestFromJSON, + ApiRegisterNumberRequestToJSON, + ApiUnregisterNumberRequestFromJSON, + ApiUnregisterNumberRequestToJSON, + ApiVerifyNumberSettingsFromJSON, + ApiVerifyNumberSettingsToJSON, +} from "../models/index"; export interface V1DevicesNumberPostRequest { - number: string; - data: ApiAddDeviceRequest; + number: string; + data: ApiAddDeviceRequest; } export interface V1QrcodelinkGetRequest { - deviceName: string; - qrcodeVersion?: number; + deviceName: string; + qrcodeVersion?: number; } export interface V1RegisterNumberPostRequest { - number: string; - data?: ApiRegisterNumberRequest; + number: string; + data?: ApiRegisterNumberRequest; } export interface V1RegisterNumberVerifyTokenPostRequest { - number: string; - token: string; - data?: ApiVerifyNumberSettings; + number: string; + token: string; + data?: ApiVerifyNumberSettings; } export interface V1UnregisterNumberPostRequest { - number: string; - data?: ApiUnregisterNumberRequest; + number: string; + data?: ApiUnregisterNumberRequest; } /** - * + * */ export class DevicesApi extends runtime.BaseAPI { - - /** - * Links another device to this device. Only works, if this is the master device. - * Links another device to this device. - */ - async v1DevicesNumberPostRaw(requestParameters: V1DevicesNumberPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { - if (requestParameters['number'] == null) { - throw new runtime.RequiredError( - 'number', - 'Required parameter "number" was null or undefined when calling v1DevicesNumberPost().' - ); - } - - if (requestParameters['data'] == null) { - throw new runtime.RequiredError( - 'data', - 'Required parameter "data" was null or undefined when calling v1DevicesNumberPost().' - ); - } - - const queryParameters: any = {}; - - const headerParameters: runtime.HTTPHeaders = {}; - - headerParameters['Content-Type'] = 'application/json'; - - const response = await this.request({ - path: `/v1/devices/{number}`.replace(`{${"number"}}`, encodeURIComponent(String(requestParameters['number']))), - method: 'POST', - headers: headerParameters, - query: queryParameters, - body: ApiAddDeviceRequestToJSON(requestParameters['data']), - }, initOverrides); - - return new runtime.VoidApiResponse(response); + /** + * Links another device to this device. Only works, if this is the master device. + * Links another device to this device. + */ + async v1DevicesNumberPostRaw( + requestParameters: V1DevicesNumberPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + if (requestParameters["number"] == null) { + throw new runtime.RequiredError( + "number", + 'Required parameter "number" was null or undefined when calling v1DevicesNumberPost().', + ); } - /** - * Links another device to this device. Only works, if this is the master device. - * Links another device to this device. - */ - async v1DevicesNumberPost(requestParameters: V1DevicesNumberPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - await this.v1DevicesNumberPostRaw(requestParameters, initOverrides); + if (requestParameters["data"] == null) { + throw new runtime.RequiredError( + "data", + 'Required parameter "data" was null or undefined when calling v1DevicesNumberPost().', + ); } - /** - * Link device and generate QR code - * Link device and generate QR code. - */ - async v1QrcodelinkGetRaw(requestParameters: V1QrcodelinkGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { - if (requestParameters['deviceName'] == null) { - throw new runtime.RequiredError( - 'deviceName', - 'Required parameter "deviceName" was null or undefined when calling v1QrcodelinkGet().' - ); - } + const queryParameters: any = {}; - const queryParameters: any = {}; + const headerParameters: runtime.HTTPHeaders = {}; - if (requestParameters['deviceName'] != null) { - queryParameters['device_name'] = requestParameters['deviceName']; - } + headerParameters["Content-Type"] = "application/json"; - if (requestParameters['qrcodeVersion'] != null) { - queryParameters['qrcode_version'] = requestParameters['qrcodeVersion']; - } + const response = await this.request( + { + path: `/v1/devices/{number}`.replace( + `{${"number"}}`, + encodeURIComponent(String(requestParameters["number"])), + ), + method: "POST", + headers: headerParameters, + query: queryParameters, + body: ApiAddDeviceRequestToJSON(requestParameters["data"]), + }, + initOverrides, + ); - const headerParameters: runtime.HTTPHeaders = {}; + return new runtime.VoidApiResponse(response); + } - const response = await this.request({ - path: `/v1/qrcodelink`, - method: 'GET', - headers: headerParameters, - query: queryParameters, - }, initOverrides); + /** + * Links another device to this device. Only works, if this is the master device. + * Links another device to this device. + */ + async v1DevicesNumberPost( + requestParameters: V1DevicesNumberPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + await this.v1DevicesNumberPostRaw(requestParameters, initOverrides); + } - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + /** + * Link device and generate QR code + * Link device and generate QR code. + */ + async v1QrcodelinkGetRaw( + requestParameters: V1QrcodelinkGetRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + if (requestParameters["deviceName"] == null) { + throw new runtime.RequiredError( + "deviceName", + 'Required parameter "deviceName" was null or undefined when calling v1QrcodelinkGet().', + ); } - /** - * Link device and generate QR code - * Link device and generate QR code. - */ - async v1QrcodelinkGet(requestParameters: V1QrcodelinkGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.v1QrcodelinkGetRaw(requestParameters, initOverrides); - return await response.value(); + const queryParameters: any = {}; + + if (requestParameters["deviceName"] != null) { + queryParameters["device_name"] = requestParameters["deviceName"]; } - /** - * Register a phone number with the signal network. - * Register a phone number. - */ - async v1RegisterNumberPostRaw(requestParameters: V1RegisterNumberPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { - if (requestParameters['number'] == null) { - throw new runtime.RequiredError( - 'number', - 'Required parameter "number" was null or undefined when calling v1RegisterNumberPost().' - ); - } - - const queryParameters: any = {}; - - const headerParameters: runtime.HTTPHeaders = {}; - - headerParameters['Content-Type'] = 'application/json'; - - const response = await this.request({ - path: `/v1/register/{number}`.replace(`{${"number"}}`, encodeURIComponent(String(requestParameters['number']))), - method: 'POST', - headers: headerParameters, - query: queryParameters, - body: ApiRegisterNumberRequestToJSON(requestParameters['data']), - }, initOverrides); - - return new runtime.VoidApiResponse(response); + if (requestParameters["qrcodeVersion"] != null) { + queryParameters["qrcode_version"] = requestParameters["qrcodeVersion"]; } - /** - * Register a phone number with the signal network. - * Register a phone number. - */ - async v1RegisterNumberPost(requestParameters: V1RegisterNumberPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - await this.v1RegisterNumberPostRaw(requestParameters, initOverrides); + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request( + { + path: `/v1/qrcodelink`, + method: "GET", + headers: headerParameters, + query: queryParameters, + }, + initOverrides, + ); + + return new runtime.BlobApiResponse(response) as any; + } + + /** + * Link device and generate QR code + * Link device and generate QR code. + */ + async v1QrcodelinkGet( + requestParameters: V1QrcodelinkGetRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + const response = await this.v1QrcodelinkGetRaw( + requestParameters, + initOverrides, + ); + return await response.value(); + } + + /** + * Register a phone number with the signal network. + * Register a phone number. + */ + async v1RegisterNumberPostRaw( + requestParameters: V1RegisterNumberPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + if (requestParameters["number"] == null) { + throw new runtime.RequiredError( + "number", + 'Required parameter "number" was null or undefined when calling v1RegisterNumberPost().', + ); } - /** - * Verify a registered phone number with the signal network. - * Verify a registered phone number. - */ - async v1RegisterNumberVerifyTokenPostRaw(requestParameters: V1RegisterNumberVerifyTokenPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { - if (requestParameters['number'] == null) { - throw new runtime.RequiredError( - 'number', - 'Required parameter "number" was null or undefined when calling v1RegisterNumberVerifyTokenPost().' - ); - } + const queryParameters: any = {}; - if (requestParameters['token'] == null) { - throw new runtime.RequiredError( - 'token', - 'Required parameter "token" was null or undefined when calling v1RegisterNumberVerifyTokenPost().' - ); - } + const headerParameters: runtime.HTTPHeaders = {}; - const queryParameters: any = {}; + headerParameters["Content-Type"] = "application/json"; - const headerParameters: runtime.HTTPHeaders = {}; + const response = await this.request( + { + path: `/v1/register/{number}`.replace( + `{${"number"}}`, + encodeURIComponent(String(requestParameters["number"])), + ), + method: "POST", + headers: headerParameters, + query: queryParameters, + body: ApiRegisterNumberRequestToJSON(requestParameters["data"]), + }, + initOverrides, + ); - headerParameters['Content-Type'] = 'application/json'; + return new runtime.VoidApiResponse(response); + } - const response = await this.request({ - path: `/v1/register/{number}/verify/{token}`.replace(`{${"number"}}`, encodeURIComponent(String(requestParameters['number']))).replace(`{${"token"}}`, encodeURIComponent(String(requestParameters['token']))), - method: 'POST', - headers: headerParameters, - query: queryParameters, - body: ApiVerifyNumberSettingsToJSON(requestParameters['data']), - }, initOverrides); + /** + * Register a phone number with the signal network. + * Register a phone number. + */ + async v1RegisterNumberPost( + requestParameters: V1RegisterNumberPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + await this.v1RegisterNumberPostRaw(requestParameters, initOverrides); + } - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + /** + * Verify a registered phone number with the signal network. + * Verify a registered phone number. + */ + async v1RegisterNumberVerifyTokenPostRaw( + requestParameters: V1RegisterNumberVerifyTokenPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + if (requestParameters["number"] == null) { + throw new runtime.RequiredError( + "number", + 'Required parameter "number" was null or undefined when calling v1RegisterNumberVerifyTokenPost().', + ); } - /** - * Verify a registered phone number with the signal network. - * Verify a registered phone number. - */ - async v1RegisterNumberVerifyTokenPost(requestParameters: V1RegisterNumberVerifyTokenPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.v1RegisterNumberVerifyTokenPostRaw(requestParameters, initOverrides); - return await response.value(); + if (requestParameters["token"] == null) { + throw new runtime.RequiredError( + "token", + 'Required parameter "token" was null or undefined when calling v1RegisterNumberVerifyTokenPost().', + ); } - /** - * Disables push support for this device. **WARNING:** If *delete_account* is set to *true*, the account will be deleted from the Signal Server. This cannot be undone without loss. - * Unregister a phone number. - */ - async v1UnregisterNumberPostRaw(requestParameters: V1UnregisterNumberPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { - if (requestParameters['number'] == null) { - throw new runtime.RequiredError( - 'number', - 'Required parameter "number" was null or undefined when calling v1UnregisterNumberPost().' - ); - } + const queryParameters: any = {}; - const queryParameters: any = {}; + const headerParameters: runtime.HTTPHeaders = {}; - const headerParameters: runtime.HTTPHeaders = {}; + headerParameters["Content-Type"] = "application/json"; - headerParameters['Content-Type'] = 'application/json'; + const response = await this.request( + { + path: `/v1/register/{number}/verify/{token}` + .replace( + `{${"number"}}`, + encodeURIComponent(String(requestParameters["number"])), + ) + .replace( + `{${"token"}}`, + encodeURIComponent(String(requestParameters["token"])), + ), + method: "POST", + headers: headerParameters, + query: queryParameters, + body: ApiVerifyNumberSettingsToJSON(requestParameters["data"]), + }, + initOverrides, + ); - const response = await this.request({ - path: `/v1/unregister/{number}`.replace(`{${"number"}}`, encodeURIComponent(String(requestParameters['number']))), - method: 'POST', - headers: headerParameters, - query: queryParameters, - body: ApiUnregisterNumberRequestToJSON(requestParameters['data']), - }, initOverrides); + if (this.isJsonMime(response.headers.get("content-type"))) { + return new runtime.JSONApiResponse(response); + } else { + return new runtime.TextApiResponse(response) as any; + } + } - return new runtime.VoidApiResponse(response); + /** + * Verify a registered phone number with the signal network. + * Verify a registered phone number. + */ + async v1RegisterNumberVerifyTokenPost( + requestParameters: V1RegisterNumberVerifyTokenPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + const response = await this.v1RegisterNumberVerifyTokenPostRaw( + requestParameters, + initOverrides, + ); + return await response.value(); + } + + /** + * Disables push support for this device. **WARNING:** If *delete_account* is set to *true*, the account will be deleted from the Signal Server. This cannot be undone without loss. + * Unregister a phone number. + */ + async v1UnregisterNumberPostRaw( + requestParameters: V1UnregisterNumberPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + if (requestParameters["number"] == null) { + throw new runtime.RequiredError( + "number", + 'Required parameter "number" was null or undefined when calling v1UnregisterNumberPost().', + ); } - /** - * Disables push support for this device. **WARNING:** If *delete_account* is set to *true*, the account will be deleted from the Signal Server. This cannot be undone without loss. - * Unregister a phone number. - */ - async v1UnregisterNumberPost(requestParameters: V1UnregisterNumberPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - await this.v1UnregisterNumberPostRaw(requestParameters, initOverrides); - } + const queryParameters: any = {}; + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters["Content-Type"] = "application/json"; + + const response = await this.request( + { + path: `/v1/unregister/{number}`.replace( + `{${"number"}}`, + encodeURIComponent(String(requestParameters["number"])), + ), + method: "POST", + headers: headerParameters, + query: queryParameters, + body: ApiUnregisterNumberRequestToJSON(requestParameters["data"]), + }, + initOverrides, + ); + + return new runtime.VoidApiResponse(response); + } + + /** + * Disables push support for this device. **WARNING:** If *delete_account* is set to *true*, the account will be deleted from the Signal Server. This cannot be undone without loss. + * Unregister a phone number. + */ + async v1UnregisterNumberPost( + requestParameters: V1UnregisterNumberPostRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + await this.v1UnregisterNumberPostRaw(requestParameters, initOverrides); + } } diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 919bd09..4364ab8 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -9,13 +9,9 @@ "node": ">=20" }, "files": [ - "tsconfig.json" - ], - "keywords": [ - "tsconfig", - "typescript", - "ts", - "config" + "tsconfig.json", + "tsconfig.next.json", + "tsconfig.node.json" ], "scripts": { "lint": "echo no lint", diff --git a/packages/typescript-config/tsconfig.json b/packages/typescript-config/tsconfig.json index 7885618..b20fe4e 100644 --- a/packages/typescript-config/tsconfig.json +++ b/packages/typescript-config/tsconfig.json @@ -1,24 +1,15 @@ { "compilerOptions": { - "incremental": true, - "target": "es2020", - "lib": ["es2020"], - "module": "ES2020", - "moduleResolution": "node", - "declaration": true, - "inlineSourceMap": true, + "target": "esnext", + "skipLibCheck": true, + "strict": true, + "allowJs": true, + "forceConsistentCasingInFileNames": true, "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", "resolveJsonModule": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "traceResolution": false, - "listEmittedFiles": false, - "listFiles": false, - "pretty": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "types": ["node"] + "isolatedModules": true, + "incremental": true } } diff --git a/packages/typescript-config/tsconfig.next.json b/packages/typescript-config/tsconfig.next.json new file mode 100644 index 0000000..22b4768 --- /dev/null +++ b/packages/typescript-config/tsconfig.next.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + "lib": ["dom", "dom.iterable", "esnext"], + "noEmit": true, + "moduleResolution": "bundler", + "plugins": [ + { + "name": "next" + }, + { + "name": "typescript-eslint-language-service" + } + ] + } +} diff --git a/packages/typescript-config/tsconfig.node.json b/packages/typescript-config/tsconfig.node.json new file mode 100644 index 0000000..03bb317 --- /dev/null +++ b/packages/typescript-config/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": false, + "baseUrl": ".", + "sourceMap": true, + "inlineSources": true + } +}