Commit Graph

1872 Commits

Author SHA1 Message Date
Koushik Dutta
59c1741f73 postbeta 2026-09-12 13:25:59 -07:00
Koushik Dutta
a920424b49 server: fix engine.io api routing vulnerability 2026-09-12 13:24:37 -07:00
Koushik Dutta
bd451e71ec auth: update http-auth-utils, convert plugins to rollup build 2026-09-11 11:52:15 -07:00
Koushik Dutta
cf5797549b postbeta
Some checks failed
Build SDK / Build (push) Has been cancelled
2026-09-08 19:07:56 -07:00
Koushik Dutta
c269ba41b8 server/sdk: update adm-zip 2026-09-08 19:07:29 -07:00
Koushik Dutta
1d1c9c6155 server: package lock 2026-09-03 09:03:55 -07:00
Koushik Dutta
9541ae3b5c postbeta 2026-09-02 08:49:49 -07:00
Koushik Dutta
9d3ca39ced server: package lock 2026-09-02 08:49:02 -07:00
Koushik Dutta
cf1faefe56 postrelease 2026-09-02 08:48:47 -07:00
Koushik Dutta
eed2dab4a0 server: bump min core 2026-09-02 08:47:49 -07:00
Koushik Dutta
b63b7df286 beta: verup 2026-08-25 09:30:21 -07:00
Koushik Dutta
8e5bef60f5 postbeta 2026-08-24 10:21:42 -07:00
Koushik Dutta
af5ea0cf42 postbeta 2026-08-24 10:20:56 -07:00
Koushik Dutta
c74f5c82c0 server/rpc: fix yielded async generator leak https://github.com/koush/scrypted/issues/2121 2026-08-14 13:25:58 -07:00
Koushik Dutta
f58c30072a server/rpc: fix yielded async generator leak https://github.com/koush/scrypted/issues/2121 2026-08-14 13:21:49 -07:00
Raman Gupta
c1ed7dff65 python-client: fix imports and extract a reusable scrypted_client library (#2094)
* python-client: link transitive server modules required by plugin_remote

plugin_remote now imports cluster_labels, cluster_setup, plugin_console,
plugin_pip, and plugin_volume (plus a lazy plugin_repl import), but
packages/python-client only symlinks plugin_remote, rpc, rpc_reader, and
scrypted_python. As a result the client cannot be imported at all:

    ModuleNotFoundError: No module named 'cluster_labels'

Add symlinks for the missing modules, matching the existing pattern of
sharing one implementation with server/python.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaSWgBV1XsZxWiYM16sWME

* python-client: extract reusable scrypted_client library from test.py

The only way to connect to Scrypted from Python has been to copy the
bootstrap out of test.py, which is not importable (module-level event
loop) and had drifted from the current rpc_reader/PluginRemote APIs
(writeJSON vs writeSerialized, missing ClusterSetup argument).

Move the transport and connection handshake into an importable
scrypted_client module:

- EioRpcTransport gains a close() method, an optional injectable
  aiohttp session for the engine.io connection, and queues its send
  loop on the running loop instead of via run_coroutine_threadsafe.
- connect_scrypted_client() performs login, the engine.io connect, and
  the getRemote handshake, with a connect timeout and consistent
  ScryptedConnectionError on failure. It also attaches the constructed
  SystemManager to remote.systemManager, the same wiring loadZip does
  for plugins, so PluginRemote.notify can dispatch events to
  systemManager.listen() callbacks.
- test.py becomes a small demo of the library and exits cleanly
  without os._exit(); the server URL is configurable via
  SCRYPTED_BASE_URL.

Verified live against a Scrypted server (device enumeration and OnOff
state reads).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaSWgBV1XsZxWiYM16sWME

* python-client: bound all connect phases and tear down tasks on close

Address review feedback:

- close() now cancels and awaits both the send loop and the peer read
  loop (previously the send task was cancelled but never awaited and
  the read task was untracked), so closing the event loop after
  close() no longer risks 'Task was destroyed but it is pending'
  warnings.
- connect_scrypted_client() stores the read-loop task on the transport
  and propagates read-loop failures into the pending handshake future,
  so a link that dies mid-handshake fails immediately with the
  underlying error instead of waiting out the timeout.
- The timeout parameter now bounds every phase: the login POST
  (aiohttp ClientTimeout), the engine.io connect (asyncio.wait_for),
  and the wait for initial system state.
- Document session ownership: login_session is borrowed and never
  closed; an http_session given to EioRpcTransport is owned by the
  transport and closed by close().

Verified live against a Scrypted server: clean run with empty stderr,
plus connection-refused and bad-credential paths both raising
ScryptedConnectionError.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaSWgBV1XsZxWiYM16sWME

* python-client: lazily import plugin host modules in plugin_remote

A client consuming plugin_remote (for SystemManager, DeviceManager,
MediaManager) only needs the types and the engine.io/rpc bits. The
plugin host modules (cluster_labels, plugin_console, plugin_pip,
plugin_volume) are only used inside loadZipWrapped, so import them
there -- importing plugin_remote no longer requires them, and the
client directory drops those symlinks (plugin_repl was already a lazy
import). cluster_setup stays: the client bootstrap constructs a
ClusterSetup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 13:36:55 -07:00
Raman Gupta
9a6fc6e810 server: dispatch python plugin events to systemManager listeners (#2086)
The python port of plugin-remote's notify() updates systemState but the
dispatch to systemManager.events was left as a commented-out TODO, so
systemManager.listen() callbacks never fire in python plugins/clients
(plugin-remote.ts dispatches via notifyEventDetails here). Port the
current typescript semantics: plain property changes update state and
notify listeners with the unwrapped value, everything else passes
through raw, and mixin property events no longer write device state.

Also fix EventRegistry.listenDevice to register callbacks in the
token-keyed listener set (it raised KeyError on the device id key,
diverging from event-registry.ts) so watch-mode device listeners work.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 11:14:13 -07:00
Koushik Dutta
5606a95fb3 server: fix null toleratnce in getPluginInfo 2026-06-01 15:13:13 -07:00
Koushik Dutta
bd57be88fd server: fix compile error 2026-06-01 15:10:34 -07:00
merritt925
2c1ccfbca7 fix: restore null-tolerance lost in strictNullChecks migration (#2060)
Two runtime regressions from the strict-mode migration (range 125db2e..c6be722) where a real runtime guard was replaced by a non-null assertion:

- services/cluster-fork.ts: findPluginDevice(...)!._id threw and aborted fork() when the plugin device was not found. Restored ?._id so options.id stays undefined (it is only a worker-affinity hint).
- plugin/plugin-host-api.ts: onDevicesChanged() coerced a missing optional 'devices' field to [], turning a fail-safe throw into mass (cascading) removal of all of a provider's devices. Restored fail-fast on missing devices.

Both compile under strictNullChecks.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 15:09:47 -07:00
David Glandon
07f9bfacac server: Fix leaking fd due to cleanup (#2052) 2026-05-29 22:15:21 -07:00
Sergey Vilgelm
6d9a3876f5 server: guard plugin-repl against stale nativeId (#2024)
* server: guard plugin-repl against stale nativeId

The REPL handler destructured nativeIds.get(filter) directly, which
threw an unhandledRejection TypeError when filter was a nativeId for a
device that had been removed since the UI rendered the REPL link.
Break out of the chain walk when the lookup misses instead.

Assisted-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Sergey Vilgelm <sergey@vilgelm.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Signed-off-by: Sergey Vilgelm <sergey@vilgelm.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-02 09:24:06 -07:00
Koushik Dutta
d0383c6503 server: match mediaobject constrcutor 2026-04-02 15:55:54 -07:00
Koushik Dutta
1c894561a0 tsconfig: remove redundant strict flags covered by 'strict: true'
Some checks failed
Build SDK / Build (push) Has been cancelled
The following flags are implied by 'strict: true' and are redundant:
- strictNullChecks
- strictFunctionTypes
- strictBindCallApply
- strictPropertyInitialization
- noImplicitThis
- alwaysStrict
- noImplicitAny

Kept explicitly:
- noFallthroughCasesInSwitch
- noUncheckedIndexedAccess
- noImplicitOverride
- noImplicitReturns
2026-04-02 14:59:37 -07:00
Koushik Dutta
d8b305dcdb fixup: services: update findPluginDevice call after return type change 2026-04-02 14:58:25 -07:00
Koushik Dutta
5a1c3d024b plugin: add type assertions for strictNullChecks in runtime workers
Fix strictNullChecks:
- child-process-worker.ts: add definite assignment for childProcess
- custom-worker.ts: add assertions for pluginDevice and options
- node-fork-worker.ts: add catch block type annotation
- node-thread-worker.ts: add catch block type annotation
- python-worker.ts: add assertions for worker properties
2026-04-02 14:57:53 -07:00
Koushik Dutta
2bd8354ead plugin: add type assertions for strictNullChecks in plugin core modules
Fix strictNullChecks:
- device.ts: add assertions for storage and nativeIds access
- endpoint.ts: add assertions for device and handler access
- plugin-api.ts: add definite assignment for callback properties
- plugin-host-api.ts: add assertions for findPluginDevice results,
  consolidate plugin assertions at declarations
- plugin-lazy-remote.ts: add assertion for getFile result
- system.ts: add definite assignment for manager properties,
  add assertions for state access
2026-04-02 14:57:14 -07:00
Koushik Dutta
34a9e698ae plugin: add type assertions for strictNullChecks in plugin-device and remote modules
Fix strictNullChecks:
- plugin-device.ts: consolidate entry/host assertions at declarations,
  use undefined! for proxy values, add definite assignment for mixinTable
- plugin-remote.ts: add assertions for callbacks and nativeIds access
- plugin-remote-worker.ts: fix clusterWorkerId as Promise<string | undefined>,
  add assertions for worker and options properties
2026-04-02 14:54:40 -07:00
Koushik Dutta
01aab01e46 plugin: add type assertions for strictNullChecks in plugin-host and media
Fix strictNullChecks:
- plugin-host.ts: consolidate logger assertion at declaration,
  extract handler variable to avoid repeated assertions,
  use undefined! for clusterWorkerId, add definite assignment
- media.ts: add assertions for converter and mediaObject access
2026-04-02 14:51:35 -07:00
Koushik Dutta
61d9345bf6 cluster: add type assertions for strictNullChecks compliance
Fix strictNullChecks in cluster modules:
- cluster-labels.ts: add assertions for label and weight access
- cluster.ts: keep getClusterWorkerId returning string (API contract)
- scrypted-cluster-main.ts: add assertions for socket properties,
  consolidate remoteAddress assertion, fix cluster worker lookups
- cluster-fork.ts: add assertions for worker and options properties,
  fix findPluginDevice call with assertion
2026-04-02 14:50:26 -07:00
Koushik Dutta
d0deb04588 runtime: add type assertions for strictNullChecks compliance
Fix strictNullChecks in runtime.ts and scrypted-server-main.ts:
- Change findPluginDevice return type to PluginDevice | undefined
- Add type assertions at call sites that expect valid results
- Consolidate assertions at variable declarations
- Use undefined! instead of undefined as any
- Use throw e instead of throw new Error(e as string)
- Add catch block type annotations (e: any)
- Fix socket property and plugin device lookups with assertions
2026-04-02 14:48:39 -07:00
Koushik Dutta
d69c949ec7 services: add type assertions for strictNullChecks compliance
Fix strictNullChecks in services:
- plugin.ts: assert findPluginDeviceById results at assignment point,
  clean up scattered assertions throughout methods
- users.ts: make aclId parameter optional in addUserToDatabase/addUserInternal
2026-04-02 14:19:26 -07:00
Koushik Dutta
519eb36368 utils: add type assertions for strictNullChecks compliance
Fix strictNullChecks in utility modules:
- rpc.ts: make onProxySerialization optional (used with ?.), add definite assignment for killedDeferred
- state.ts: cast catch block error to Error
- level.ts: add definite assignment for curId
- threading.ts: cast catch block errors to Error
- http-interfaces.ts: cast catch block error to Error
- plugin-http.ts: cast catch block errors to Error, fix abstract method return type
- usertoken.ts: make aclId optional in UserToken constructor
2026-04-02 14:15:28 -07:00
Koushik Dutta
896445ec80 strictNullChecks: fix plugin remote handlers
- Make PluginRemote.loadZip options parameter optional to match implementations
- Add undefined to _protocols type in WebSocket class
- Add non-null assertions for device lookup in REPL server
2026-04-02 13:33:12 -07:00
Koushik Dutta
85a30d7b87 strictNullChecks: fix plugin types
- Add non-null assertion for eventInterface in acl.ts
- Add non-null assertion for SCRYPTED_CLUSTER_ADDRESS env var
- Use .flat() instead of [].concat() for type safety
- Add non-null assertion for ScryptedDevice descriptor access
- Use options! and null! assertions for mediaObject properties
2026-04-02 13:33:12 -07:00
Koushik Dutta
f620c80589 strictNullChecks: fix plugin runtime workers
- Add non-null assertions for worker and stdio access
- Add non-null assertions for kill() undefined assignments
2026-04-02 13:33:12 -07:00
Koushik Dutta
5f040f5ff4 strictNullChecks: fix core utilities
- Change Express sendFile root from null to undefined
- Add undefined to RefreshPromise.promise type
- Add undefined to debouncer current promise type
2026-04-02 13:33:12 -07:00
Koushik Dutta
5bfb3e5675 strictNullChecks: fix services and notifyInterfaceEvent type
- Change notifyInterfaceEvent parameter to PluginDevice | undefined
- Pass undefined instead of null at call sites
- Add non-null assertion for webhookUpdateAuthorization
2026-04-02 13:33:12 -07:00
Koushik Dutta
056be96e4f strictNullChecks: fix cluster modules
- Initialize foundAny variable before use
- Add fallback for undefined env var in parseFloat
- Add non-null assertions for Map lookups and array indices
- Fix ClusterObject type annotation for undefined case
- Add non-null assertions for env vars and socket properties
2026-04-02 13:33:12 -07:00
Koushik Dutta
ca7efc1f04 fix: type annotations for event and state management
- Add type assertions for event callbacks and timestamps
- Use non-null assertions for guaranteed object references
- Update notify signature to accept number | undefined for eventTime
- Preserve crash behavior for logger and refresh throttle access
2026-04-02 13:33:12 -07:00
Koushik Dutta
9c1d2b78c8 fix: type annotations for plugin API layer
- setStorage interface uses ScryptedNativeId to match implementation
- getDeviceById returns Promise<ScryptedDevice | undefined>
- Add non-null assertions where objects are guaranteed to exist
- Add explicit error throws for null checks with descriptive messages
2026-04-02 13:33:12 -07:00
Koushik Dutta
2763f4af2c fix: make pid optional in RuntimeWorker interface
pid may be undefined if worker hasn't started yet.
Update implementations to return number | undefined.
2026-04-02 13:33:12 -07:00
Koushik Dutta
621c5537d4 fix: use ScryptedNativeId type for plugin device maps
Use ScryptedNativeId (string | undefined) as Map key type instead of string,
matching the actual usage pattern where nativeId can be undefined.
2026-04-02 13:33:12 -07:00
Koushik Dutta
2187982b07 fix: add type annotations for plugin HTTP handling
- Add ?? false for isUpgradeRequest return type
- Add non-null assertion for socket access
- Add early validation for empty endpoint
2026-04-02 13:33:12 -07:00
Koushik Dutta
5dde5ae893 fix: add type annotations for network address functions
- Add parseInt with empty string fallback for undefined env vars
- getIpAddress returns string | undefined when no addresses available
- Add type guard filters for network interface arrays
2026-04-02 13:33:12 -07:00
Koushik Dutta
cfa9e2a200 fix: make LevelDocument._id and _documentType required
These properties are always present after document creation.
Update PluginDevice constructor to require id parameter.
2026-04-02 13:33:12 -07:00
Koushik Dutta
0d4a0d2c2c fix: initialize RpcResult before try block to match Python implementation
Previously, if this.serialize() threw an exception, result would be undefined
when passed to createErrorResult. This fix brings TypeScript in sync with the
Python rpc.py implementation which already initializes result before the try block.
2026-04-02 13:33:12 -07:00
Koushik Dutta
24ecc19e99 fix: add ts-ignore for delete operations on required properties
zipFile and unzippedPath are set at runtime by cluster worker host.
2026-04-02 13:33:12 -07:00
Koushik Dutta
675b967862 fix: add undefined to buffer state type annotations
Buffer state variables can be undefined before initialization.
2026-04-02 13:33:12 -07:00
Koushik Dutta
3882805cfc fix: add type guard filter for network interfaces
Filter undefined values after flat() to prevent runtime errors
when accessing ni.address.
2026-04-02 13:33:12 -07:00