@clodocapeo/pulsar-bundle-full 1.0.0 → 1.2.0
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 +392 -56
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,44 +1,120 @@
|
|
|
1
1
|
# @clodocapeo/pulsar-bundle-full
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@clodocapeo/pulsar-bundle-full)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
[](https://github.com/ZabLaboratory/Pulsar/releases)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
|
|
8
|
+
The **full** Pulsar bundle: ships `pulsar.exe` + libobs runtime +
|
|
9
|
+
encoders + capture plugins **plus** `obs-browser` (CEF for HTML /
|
|
10
|
+
JS overlays), `obs-text` (native text sources), and `vlc-video`
|
|
11
|
+
(libVLC media playback). Same Node `spawn()` API as
|
|
12
|
+
[`@clodocapeo/pulsar-bundle`](https://www.npmjs.com/package/@clodocapeo/pulsar-bundle).
|
|
4
13
|
|
|
5
|
-
|
|
14
|
+
If you don't need browser sources / native text / VLC media, use
|
|
15
|
+
the lighter `@clodocapeo/pulsar-bundle` instead — same API, ~110 MB
|
|
16
|
+
less to download.
|
|
6
17
|
|
|
7
|
-
|
|
8
|
-
- Native text overlays (text_gdiplus / text_ft2_source)
|
|
9
|
-
- Local video file playback (vlc_source)
|
|
18
|
+
## Table of contents
|
|
10
19
|
|
|
11
|
-
|
|
20
|
+
- [What's in the box](#whats-in-the-box)
|
|
21
|
+
- [Choosing between light and full](#choosing-between-light-and-full)
|
|
22
|
+
- [Install](#install)
|
|
23
|
+
- [Quick start](#quick-start)
|
|
24
|
+
- [Browser / text / VLC sources](#browser--text--vlc-sources)
|
|
25
|
+
- [`spawn()` API](#spawn-api)
|
|
26
|
+
- [Bundling for distribution](#bundling-for-distribution)
|
|
27
|
+
- [CI / offline / mirror](#ci--offline--mirror)
|
|
28
|
+
- [Troubleshooting](#troubleshooting)
|
|
29
|
+
- [Versioning](#versioning)
|
|
30
|
+
- [Compatibility](#compatibility)
|
|
31
|
+
- [Licence](#licence)
|
|
12
32
|
|
|
13
|
-
##
|
|
33
|
+
## What's in the box
|
|
14
34
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
35
|
+
Everything in the **light** bundle, plus:
|
|
36
|
+
|
|
37
|
+
| Plugin | What it does |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `obs-browser` (Pulsar fork) | HTML / CSS / JS scenes via Chromium Embedded Framework. Real Chromium runtime, GPU-composited, controllable from the host. |
|
|
40
|
+
| `pulsar-browser-page.exe` | The CEF helper executable. Lives next to `libcef.dll` in `obs-plugins/64bit/`. |
|
|
41
|
+
| `obs-text` | Native text sources (`text_gdiplus`). Direct GDI+ rendering — fast, sharp, no DOM overhead. |
|
|
42
|
+
| `text-freetype2` | FreeType-rendered text sources (`text_ft2_source_v2`). Better cross-script support than gdiplus, less Windows-coupled. |
|
|
43
|
+
| `vlc-video` | Local media playback (`vlc_source`) backed by libVLC. Playlists, all the codecs libVLC handles. |
|
|
18
44
|
|
|
19
|
-
|
|
45
|
+
### Size
|
|
46
|
+
|
|
47
|
+
| | Compressed | Extracted |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| Light bundle | ~40 MB | ~100 MB |
|
|
50
|
+
| **Full bundle** | **~150 MB** | **~370 MB** |
|
|
20
51
|
|
|
21
|
-
|
|
52
|
+
The ~110 MB inflation is **CEF** — the Chromium runtime obs-browser
|
|
53
|
+
links against. It's what makes browser sources possible.
|
|
22
54
|
|
|
23
|
-
|
|
55
|
+
## Choosing between light and full
|
|
24
56
|
|
|
25
|
-
|
|
57
|
+
**Use the full bundle when** your scenes need any of:
|
|
26
58
|
|
|
27
|
-
|
|
59
|
+
- HTML / CSS / JS overlays composed in a real browser engine
|
|
60
|
+
- Operator-controlled web UIs as broadcast inputs
|
|
61
|
+
- Native text overlays (lower-bargain than rendering text in a browser)
|
|
62
|
+
- Local video file playback via VLC (formats ffmpeg doesn't ship by default)
|
|
63
|
+
- Any obs-studio plugin that depends on the listed plugins
|
|
28
64
|
|
|
65
|
+
**Use [`@clodocapeo/pulsar-bundle`](https://www.npmjs.com/package/@clodocapeo/pulsar-bundle) when** you can express your overlays
|
|
66
|
+
some other way: text rendered in a `Canvas` upstream of `pulsar.exe`,
|
|
67
|
+
overlays drawn into images / video files, scenes composed
|
|
68
|
+
client-side. The lean bundle saves ~110 MB and skips a lot of moving
|
|
69
|
+
parts (CEF subprocess management, GPU process, V8, …).
|
|
70
|
+
|
|
71
|
+
The two packages are **interchangeable from the API point of view**:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
// Identical:
|
|
75
|
+
import { spawn } from "@clodocapeo/pulsar-bundle";
|
|
76
|
+
import { spawn } from "@clodocapeo/pulsar-bundle-full";
|
|
29
77
|
```
|
|
30
|
-
|
|
31
|
-
|
|
78
|
+
|
|
79
|
+
Switching is a `package.json` rename — no code change.
|
|
80
|
+
|
|
81
|
+
## Install
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm install @clodocapeo/pulsar-bundle-full
|
|
32
85
|
```
|
|
33
86
|
|
|
34
|
-
|
|
87
|
+
Windows x64 only — `os: ["win32"]` + `cpu: ["x64"]` in `package.json`
|
|
88
|
+
make `npm install` skip on every other platform.
|
|
89
|
+
|
|
90
|
+
A `postinstall` step downloads
|
|
91
|
+
`pulsar-windows-x64-full-v<VERSION>.zip` from the matching Pulsar
|
|
92
|
+
GitHub Release (~150 MB) and extracts it into
|
|
93
|
+
`node_modules/@clodocapeo/pulsar-bundle-full/binaries/`. Cached: the
|
|
94
|
+
download is skipped if `binaries/.version-stamp` already matches the
|
|
95
|
+
package version.
|
|
96
|
+
|
|
97
|
+
If the download fails (network error, unpublished version, 404), the
|
|
98
|
+
postinstall **soft-fails** with a warning — `npm install` completes,
|
|
99
|
+
the package installs, but `spawn()` will throw a clear error. Same
|
|
100
|
+
behaviour as the light bundle.
|
|
101
|
+
|
|
102
|
+
## Quick start
|
|
35
103
|
|
|
36
104
|
```ts
|
|
37
105
|
import { spawn } from "@clodocapeo/pulsar-bundle-full";
|
|
38
106
|
|
|
39
|
-
const pulsar = await spawn(
|
|
107
|
+
const pulsar = await spawn({
|
|
108
|
+
env: {
|
|
109
|
+
PULSAR_FPS: "60",
|
|
110
|
+
PULSAR_RESOLUTION: "1920x1080",
|
|
111
|
+
PULSAR_VIDEO_BITRATE: "6000",
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
console.log(`pulsar booted: libobs ${pulsar.libobsVersion}, ws :${pulsar.port}`);
|
|
40
116
|
|
|
41
|
-
// HTML overlay via browser_source
|
|
117
|
+
// HTML overlay via browser_source — the headline feature of -full
|
|
42
118
|
await pulsar.client.obs.call("CreateInput", {
|
|
43
119
|
sceneName: "Default",
|
|
44
120
|
inputName: "Overlay",
|
|
@@ -50,67 +126,327 @@ await pulsar.client.obs.call("CreateInput", {
|
|
|
50
126
|
},
|
|
51
127
|
});
|
|
52
128
|
|
|
53
|
-
//
|
|
129
|
+
// Multi-destination + adaptive bitrate (same as light bundle)
|
|
130
|
+
const dest = await pulsar.client.destinations.create({
|
|
131
|
+
kind: "twitch",
|
|
132
|
+
key: process.env.TWITCH_KEY!,
|
|
133
|
+
});
|
|
134
|
+
await pulsar.client.destinations.start(dest.id);
|
|
135
|
+
|
|
136
|
+
// ... your application's broadcast workflow ...
|
|
137
|
+
|
|
138
|
+
await pulsar.shutdown();
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The full client surface (six namespaces, typed events, typed errors,
|
|
142
|
+
v5 baseline passthrough) is documented in
|
|
143
|
+
[`@clodocapeo/pulsar-client`'s README](https://www.npmjs.com/package/@clodocapeo/pulsar-client)
|
|
144
|
+
— this package re-exports every symbol so a single import gets you
|
|
145
|
+
both the spawn API and the client types.
|
|
146
|
+
|
|
147
|
+
## Browser / text / VLC sources
|
|
148
|
+
|
|
149
|
+
The three plugins exclusive to this bundle expose new
|
|
150
|
+
[obs-websocket v5 input kinds](https://github.com/obsproject/obs-websocket/blob/master/docs/generated/protocol.md#getinputkindlist).
|
|
151
|
+
You create them via `pulsar.client.obs.call("CreateInput", {...})`:
|
|
152
|
+
|
|
153
|
+
### Browser source (`browser_source`)
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
await pulsar.client.obs.call("CreateInput", {
|
|
157
|
+
sceneName: "Default",
|
|
158
|
+
inputName: "Overlay",
|
|
159
|
+
inputKind: "browser_source",
|
|
160
|
+
inputSettings: {
|
|
161
|
+
url: "https://my.cdn/overlay/index.html",
|
|
162
|
+
width: 1920,
|
|
163
|
+
height: 1080,
|
|
164
|
+
fps: 60,
|
|
165
|
+
fps_custom: true,
|
|
166
|
+
css: "body { background: transparent; }",
|
|
167
|
+
shutdown: true, // suspend audio when source is hidden
|
|
168
|
+
restart_when_active: false,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// At runtime, push events / state into the page:
|
|
173
|
+
await pulsar.client.obs.call("CallVendorRequest", {
|
|
174
|
+
vendorName: "obs-browser",
|
|
175
|
+
requestType: "emit_event",
|
|
176
|
+
requestData: {
|
|
177
|
+
event_name: "score_update",
|
|
178
|
+
event_data: { home: 3, away: 2 },
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
// In the page: window.addEventListener("obsSourceCustomEvent", ...)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
CEF runs the page in its own process (`pulsar-browser-page.exe`),
|
|
185
|
+
GPU-composited via libobs. The page can use the full Chromium API
|
|
186
|
+
including `OffscreenCanvas`, `WebAudio`, `WebGL2`, `WebTransport`, …
|
|
187
|
+
|
|
188
|
+
### Native text sources
|
|
189
|
+
|
|
190
|
+
Two flavours, pick whichever renders better for your locale:
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
// gdiplus: Windows-native, fast, sharp
|
|
54
194
|
await pulsar.client.obs.call("CreateInput", {
|
|
55
195
|
sceneName: "Default",
|
|
56
196
|
inputName: "Title",
|
|
57
|
-
inputKind: "
|
|
58
|
-
inputSettings: {
|
|
197
|
+
inputKind: "text_gdiplus_v3",
|
|
198
|
+
inputSettings: {
|
|
199
|
+
text: "LIVE",
|
|
200
|
+
font: { face: "Segoe UI", size: 64, flags: 1 },
|
|
201
|
+
color1: 0xFFFFFFFF,
|
|
202
|
+
outline: true,
|
|
203
|
+
outline_color: 0xFF000000,
|
|
204
|
+
},
|
|
59
205
|
});
|
|
60
206
|
|
|
61
|
-
//
|
|
207
|
+
// freetype2: better non-Latin script support
|
|
208
|
+
await pulsar.client.obs.call("CreateInput", {
|
|
209
|
+
sceneName: "Default",
|
|
210
|
+
inputName: "Subtitle",
|
|
211
|
+
inputKind: "text_ft2_source_v2",
|
|
212
|
+
inputSettings: {
|
|
213
|
+
text: "こんにちは",
|
|
214
|
+
font: { face: "Noto Sans CJK JP", size: 48 },
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### VLC media source (`vlc_source`)
|
|
220
|
+
|
|
221
|
+
```ts
|
|
62
222
|
await pulsar.client.obs.call("CreateInput", {
|
|
63
223
|
sceneName: "Default",
|
|
64
224
|
inputName: "Bumper",
|
|
65
225
|
inputKind: "vlc_source",
|
|
66
|
-
inputSettings: {
|
|
226
|
+
inputSettings: {
|
|
227
|
+
playlist: [
|
|
228
|
+
{ value: "C:/path/to/intro.mp4", selected: false, hidden: false },
|
|
229
|
+
{ value: "C:/path/to/sponsor.mkv", selected: false, hidden: false },
|
|
230
|
+
],
|
|
231
|
+
loop: true,
|
|
232
|
+
shuffle: false,
|
|
233
|
+
playback_behavior: "stop_restart",
|
|
234
|
+
},
|
|
67
235
|
});
|
|
68
|
-
|
|
69
|
-
await pulsar.shutdown();
|
|
70
236
|
```
|
|
71
237
|
|
|
72
|
-
|
|
238
|
+
Useful for codecs ffmpeg's default build doesn't support, or playlist
|
|
239
|
+
behaviour the FFmpeg muxer source can't express.
|
|
73
240
|
|
|
74
|
-
##
|
|
241
|
+
## `spawn()` API
|
|
75
242
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
| Extracted | ~100 MB | ~600 MB |
|
|
80
|
-
| Plugins | game capture, window, monitor, WASAPI, dshow webcam, x264/NVENC/QSV/AMF, ffmpeg, filters, transitions, multi-stream + websocket | + obs-browser (CEF) + obs-text + text-freetype2 + vlc-video |
|
|
81
|
-
| Best for | gaming streams, simple capture flows | composed scenes, HTML overlays, multi-source layouts |
|
|
243
|
+
Identical to the light bundle's. See the
|
|
244
|
+
[`@clodocapeo/pulsar-bundle` README](https://www.npmjs.com/package/@clodocapeo/pulsar-bundle)
|
|
245
|
+
for the full reference; it covers:
|
|
82
246
|
|
|
83
|
-
|
|
247
|
+
- The `SpawnOptions` shape (`binariesPath`, `env`, `readyTimeoutMs`,
|
|
248
|
+
`onLog`)
|
|
249
|
+
- The `SpawnedPulsar` handle (`client`, `child`, `port`,
|
|
250
|
+
`libobsVersion`, `shutdown()`)
|
|
251
|
+
- Boot environment variables (the full `PULSAR_*` matrix)
|
|
252
|
+
- Lifecycle (boot / shutdown / crash recovery)
|
|
84
253
|
|
|
85
|
-
|
|
254
|
+
Everything below is specific to the full bundle.
|
|
255
|
+
|
|
256
|
+
### Boot time
|
|
257
|
+
|
|
258
|
+
The full bundle takes **~1 s longer to boot** than the light variant —
|
|
259
|
+
CEF needs to spin up its own subprocess + GPU process before
|
|
260
|
+
`obs-browser` reports ready. The 30 s default `readyTimeoutMs` still
|
|
261
|
+
has plenty of headroom; bump it on contended CI runners or under
|
|
262
|
+
heavy AV scanning.
|
|
263
|
+
|
|
264
|
+
### CEF subprocess
|
|
265
|
+
|
|
266
|
+
`pulsar-browser-page.exe` ships in `obs-plugins/64bit/` next to
|
|
267
|
+
`libcef.dll` (mandatory — CEF resolves its helper executable
|
|
268
|
+
relative to the DLL). It is spawned by libobs via CEF's own
|
|
269
|
+
multi-process architecture; you don't manage it from Node.
|
|
270
|
+
|
|
271
|
+
If you see `pulsar-browser-page.exe` stuck in Task Manager after
|
|
272
|
+
`pulsar.exe` has exited, that's a known CEF-side issue (rare, usually
|
|
273
|
+
on heavy-load shutdowns). Pulsar's `taskkill` fallback in `shutdown()`
|
|
274
|
+
takes care of it; manual cleanup is `taskkill /F /IM pulsar-browser-page.exe`.
|
|
275
|
+
|
|
276
|
+
## Bundling for distribution
|
|
277
|
+
|
|
278
|
+
The full bundle is bigger — make sure your packaging tooling honours
|
|
279
|
+
the `asarUnpack` glob and the `cwd` constraint.
|
|
280
|
+
|
|
281
|
+
### electron-builder
|
|
282
|
+
|
|
283
|
+
```jsonc
|
|
284
|
+
{
|
|
285
|
+
"asar": true,
|
|
286
|
+
"asarUnpack": [
|
|
287
|
+
"node_modules/@clodocapeo/pulsar-bundle-full/binaries/**/*"
|
|
288
|
+
],
|
|
289
|
+
"files": [
|
|
290
|
+
"dist/**/*",
|
|
291
|
+
"node_modules/@clodocapeo/pulsar-bundle-full/**/*"
|
|
292
|
+
],
|
|
293
|
+
"extraResources": []
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Then in your Electron main process:
|
|
298
|
+
|
|
299
|
+
```ts
|
|
300
|
+
import { app } from "electron";
|
|
301
|
+
import { spawn } from "@clodocapeo/pulsar-bundle-full";
|
|
302
|
+
import { resolve } from "node:path";
|
|
303
|
+
|
|
304
|
+
const binariesPath = app.isPackaged
|
|
305
|
+
? resolve(
|
|
306
|
+
process.resourcesPath,
|
|
307
|
+
"app.asar.unpacked",
|
|
308
|
+
"node_modules",
|
|
309
|
+
"@clodocapeo",
|
|
310
|
+
"pulsar-bundle-full",
|
|
311
|
+
"binaries",
|
|
312
|
+
)
|
|
313
|
+
: undefined;
|
|
314
|
+
|
|
315
|
+
const pulsar = await spawn({ binariesPath });
|
|
316
|
+
```
|
|
86
317
|
|
|
87
|
-
|
|
318
|
+
### Installer size
|
|
88
319
|
|
|
89
|
-
|
|
320
|
+
A typical Electron app with `pulsar-bundle-full` in NSIS comes out
|
|
321
|
+
**around 200 MB** installed (your app code + Electron + Pulsar full
|
|
322
|
+
bundle). If that matters, ship `pulsar-bundle` (light) and
|
|
323
|
+
implement scene composition client-side; if it doesn't, the full
|
|
324
|
+
bundle gives you the most expressive scene model.
|
|
325
|
+
|
|
326
|
+
## CI / offline / mirror
|
|
327
|
+
|
|
328
|
+
Same env vars as the light bundle:
|
|
90
329
|
|
|
91
330
|
```bash
|
|
92
|
-
#
|
|
93
|
-
npm
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
# as @clodocapeo/pulsar-bundle
|
|
331
|
+
# CI: install but skip the 150 MB download
|
|
332
|
+
PULSAR_BUNDLE_SKIP_POSTINSTALL=1 npm ci
|
|
333
|
+
|
|
334
|
+
# Internal mirror
|
|
335
|
+
PULSAR_BUNDLE_DOWNLOAD_URL=https://my-mirror.internal/pulsar/v1.0.0-full.zip npm install
|
|
98
336
|
```
|
|
99
337
|
|
|
100
|
-
|
|
338
|
+
`PULSAR_BUNDLE_DOWNLOAD_URL` overrides the URL for **this package
|
|
339
|
+
only** — the light and full bundles each have their own download URL,
|
|
340
|
+
so a `pulsar-bundle` install in the same workspace fetches its own
|
|
341
|
+
zip from the default GitHub Releases path.
|
|
342
|
+
|
|
343
|
+
## Troubleshooting
|
|
344
|
+
|
|
345
|
+
In addition to everything in the
|
|
346
|
+
[light bundle's troubleshooting](https://www.npmjs.com/package/@clodocapeo/pulsar-bundle#troubleshooting):
|
|
347
|
+
|
|
348
|
+
### Browser source shows a blank / black square
|
|
349
|
+
|
|
350
|
+
CEF subprocess failed to start. Common causes:
|
|
351
|
+
|
|
352
|
+
1. **`pulsar-browser-page.exe` missing from `obs-plugins/64bit/`** —
|
|
353
|
+
antivirus may have quarantined it. Restore + whitelist.
|
|
354
|
+
2. **GPU disabled in CEF.** On some virtualised / RDP environments
|
|
355
|
+
CEF can't initialise its GPU process. The `obs-browser` plugin
|
|
356
|
+
logs the failure to stderr — capture it via `onLog` and look for
|
|
357
|
+
`gpu_process_host`.
|
|
358
|
+
3. **URL not reachable.** Check `pulsar.client.obs.call("GetInputSettings", { inputName })`
|
|
359
|
+
matches what you set, and that the URL responds with `200 OK`
|
|
360
|
+
(CEF won't render a 404 page by default).
|
|
361
|
+
|
|
362
|
+
### `Helper process exited with code 63`
|
|
363
|
+
|
|
364
|
+
This is the CEF subprocess crashing on launch. **Almost always**
|
|
365
|
+
means `pulsar-browser-page.exe` is in the wrong directory — it must
|
|
366
|
+
be in `obs-plugins/64bit/` next to `libcef.dll`, not in
|
|
367
|
+
`bin/64bit/`. The full bundle's CMake places it correctly; if you
|
|
368
|
+
re-stage the bundle by hand, preserve that layout.
|
|
369
|
+
|
|
370
|
+
### Audio from a `browser_source` is muffled / out of sync
|
|
371
|
+
|
|
372
|
+
Browser source audio goes through CEF's audio pipeline + libobs's
|
|
373
|
+
WASAPI graph — two A/V resync paths. Mitigations:
|
|
374
|
+
|
|
375
|
+
- Set `restart_when_active: false` so the browser process keeps
|
|
376
|
+
running across scene changes (avoids re-handshake stalls).
|
|
377
|
+
- Pin the page's audio sample rate to 48000 to match libobs's
|
|
378
|
+
audio mix bus.
|
|
379
|
+
- For CEF audio + scene-A-to-scene-B transitions, set the source's
|
|
380
|
+
audio sync offset via the v5 `SetInputAudioSyncOffset` request.
|
|
381
|
+
|
|
382
|
+
### `vlc_source` shows nothing
|
|
101
383
|
|
|
102
|
-
|
|
384
|
+
The bundled libVLC is stripped of optional codec support to keep the
|
|
385
|
+
zip size manageable. If your media file plays in standalone VLC but
|
|
386
|
+
not in Pulsar, the codec is probably not in the bundle. Workarounds:
|
|
387
|
+
re-encode to H.264/AAC, or use the FFmpeg muxer source
|
|
388
|
+
(`ffmpeg_source`) which ships with the light bundle anyway.
|
|
103
389
|
|
|
104
|
-
|
|
390
|
+
## Versioning
|
|
391
|
+
|
|
392
|
+
Tracks `pulsar-client` and `pulsar.exe` in lockstep — `1.0.0` of this
|
|
393
|
+
package downloads `pulsar-windows-x64-full-v1.0.0.zip` and depends on
|
|
394
|
+
`@clodocapeo/pulsar-client@1.0.0`.
|
|
395
|
+
|
|
396
|
+
Bump light, full, and client together; npm semver resolution rejects
|
|
397
|
+
mixed versions in a workspace.
|
|
398
|
+
|
|
399
|
+
## Compatibility
|
|
400
|
+
|
|
401
|
+
| | |
|
|
402
|
+
|---|---|
|
|
403
|
+
| OS | Windows 10/11 x64 only |
|
|
404
|
+
| Node | ≥ 18 |
|
|
405
|
+
| Module system | ESM only |
|
|
406
|
+
| CEF | bundled — version pinned by upstream `obs-browser` at the recorded SHA |
|
|
407
|
+
| Antivirus | Whitelist the `binaries/` directory; CEF helper exes are common false positives |
|
|
408
|
+
|
|
409
|
+
## Licence
|
|
410
|
+
|
|
411
|
+
[GPL-2.0-or-later](./LICENSE).
|
|
105
412
|
|
|
106
|
-
This package bundles `pulsar.exe`, libobs + Pulsar plugins, CEF
|
|
107
|
-
|
|
108
|
-
individual components retain their
|
|
109
|
-
LGPL-2.1-or-later for libVLC, GPL-2.0-or-later for libobs and Pulsar).
|
|
110
|
-
Source for the GPL components is available at <https://github.com/ZabLaboratory/Pulsar>
|
|
111
|
-
at the matching version tag.
|
|
413
|
+
This package bundles `pulsar.exe`, libobs + Pulsar plugins, CEF, and
|
|
414
|
+
libVLC. The aggregate is distributed under GPL-2.0-or-later;
|
|
415
|
+
individual components retain their upstream notices:
|
|
112
416
|
|
|
113
|
-
|
|
417
|
+
| Component | Licence |
|
|
418
|
+
|---|---|
|
|
419
|
+
| libobs, obs-studio plugins, Pulsar plugins | GPL-2.0-or-later |
|
|
420
|
+
| CEF (Chromium Embedded Framework) | BSD-3-Clause |
|
|
421
|
+
| libVLC | LGPL-2.1-or-later |
|
|
422
|
+
|
|
423
|
+
Source for the GPL components is available at
|
|
424
|
+
<https://github.com/ZabLaboratory/Pulsar> at the matching version
|
|
425
|
+
tag.
|
|
426
|
+
|
|
427
|
+
### Bundling Pulsar in a non-GPL application
|
|
428
|
+
|
|
429
|
+
Same four invariants as the light bundle:
|
|
430
|
+
|
|
431
|
+
1. **Process boundary.** Always spawn `pulsar.exe` as a separate OS
|
|
432
|
+
process. Never `LoadLibrary` / `dlopen` `pulsar.exe`,
|
|
433
|
+
`libcef.dll`, `pulsar-*.dll`, or any libobs binary.
|
|
434
|
+
2. **WebSocket-only IPC.** No FFI, no shared memory, no native
|
|
435
|
+
bindings.
|
|
436
|
+
3. **No FFI surface on Pulsar's side.** Don't add
|
|
437
|
+
`__declspec(dllexport)` to any plugin. Pulsar's CI gates this.
|
|
438
|
+
4. **No source copy-paste.** Don't include lines copied from
|
|
439
|
+
libobs / obs-websocket / obs-browser / CEF source trees in your
|
|
440
|
+
application.
|
|
441
|
+
|
|
442
|
+
Read [`LICENSE-INVARIANTS.md`](https://github.com/ZabLaboratory/Pulsar/blob/main/LICENSE-INVARIANTS.md)
|
|
443
|
+
on the Pulsar repo for the full contract, then
|
|
444
|
+
[`CONSUMER-AUDIT.md`](https://github.com/ZabLaboratory/Pulsar/blob/main/CONSUMER-AUDIT.md)
|
|
445
|
+
for the empirical checklist your application's CI must enforce.
|
|
446
|
+
|
|
447
|
+
If you only need the typed client without any GPL binary, use
|
|
114
448
|
[`@clodocapeo/pulsar-client`](https://www.npmjs.com/package/@clodocapeo/pulsar-client)
|
|
115
|
-
|
|
449
|
+
instead — it's MIT.
|
|
450
|
+
|
|
451
|
+
For the binary without browser sources / CEF / VLC, use
|
|
116
452
|
[`@clodocapeo/pulsar-bundle`](https://www.npmjs.com/package/@clodocapeo/pulsar-bundle).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clodocapeo/pulsar-bundle-full",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Full Pulsar bundle: pulsar.exe + DLLs + browser sources (CEF) + text + VLC. Same Node spawn() API as @clodocapeo/pulsar-bundle.",
|
|
5
5
|
"license": "GPL-2.0-or-later",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"prepublishOnly": "npm run build"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@clodocapeo/pulsar-client": "1.
|
|
41
|
+
"@clodocapeo/pulsar-client": "1.2.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@msgpack/msgpack": "^3.0.0",
|