From 21ecfd85efcac3964ccd9ba12ac9e2a21131a682 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 2 Apr 2026 15:59:56 -0700 Subject: [PATCH] client: strict mode --- packages/client/package-lock.json | 8 ++--- packages/client/package.json | 2 +- packages/client/src/index.ts | 51 ++++++++++++++++--------------- packages/client/tsconfig.json | 1 + 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/packages/client/package-lock.json b/packages/client/package-lock.json index bc8158cc4..b366482e3 100644 --- a/packages/client/package-lock.json +++ b/packages/client/package-lock.json @@ -21,7 +21,7 @@ "typescript": "^5.8.3" }, "peerDependencies": { - "@scrypted/types": "^0.5.52" + "@scrypted/types": "^0.5.55" } }, "node_modules/@cspotcode/source-map-support": { @@ -104,9 +104,9 @@ } }, "node_modules/@scrypted/types": { - "version": "0.5.52", - "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.5.52.tgz", - "integrity": "sha512-c1ra1ENnoC8MqVHf7QQcXIU+5BvQnhU4x5oqx4b20LtoB0/TTXthYFFvEDBvLenBivUr8Bb6dWrji7TZXVax1g==", + "version": "0.5.55", + "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.5.55.tgz", + "integrity": "sha512-99YAdiPRwR3q4ysA1hLZk1ZTdBwUFFUlh+18ESdcPOTRMWo0TI3JxfwniNsVMPmGZHcoM1yipC8xWkf9v+PB0g==", "license": "ISC", "peer": true, "dependencies": { diff --git a/packages/client/package.json b/packages/client/package.json index 5520e4074..60af46030 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -19,7 +19,7 @@ "typescript": "^5.8.3" }, "peerDependencies": { - "@scrypted/types": "^0.5.52" + "@scrypted/types": "^0.5.55" }, "dependencies": { "engine.io-client": "^6.6.3", diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index 65936a1f9..8c36056e3 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -162,7 +162,7 @@ export function getCurrentBaseUrlRaw() { if (!url) { try { - return getBaseUrl(process.env.SCRYPTED_ENDPOINT_PATH); + return getBaseUrl(process.env.SCRYPTED_ENDPOINT_PATH!); } catch (e) { } @@ -307,7 +307,7 @@ export function redirectScryptedLogin(options?: { globalThis.location.href = redirect_uri; } -export function combineBaseUrl(baseUrl: string, rootPath: string) { +export function combineBaseUrl(baseUrl: string|undefined, rootPath: string) { return baseUrl ? new URL(rootPath, baseUrl).toString() : '/' + rootPath; } @@ -348,13 +348,13 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro localAddresses = loginResult.addresses; externalAddresses = loginResult.externalAddresses; scryptedCloud = loginResult.scryptedCloud; - directAddress = loginResult.directAddress; - cloudAddress = loginResult.cloudAddress; + directAddress = loginResult.directAddress!; + cloudAddress = loginResult.cloudAddress!; authorization = loginResult.authorization; queryToken = loginResult.queryToken; token = loginResult.token; hostname = loginResult.hostname; - serverId = loginResult.serverId; + serverId = loginResult.serverId!; console.log('login result', Date.now() - start, loginResult); } else { @@ -421,14 +421,14 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro localAddresses = loginCheck.addresses; externalAddresses = loginCheck.externalAddresses; scryptedCloud = loginCheck.scryptedCloud; - directAddress = loginCheck.directAddress; - cloudAddress = loginCheck.cloudAddress; + directAddress = loginCheck.directAddress!; + cloudAddress = loginCheck.cloudAddress!; username = loginCheck.username; authorization = loginCheck.authorization; queryToken = loginCheck.queryToken; token = loginCheck.token; hostname = loginCheck.hostname; - serverId = loginCheck.serverId; + serverId = loginCheck.serverId!; console.log('login checked', Date.now() - start, loginCheck); } @@ -487,7 +487,7 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro // cross origin requests will not send cookies, so must send the authorization header. // note that cross origin websockets do not support extra headers, so the conneciton // must be initiated with polling transport first to establish a session. - localEioOptions.extraHeaders['Authorization'] ||= authorization; + localEioOptions.extraHeaders!['Authorization'] ||= authorization; let sockets: IOClientSocket[] = []; type EIOResult = { ready: IOClientSocket, connectionType: ScryptedClientConnectionType, address?: string, rpcPeer?: RpcPeer }; @@ -526,7 +526,7 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro const any = Promise.any(p2pPromises); await timeoutPromise(waitDuration, any); console.log('found direct connection, aborting scrypted cloud connection') - return; + return undefined!; } catch (e) { // timeout or all failures @@ -598,7 +598,7 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro } = scrypted; console.log('api attached', Date.now() - start); - mediaManager.createMediaObject = async(data: any, mimeType: string, options: T) => { + mediaManager.createMediaObject = async(data: any, mimeType: string, options?: T) => { return new MediaObject(mimeType, data, options) as any; } @@ -621,7 +621,7 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro .map(id => systemManager.getDeviceById(id)) .find(device => device.pluginId === '@scrypted/core' && device.nativeId === `user:${username}`); - const connectRPCObject = clusterSetup(address, connectionType, queryToken, extraHeaders, options?.transports, sourcePeerId, clientName); + const connectRPCObject = clusterSetup(address!, connectionType, queryToken, extraHeaders, options?.transports, sourcePeerId, clientName); const loginResult: ScryptedClientLoginResult = { username, @@ -655,7 +655,7 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro } }); - rpcPeer.killed.finally(() => threadPeer.kill('main rpc peer killed')); + rpcPeer!.killed.finally(() => threadPeer.kill('main rpc peer killed')); worker.addEventListener('message', async event => { if (event.data instanceof Uint8Array) { @@ -700,7 +700,7 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro if (eventDetails.eventInterface === ScryptedInterface.ScryptedDevice) { if (eventDetails.property === ScryptedInterfaceProperty.id) { // a change on the id property means device was deleted - remote.updateDeviceState(eventData, undefined); + remote.updateDeviceState(eventData, undefined!); } else { // a change on anything else is a descriptor update @@ -755,18 +755,18 @@ export async function connectScryptedClient(options: ScryptedClientOptions): Pro endpointManager, mediaManager, disconnect() { - rpcPeer.kill('disconnect requested'); + rpcPeer!.kill('disconnect requested'); }, pluginHostAPI, - rpcPeer, + rpcPeer: rpcPeer!, loginResult, connectRPCObject, fork, - connect: undefined, + connect: undefined!, } socket.on('close', () => { - rpcPeer.kill('socket closed'); + rpcPeer!.kill('socket closed'); }); rpcPeer.killed.finally(() => { @@ -831,7 +831,8 @@ function clusterSetup(address: string, connectionType: ScryptedClientConnectionT } }; - const resetReceiveTimeout = connectRPCObjectOptions?.dedicatedTransport?.receiveTimeout ? () => { + const dt = connectRPCObjectOptions?.dedicatedTransport; + const resetReceiveTimeout = dt?.receiveTimeout ? () => { if (receiveTimeout) { clearTimeout(receiveTimeout); } @@ -839,10 +840,10 @@ function clusterSetup(address: string, connectionType: ScryptedClientConnectionT if (clusterPeer) { clusterPeer.kill('receive timeout'); } - }, connectRPCObjectOptions.dedicatedTransport.receiveTimeout); + }, dt!.receiveTimeout); } : undefined; - const resetSendTimeout = connectRPCObjectOptions?.dedicatedTransport?.sendTimeout ? () => { + const resetSendTimeout = dt?.sendTimeout ? () => { if (sendTimeout) { clearTimeout(sendTimeout); } @@ -850,7 +851,7 @@ function clusterSetup(address: string, connectionType: ScryptedClientConnectionT if (clusterPeer) { clusterPeer.kill('send timeout'); } - }, connectRPCObjectOptions.dedicatedTransport.sendTimeout); + }, dt!.sendTimeout); } : undefined; clusterPeerSocket.on('close', () => { @@ -1020,7 +1021,7 @@ export async function connectScryptedClientFork(forkMain: (client: ScryptedClien } = scrypted; console.log('api attached', Date.now() - start); - mediaManager.createMediaObject = async(data: any, mimeType: string, options: T) => { + mediaManager.createMediaObject = async(data: any, mimeType: string, options?: T) => { return new MediaObject(mimeType, data, options) as any; } console.log('api initialized', Date.now() - start); @@ -1042,7 +1043,7 @@ export async function connectScryptedClientFork(forkMain: (client: ScryptedClien .map(id => systemManager.getDeviceById(id)) .find(device => device.pluginId === '@scrypted/core' && device.nativeId === `user:${username}`); - const connectRPCObject = clusterSetup(address, connectionType, queryToken, extraHeaders, transports, sourcePeerId, clientName); + const connectRPCObject = clusterSetup(address!, connectionType, queryToken, extraHeaders, transports, sourcePeerId, clientName); type ForkType = ScryptedClientStatic['fork']; const fork: ForkType = (forkOptions) => { @@ -1070,7 +1071,7 @@ export async function connectScryptedClientFork(forkMain: (client: ScryptedClien loginResult, connectRPCObject, fork, - connect: undefined, + connect: undefined!, } rpcPeer.killed.finally(() => { self.close(); diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json index 8f3b71a84..eefb7736c 100644 --- a/packages/client/tsconfig.json +++ b/packages/client/tsconfig.json @@ -8,6 +8,7 @@ "sourceMap": true, "inlineSources": true, "declaration": true, + "strict": true, "resolveJsonModule": true, }, "include": [