obs-ws-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -0
- package/dist/client.d.ts +41 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +74 -0
- package/dist/client.js.map +1 -0
- package/dist/index.cjs +1482 -0
- package/dist/index.d.cts +1201 -0
- package/dist/index.d.mts +1201 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1463 -0
- package/dist/modules/base.d.ts +8 -0
- package/dist/modules/base.d.ts.map +1 -0
- package/dist/modules/base.js +9 -0
- package/dist/modules/base.js.map +1 -0
- package/dist/modules/config.d.ts +120 -0
- package/dist/modules/config.d.ts.map +1 -0
- package/dist/modules/config.js +162 -0
- package/dist/modules/config.js.map +1 -0
- package/dist/modules/filters.d.ts +102 -0
- package/dist/modules/filters.d.ts.map +1 -0
- package/dist/modules/filters.js +130 -0
- package/dist/modules/filters.js.map +1 -0
- package/dist/modules/general.d.ts +72 -0
- package/dist/modules/general.d.ts.map +1 -0
- package/dist/modules/general.js +98 -0
- package/dist/modules/general.js.map +1 -0
- package/dist/modules/inputs.d.ts +257 -0
- package/dist/modules/inputs.d.ts.map +1 -0
- package/dist/modules/inputs.js +323 -0
- package/dist/modules/inputs.js.map +1 -0
- package/dist/modules/media-inputs.d.ts +39 -0
- package/dist/modules/media-inputs.d.ts.map +1 -0
- package/dist/modules/media-inputs.js +55 -0
- package/dist/modules/media-inputs.js.map +1 -0
- package/dist/modules/outputs.d.ts +91 -0
- package/dist/modules/outputs.d.ts.map +1 -0
- package/dist/modules/outputs.js +133 -0
- package/dist/modules/outputs.js.map +1 -0
- package/dist/modules/record.d.ts +35 -0
- package/dist/modules/record.d.ts.map +1 -0
- package/dist/modules/record.js +62 -0
- package/dist/modules/record.js.map +1 -0
- package/dist/modules/scene-items.d.ts +195 -0
- package/dist/modules/scene-items.d.ts.map +1 -0
- package/dist/modules/scene-items.js +172 -0
- package/dist/modules/scene-items.js.map +1 -0
- package/dist/modules/scenes.d.ts +98 -0
- package/dist/modules/scenes.d.ts.map +1 -0
- package/dist/modules/scenes.js +129 -0
- package/dist/modules/scenes.js.map +1 -0
- package/dist/modules/sources.d.ts +50 -0
- package/dist/modules/sources.d.ts.map +1 -0
- package/dist/modules/sources.js +66 -0
- package/dist/modules/sources.js.map +1 -0
- package/dist/modules/stream.d.ts +30 -0
- package/dist/modules/stream.d.ts.map +1 -0
- package/dist/modules/stream.js +48 -0
- package/dist/modules/stream.js.map +1 -0
- package/dist/modules/transitions.d.ts +58 -0
- package/dist/modules/transitions.d.ts.map +1 -0
- package/dist/modules/transitions.js +84 -0
- package/dist/modules/transitions.js.map +1 -0
- package/dist/modules/ui.d.ts +55 -0
- package/dist/modules/ui.d.ts.map +1 -0
- package/dist/modules/ui.js +79 -0
- package/dist/modules/ui.js.map +1 -0
- package/package.json +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# obs-ws-sdk
|
|
2
|
+
|
|
3
|
+
A high-level TypeScript SDK for [OBS WebSocket](https://github.com/obsproject/obs-websocket), built on top of [`obs-websocket-js`](https://github.com/obs-websocket-community-projects/obs-websocket-js) with [`zod`](https://zod.dev) runtime validation.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Full Type Safety** — Precise TypeScript types for all requests and responses
|
|
8
|
+
- **Semantic API** — Namespace-style method calls instead of raw string-based requests
|
|
9
|
+
- **Runtime Validation** — Zod schemas validate both request parameters and responses
|
|
10
|
+
- **IDE Support** — Complete IntelliSense and auto-completion
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pnpm add obs-ws-sdk
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { OBSDK } from 'obs-ws-sdk'
|
|
22
|
+
|
|
23
|
+
const sdk = new OBSDK()
|
|
24
|
+
await sdk.connect('ws://localhost:4455', 'your-password')
|
|
25
|
+
|
|
26
|
+
// Namespace-style API with full type safety
|
|
27
|
+
const version = await sdk.general.getVersion()
|
|
28
|
+
console.log(version.obsVersion)
|
|
29
|
+
|
|
30
|
+
const scenes = await sdk.scenes.getSceneList()
|
|
31
|
+
console.log(scenes.scenes)
|
|
32
|
+
|
|
33
|
+
await sdk.scenes.setCurrentProgramScene({ sceneName: 'Scene 1' })
|
|
34
|
+
|
|
35
|
+
// Event handling (transparent passthrough from obs-websocket-js)
|
|
36
|
+
sdk.on('CurrentProgramSceneChanged', (event) => {
|
|
37
|
+
console.log('Scene changed to:', event.sceneName)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
await sdk.disconnect()
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Modules
|
|
44
|
+
|
|
45
|
+
| Module | Description |
|
|
46
|
+
|--------|-------------|
|
|
47
|
+
| `sdk.general` | Version info, stats, hotkeys, custom events |
|
|
48
|
+
| `sdk.config` | Scene collections, profiles, video/stream settings |
|
|
49
|
+
| `sdk.sources` | Source active state, screenshots |
|
|
50
|
+
| `sdk.scenes` | Scene list, program/preview scene, create/remove |
|
|
51
|
+
| `sdk.inputs` | Input management, settings, audio controls |
|
|
52
|
+
| `sdk.transitions` | Transition kinds, current transition, T-Bar |
|
|
53
|
+
| `sdk.filters` | Filter management, settings, enable state |
|
|
54
|
+
| `sdk.sceneItems` | Scene item list, transform, enable/lock state |
|
|
55
|
+
| `sdk.outputs` | Virtual cam, replay buffer, output management |
|
|
56
|
+
| `sdk.stream` | Stream status, start/stop/toggle |
|
|
57
|
+
| `sdk.record` | Record status, start/stop/pause/resume |
|
|
58
|
+
| `sdk.mediaInputs` | Media input status, cursor, playback actions |
|
|
59
|
+
| `sdk.ui` | Studio mode, dialogs, projectors |
|
|
60
|
+
|
|
61
|
+
## License
|
|
62
|
+
|
|
63
|
+
[MIT](./LICENSE)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import OBSWebSocket from "obs-websocket-js";
|
|
2
|
+
import { ConfigModule } from "./modules/config";
|
|
3
|
+
import { FiltersModule } from "./modules/filters";
|
|
4
|
+
import { GeneralModule } from "./modules/general";
|
|
5
|
+
import { InputsModule } from "./modules/inputs";
|
|
6
|
+
import { MediaInputsModule } from "./modules/media-inputs";
|
|
7
|
+
import { OutputsModule } from "./modules/outputs";
|
|
8
|
+
import { RecordModule } from "./modules/record";
|
|
9
|
+
import { SceneItemsModule } from "./modules/scene-items";
|
|
10
|
+
import { ScenesModule } from "./modules/scenes";
|
|
11
|
+
import { SourcesModule } from "./modules/sources";
|
|
12
|
+
import { StreamModule } from "./modules/stream";
|
|
13
|
+
import { TransitionsModule } from "./modules/transitions";
|
|
14
|
+
import { UiModule } from "./modules/ui";
|
|
15
|
+
export declare class OBSDK {
|
|
16
|
+
private obs;
|
|
17
|
+
readonly general: GeneralModule;
|
|
18
|
+
readonly config: ConfigModule;
|
|
19
|
+
readonly sources: SourcesModule;
|
|
20
|
+
readonly scenes: ScenesModule;
|
|
21
|
+
readonly inputs: InputsModule;
|
|
22
|
+
readonly transitions: TransitionsModule;
|
|
23
|
+
readonly filters: FiltersModule;
|
|
24
|
+
readonly sceneItems: SceneItemsModule;
|
|
25
|
+
readonly outputs: OutputsModule;
|
|
26
|
+
readonly stream: StreamModule;
|
|
27
|
+
readonly record: RecordModule;
|
|
28
|
+
readonly mediaInputs: MediaInputsModule;
|
|
29
|
+
readonly ui: UiModule;
|
|
30
|
+
constructor();
|
|
31
|
+
connect(url?: string, password?: string, identificationParams?: object): Promise<void>;
|
|
32
|
+
disconnect(): Promise<void>;
|
|
33
|
+
callBatch: OBSWebSocket["callBatch"];
|
|
34
|
+
on: OBSWebSocket["on"];
|
|
35
|
+
once: OBSWebSocket["once"];
|
|
36
|
+
off: OBSWebSocket["off"];
|
|
37
|
+
addListener: OBSWebSocket["addListener"];
|
|
38
|
+
removeListener: OBSWebSocket["removeListener"];
|
|
39
|
+
removeAllListeners: OBSWebSocket["removeAllListeners"];
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,qBAAa,KAAK;IAChB,OAAO,CAAC,GAAG,CAAe;IAE1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;;IAoBhB,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItF,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,CAElC;IAEF,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,CAEpB;IAEF,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAExB;IAEF,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAEtB;IAEF,WAAW,EAAE,YAAY,CAAC,aAAa,CAAC,CAEtC;IAEF,cAAc,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAE5C;IAEF,kBAAkB,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAIpD;CACH"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import OBSWebSocket from "obs-websocket-js";
|
|
2
|
+
import { ConfigModule } from "./modules/config";
|
|
3
|
+
import { FiltersModule } from "./modules/filters";
|
|
4
|
+
import { GeneralModule } from "./modules/general";
|
|
5
|
+
import { InputsModule } from "./modules/inputs";
|
|
6
|
+
import { MediaInputsModule } from "./modules/media-inputs";
|
|
7
|
+
import { OutputsModule } from "./modules/outputs";
|
|
8
|
+
import { RecordModule } from "./modules/record";
|
|
9
|
+
import { SceneItemsModule } from "./modules/scene-items";
|
|
10
|
+
import { ScenesModule } from "./modules/scenes";
|
|
11
|
+
import { SourcesModule } from "./modules/sources";
|
|
12
|
+
import { StreamModule } from "./modules/stream";
|
|
13
|
+
import { TransitionsModule } from "./modules/transitions";
|
|
14
|
+
import { UiModule } from "./modules/ui";
|
|
15
|
+
export class OBSDK {
|
|
16
|
+
obs;
|
|
17
|
+
general;
|
|
18
|
+
config;
|
|
19
|
+
sources;
|
|
20
|
+
scenes;
|
|
21
|
+
inputs;
|
|
22
|
+
transitions;
|
|
23
|
+
filters;
|
|
24
|
+
sceneItems;
|
|
25
|
+
outputs;
|
|
26
|
+
stream;
|
|
27
|
+
record;
|
|
28
|
+
mediaInputs;
|
|
29
|
+
ui;
|
|
30
|
+
constructor() {
|
|
31
|
+
this.obs = new OBSWebSocket();
|
|
32
|
+
this.general = new GeneralModule(this.obs);
|
|
33
|
+
this.config = new ConfigModule(this.obs);
|
|
34
|
+
this.sources = new SourcesModule(this.obs);
|
|
35
|
+
this.scenes = new ScenesModule(this.obs);
|
|
36
|
+
this.inputs = new InputsModule(this.obs);
|
|
37
|
+
this.transitions = new TransitionsModule(this.obs);
|
|
38
|
+
this.filters = new FiltersModule(this.obs);
|
|
39
|
+
this.sceneItems = new SceneItemsModule(this.obs);
|
|
40
|
+
this.outputs = new OutputsModule(this.obs);
|
|
41
|
+
this.stream = new StreamModule(this.obs);
|
|
42
|
+
this.record = new RecordModule(this.obs);
|
|
43
|
+
this.mediaInputs = new MediaInputsModule(this.obs);
|
|
44
|
+
this.ui = new UiModule(this.obs);
|
|
45
|
+
}
|
|
46
|
+
async connect(url, password, identificationParams) {
|
|
47
|
+
await this.obs.connect(url, password, identificationParams);
|
|
48
|
+
}
|
|
49
|
+
async disconnect() {
|
|
50
|
+
await this.obs.disconnect();
|
|
51
|
+
}
|
|
52
|
+
callBatch = (...args) => {
|
|
53
|
+
return this.obs.callBatch(...args);
|
|
54
|
+
};
|
|
55
|
+
on = (...args) => {
|
|
56
|
+
return this.obs.on(...args);
|
|
57
|
+
};
|
|
58
|
+
once = (...args) => {
|
|
59
|
+
return this.obs.once(...args);
|
|
60
|
+
};
|
|
61
|
+
off = (...args) => {
|
|
62
|
+
return this.obs.off(...args);
|
|
63
|
+
};
|
|
64
|
+
addListener = (...args) => {
|
|
65
|
+
return this.obs.addListener(...args);
|
|
66
|
+
};
|
|
67
|
+
removeListener = (...args) => {
|
|
68
|
+
return this.obs.removeListener(...args);
|
|
69
|
+
};
|
|
70
|
+
removeAllListeners = (...args) => {
|
|
71
|
+
return this.obs.removeAllListeners(...args);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|