@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.
Files changed (2) hide show
  1. package/README.md +392 -56
  2. package/package.json +2 -2
package/README.md CHANGED
@@ -1,44 +1,120 @@
1
1
  # @clodocapeo/pulsar-bundle-full
2
2
 
3
- Full Pulsar bundle for Node consumers — `pulsar.exe` with **browser sources**, **text sources**, and **VLC-backed media sources** included on top of the standard light bundle. Same `spawn()` API as [`@clodocapeo/pulsar-bundle`](../pulsar-bundle).
3
+ [![npm](https://img.shields.io/npm/v/%40clodocapeo%2Fpulsar-bundle-full?logo=npm&color=cb3837)](https://www.npmjs.com/package/@clodocapeo/pulsar-bundle-full)
4
+ [![Licence GPL-2.0-or-later](https://img.shields.io/badge/licence-GPL--2.0--or--later-blue)](./LICENSE)
5
+ [![Platform](https://img.shields.io/badge/platform-windows--x64-0078d4)](https://github.com/ZabLaboratory/Pulsar/releases)
6
+ [![Node ≥ 18](https://img.shields.io/badge/node-%E2%89%A518-339933)](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
- Use this package when your scenes need any of:
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
- - HTML / CSS / JS overlays (browser_source via CEF)
8
- - Native text overlays (text_gdiplus / text_ft2_source)
9
- - Local video file playback (vlc_source)
18
+ ## Table of contents
10
19
 
11
- If you only need game capture + window/monitor capture + audio + recording + RTMP, the smaller [`@clodocapeo/pulsar-bundle`](../pulsar-bundle) (~40 MB zip) is enough.
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
- ## Install
33
+ ## What's in the box
14
34
 
15
- ```bash
16
- npm install @clodocapeo/pulsar-bundle-full
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
- Windows x64 only — `os: ["win32"]` in `package.json` makes `npm install` skip the binary on every other platform.
45
+ ### Size
46
+
47
+ | | Compressed | Extracted |
48
+ |---|---|---|
49
+ | Light bundle | ~40 MB | ~100 MB |
50
+ | **Full bundle** | **~150 MB** | **~370 MB** |
20
51
 
21
- A `postinstall` step downloads the matching version's `pulsar-windows-x64-full-vX.Y.Z.zip` from the Pulsar GitHub Releases (~250 MB) and extracts it into `node_modules/@clodocapeo/pulsar-bundle-full/binaries/`. Cached: re-running `npm install` against an unchanged version is a no-op.
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
- The 200 MB inflation over the light bundle is **CEF** (Chromium Embedded Framework, the runtime obs-browser links against). It is what makes browser sources possible.
55
+ ## Choosing between light and full
24
56
 
25
- ### Environment overrides
57
+ **Use the full bundle when** your scenes need any of:
26
58
 
27
- Same as `@clodocapeo/pulsar-bundle`:
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
- PULSAR_BUNDLE_SKIP_POSTINSTALL=1 # skip download (CI / offline)
31
- PULSAR_BUNDLE_DOWNLOAD_URL=<url> # mirror or internal CDN
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
- ## Usage
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 (the headline feature of -full)
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
- // Native text source
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: "text_gdiplus",
58
- inputSettings: { text: "LIVE", font: { face: "Segoe UI", size: 64 } },
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
- // VLC-backed local video file playback
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: { playlist: ["C:/path/to/clip.mp4"] },
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
- `spawn()` returns the same handle shape as the light bundle (`{ client, child, port, libobsVersion, shutdown }`). All the higher-level namespaces (`destinations`, `video`, `adaptive`, `record`, `stream`) are inherited from `@clodocapeo/pulsar-client` and work identically.
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
- ## Trade-off vs the light bundle
241
+ ## `spawn()` API
75
242
 
76
- | | `pulsar-bundle` (light) | `pulsar-bundle-full` |
77
- |---|---|---|
78
- | Zip download | ~40 MB | ~250 MB |
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
- Both bundles ship the same set of always-stripped plugins (obs-vst, obs-webrtc, decklink, frontend-tools, obs-libfdk) — those are deliberate omissions, see the repo's main README for the rationale.
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
- ## Versioning
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
- Locked to `pulsar-client` and `pulsar.exe` in lockstep. `0.2.0` of this package downloads `pulsar-windows-x64-full-v0.2.0.zip` and depends on `@clodocapeo/pulsar-client@0.2.0`.
318
+ ### Installer size
88
319
 
89
- ## Development
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
- # from the monorepo root
93
- npm install # workspaces resolve, postinstall soft-fails
94
- # on offline / unreleased versions
95
- npm run build # tsc -> dist/
96
- npm run test # vitest with the same fake-pulsar fixture
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
- The vitest suite uses `tests/fake-pulsar.mjs` (a Node script that mimics pulsar.exe's boot) and exercises the same 5 lifecycle tests as `pulsar-bundle`. Browser-source-specific behaviour requires the real `pulsar.exe` with CEF; that's covered in the repo's integration smoke test, not the package's unit suite.
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
- ## License
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
- GPL-2.0-or-later. See [`LICENSE`](./LICENSE).
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 (browser
107
- sources) and libVLC. The aggregate is distributed under GPL-2.0-or-later;
108
- individual components retain their own upstream notices (BSD for CEF,
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
- If you only need the typed client without any binary, use
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
- (MIT). For the binary without browser sources, use
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.0.0",
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.0.0"
41
+ "@clodocapeo/pulsar-client": "1.2.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@msgpack/msgpack": "^3.0.0",