dphelper 4.6.0 → 4.6.2
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/COPYRIGHT.md +6 -6
- package/FUNDING.yml +12 -12
- package/LICENSE.md +21 -21
- package/README.md +637 -397
- package/SECURITY.md +26 -26
- package/SUMMARY.md +83 -83
- package/index.cjs +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/llms.txt +515 -73
- package/modules/ai.cjs +1 -1
- package/modules/ai.d.ts +11 -11
- package/modules/ai.js +1 -1
- package/modules/anchor.cjs +1 -1
- package/modules/anchor.d.ts +6 -6
- package/modules/anchor.js +1 -1
- package/modules/array.cjs +1 -1
- package/modules/array.d.ts +21 -21
- package/modules/array.js +1 -1
- package/modules/audio.cjs +1 -1
- package/modules/audio.d.ts +10 -10
- package/modules/audio.js +1 -1
- package/modules/avoid.cjs +1 -1
- package/modules/avoid.d.ts +2 -2
- package/modules/avoid.js +1 -1
- package/modules/biometric.cjs +1 -1
- package/modules/biometric.d.ts +14 -14
- package/modules/biometric.js +1 -1
- package/modules/browser.cjs +1 -1
- package/modules/browser.d.ts +10 -10
- package/modules/browser.js +1 -1
- package/modules/check.cjs +1 -1
- package/modules/check.d.ts +4 -4
- package/modules/check.js +1 -1
- package/modules/color.cjs +1 -1
- package/modules/color.d.ts +6 -6
- package/modules/color.js +1 -1
- package/modules/compress.cjs +1 -1
- package/modules/compress.d.ts +13 -13
- package/modules/compress.js +1 -1
- package/modules/cookie.cjs +1 -1
- package/modules/cookie.d.ts +12 -12
- package/modules/cookie.js +1 -1
- package/modules/coords.cjs +1 -1
- package/modules/coords.d.ts +8 -8
- package/modules/coords.js +1 -1
- package/modules/credits.cjs +1 -1
- package/modules/credits.d.ts +11 -11
- package/modules/credits.js +1 -1
- package/modules/date.cjs +1 -1
- package/modules/date.d.ts +25 -25
- package/modules/date.js +1 -1
- package/modules/disable.cjs +1 -1
- package/modules/disable.d.ts +8 -8
- package/modules/disable.js +1 -1
- package/modules/dispatch.cjs +1 -1
- package/modules/dispatch.d.ts +4 -4
- package/modules/dispatch.js +1 -1
- package/modules/elements.cjs +1 -1
- package/modules/elements.d.ts +3 -3
- package/modules/elements.js +1 -1
- package/modules/events.cjs +1 -1
- package/modules/events.d.ts +6 -6
- package/modules/events.js +1 -1
- package/modules/fetch.cjs +1 -1
- package/modules/fetch.d.ts +15 -15
- package/modules/fetch.js +1 -1
- package/modules/form.cjs +1 -1
- package/modules/form.d.ts +13 -13
- package/modules/form.js +1 -1
- package/modules/format.cjs +1 -1
- package/modules/format.d.ts +3 -3
- package/modules/format.js +1 -1
- package/modules/i18n.cjs +1 -1
- package/modules/i18n.d.ts +11 -11
- package/modules/i18n.js +1 -1
- package/modules/image.cjs +1 -1
- package/modules/image.d.ts +13 -13
- package/modules/image.js +1 -1
- package/modules/json.cjs +1 -1
- package/modules/json.d.ts +8 -8
- package/modules/json.js +1 -1
- package/modules/load.cjs +1 -1
- package/modules/load.d.ts +8 -8
- package/modules/load.js +1 -1
- package/modules/logging.cjs +1 -1
- package/modules/logging.d.ts +8 -8
- package/modules/logging.js +1 -1
- package/modules/math.cjs +1 -1
- package/modules/math.d.ts +13 -13
- package/modules/math.js +1 -1
- package/modules/memory.cjs +1 -1
- package/modules/memory.d.ts +3 -3
- package/modules/memory.js +1 -1
- package/modules/navigation.cjs +1 -1
- package/modules/navigation.d.ts +4 -4
- package/modules/navigation.js +1 -1
- package/modules/net.cjs +1 -1
- package/modules/net.d.ts +10 -10
- package/modules/net.js +1 -1
- package/modules/objects.cjs +1 -1
- package/modules/objects.d.ts +15 -15
- package/modules/objects.js +1 -1
- package/modules/path.cjs +1 -1
- package/modules/path.d.ts +4 -4
- package/modules/path.js +1 -1
- package/modules/promise.cjs +1 -1
- package/modules/promise.d.ts +3 -3
- package/modules/promise.js +1 -1
- package/modules/sanitize.cjs +1 -1
- package/modules/sanitize.d.ts +2 -2
- package/modules/sanitize.js +1 -1
- package/modules/screen.cjs +1 -1
- package/modules/screen.d.ts +11 -11
- package/modules/screen.js +1 -1
- package/modules/scrollbar.cjs +1 -1
- package/modules/scrollbar.d.ts +9 -9
- package/modules/scrollbar.js +1 -1
- package/modules/security.cjs +1 -1
- package/modules/security.d.ts +15 -15
- package/modules/security.js +1 -1
- package/modules/shortcut.cjs +1 -1
- package/modules/shortcut.d.ts +2 -2
- package/modules/shortcut.js +1 -1
- package/modules/socket.cjs +1 -1
- package/modules/socket.d.ts +13 -13
- package/modules/socket.js +1 -1
- package/modules/sse.cjs +1 -1
- package/modules/sse.d.ts +8 -8
- package/modules/sse.js +1 -1
- package/modules/svg.cjs +1 -1
- package/modules/svg.d.ts +12 -12
- package/modules/svg.js +1 -1
- package/modules/sync.cjs +1 -1
- package/modules/sync.d.ts +13 -13
- package/modules/sync.js +1 -1
- package/modules/system.cjs +1 -1
- package/modules/system.d.ts +2 -2
- package/modules/system.js +1 -1
- package/modules/text.cjs +1 -1
- package/modules/text.d.ts +13 -13
- package/modules/text.js +1 -1
- package/modules/timer.cjs +1 -1
- package/modules/timer.d.ts +3 -3
- package/modules/timer.js +1 -1
- package/modules/tools.cjs +1 -1
- package/modules/tools.d.ts +5 -5
- package/modules/tools.js +1 -1
- package/modules/translators.cjs +1 -1
- package/modules/translators.d.ts +2 -2
- package/modules/translators.js +1 -1
- package/modules/triggers.cjs +1 -1
- package/modules/triggers.d.ts +43 -43
- package/modules/triggers.js +1 -1
- package/modules/types.cjs +1 -1
- package/modules/types.d.ts +5 -5
- package/modules/types.js +1 -1
- package/modules/ui.cjs +1 -1
- package/modules/ui.d.ts +3 -3
- package/modules/ui.js +1 -1
- package/modules/window.cjs +1 -1
- package/modules/window.d.ts +9 -9
- package/modules/window.js +1 -1
- package/modules/worker.cjs +1 -1
- package/modules/worker.d.ts +16 -16
- package/modules/worker.js +1 -1
- package/package.json +2 -2
- package/sbom.json +10 -15
- package/types/dphelper.d.ts +546 -546
- package/types/global.d.ts +8 -8
package/README.md
CHANGED
|
@@ -1,397 +1,637 @@
|
|
|
1
|
-
# [dphelper](https://npmjs.com/package/dphelper)
|
|
2
|
-
|
|
3
|
-

|
|
4
|
-
|
|
5
|
-
> **The supercharged toolkit for modern web development, AI engineering & DevTools.**
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-

|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
> **The supercharged toolkit for modern web development, AI engineering & DevTools.**
|
|
6
|
+
|
|
7
|
+
**The stateless, zero-dependency capability toolkit for Web, Node.js, Bun, Deno and AI systems.**
|
|
8
|
+
|
|
9
|
+
**Modules.**
|
|
10
|
+
**One namespace.**
|
|
11
|
+
**One consistent API.**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
[](https://npmjs.org/package/dphelper)
|
|
16
|
+
[](https://npmjs.org/package/dphelper)
|
|
17
|
+
|
|
18
|
+

|
|
19
|
+

|
|
20
|
+

|
|
21
|
+

|
|
22
|
+

|
|
23
|
+

|
|
24
|
+

|
|
25
|
+
[](https://playwright.dev/)
|
|
26
|
+

|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Table of Contents
|
|
32
|
+
|
|
33
|
+
1. [What is dphelper?](#what-is-dphelper)
|
|
34
|
+
2. [Why dphelper?](#why-dphelper)
|
|
35
|
+
3. [Installation](#installation)
|
|
36
|
+
4. [The Capability Model](#the-capability-model)
|
|
37
|
+
5. [AI Power User Guide](#ai-power-user-guide)
|
|
38
|
+
6. [Modular Architecture](#modular-architecture)
|
|
39
|
+
7. [Web Worker Module](#web-worker-module)
|
|
40
|
+
8. [UI Mirror & Auto-Recovery](#ui-mirror--auto-recovery)
|
|
41
|
+
9. [Browser Extension](#browser-extension)
|
|
42
|
+
10. [Environment Compatibility](#environment-compatibility)
|
|
43
|
+
11. [Security](#security)
|
|
44
|
+
12. [State Architecture](#state-architecture)
|
|
45
|
+
13. [License](#license)
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## What is dphelper?
|
|
50
|
+
|
|
51
|
+
**dphelper** is a **stateless, zero-dependency capability toolkit** for modern JavaScript and TypeScript applications.
|
|
52
|
+
|
|
53
|
+
It provides a consistent collection of production-oriented capabilities for:
|
|
54
|
+
|
|
55
|
+
* Web development
|
|
56
|
+
* Node.js, Bun and Deno
|
|
57
|
+
* AI and LLM applications
|
|
58
|
+
* DevTools
|
|
59
|
+
* Browser applications
|
|
60
|
+
* Security and cryptography
|
|
61
|
+
* Networking
|
|
62
|
+
* Workers and parallel processing
|
|
63
|
+
* Data transformation
|
|
64
|
+
* Internationalization
|
|
65
|
+
* Runtime utilities
|
|
66
|
+
|
|
67
|
+
Instead of maintaining many small utility dependencies, applications can expose the capabilities they need through a single, consistent API.
|
|
68
|
+
|
|
69
|
+
### The core idea
|
|
70
|
+
|
|
71
|
+
A **capability** is a self-contained operation exposed through a predictable namespace and API.
|
|
72
|
+
|
|
73
|
+
For example:
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
dphelper.security.ulid();
|
|
77
|
+
dphelper.format.currency(1234.56, "en-US", "USD");
|
|
78
|
+
dphelper.ai.tokenCount(data);
|
|
79
|
+
dphelper.worker.create("worker.js");
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The same capabilities can also be imported individually when modularity and tree-shaking are preferred.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Why dphelper?
|
|
87
|
+
|
|
88
|
+
### ⚡ Zero Dependencies
|
|
89
|
+
|
|
90
|
+
Pure JavaScript/TypeScript with no runtime dependency chain.
|
|
91
|
+
|
|
92
|
+
### 🧩 Modular
|
|
93
|
+
|
|
94
|
+
Every tool is exposed as an independent module and can be imported separately.
|
|
95
|
+
|
|
96
|
+
### 🌐 Universal
|
|
97
|
+
|
|
98
|
+
Tools are classified according to their execution environment and can target:
|
|
99
|
+
|
|
100
|
+
* Browser
|
|
101
|
+
* Node.js
|
|
102
|
+
* Bun
|
|
103
|
+
* Deno
|
|
104
|
+
* Isomorphic environments
|
|
105
|
+
|
|
106
|
+
### 🔒 Type-Safe
|
|
107
|
+
|
|
108
|
+
TypeScript definitions are generated and synchronized with the available tools.
|
|
109
|
+
|
|
110
|
+
### 📦 Compact
|
|
111
|
+
|
|
112
|
+
Approximately **171 KB minified**, with modular entry points available for smaller application bundles.
|
|
113
|
+
|
|
114
|
+
### 🤖 AI Ready
|
|
115
|
+
|
|
116
|
+
AI-oriented capabilities include:
|
|
117
|
+
|
|
118
|
+
* TOON structured representation
|
|
119
|
+
* Context-aware token counting
|
|
120
|
+
* RAG-oriented chunking
|
|
121
|
+
* Semantic similarity
|
|
122
|
+
* AI response processing
|
|
123
|
+
* Runtime snapshots optimized for LLM consumption
|
|
124
|
+
|
|
125
|
+
### 🔐 Security-Oriented
|
|
126
|
+
|
|
127
|
+
Uses established cryptographic primitives including:
|
|
128
|
+
|
|
129
|
+
* AES-256-GCM
|
|
130
|
+
* SHA-256
|
|
131
|
+
* PBKDF2
|
|
132
|
+
|
|
133
|
+
Security-sensitive functionality should always be evaluated according to the application's threat model and deployment environment.
|
|
134
|
+
|
|
135
|
+
> [!NOTE]
|
|
136
|
+
> **Network Access:** `dphelper` includes networking primitives such as `fetch`, `sse` and `socket`. Applications remain responsible for validating and sanitizing externally supplied URLs and other inputs.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Installation
|
|
141
|
+
|
|
142
|
+
```shell
|
|
143
|
+
npm install dphelper
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Usage
|
|
147
|
+
|
|
148
|
+
Import the package once at the application entry point when using the global namespace:
|
|
149
|
+
|
|
150
|
+
```javascript
|
|
151
|
+
// Import once at your application entry point
|
|
152
|
+
|
|
153
|
+
import "dphelper";
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
After initialization, capabilities are available through the global `dphelper` namespace.
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
dphelper.format.currency(1234.56, "en-US", "USD");
|
|
160
|
+
dphelper.security.ulid();
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Modular Imports
|
|
166
|
+
|
|
167
|
+
For smaller bundles and explicit dependencies, import individual capabilities:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import { sanitize } from "dphelper/sanitize";
|
|
171
|
+
import { format } from "dphelper/format";
|
|
172
|
+
import { fetch } from "dphelper/fetch";
|
|
173
|
+
import { security } from "dphelper/security";
|
|
174
|
+
|
|
175
|
+
sanitize.html("<strong>safe text</strong>");
|
|
176
|
+
|
|
177
|
+
format.currency(1234.56, "en-US", "USD");
|
|
178
|
+
|
|
179
|
+
await fetch.get("https://api.example.com");
|
|
180
|
+
|
|
181
|
+
security.ulid();
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
The same capability remains available through the global namespace after importing the module:
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
import "dphelper/format";
|
|
188
|
+
|
|
189
|
+
dphelper.format.currency(1234.56, "en-US", "USD");
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Automatic Module Generation
|
|
193
|
+
|
|
194
|
+
Every tool under `tools/` is published as a corresponding package subpath:
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
dphelper/array
|
|
198
|
+
dphelper/i18n
|
|
199
|
+
dphelper/worker
|
|
200
|
+
dphelper/security
|
|
201
|
+
dphelper/...
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
The build system automatically discovers tools and generates their modular entry points and TypeScript interfaces.
|
|
205
|
+
|
|
206
|
+
Adding a tool therefore does not require manually maintaining a separate export registry.
|
|
207
|
+
|
|
208
|
+
### TypeScript and `resolvePackageJsonExports`
|
|
209
|
+
|
|
210
|
+
Modular subpath imports are resolved through the `exports` map in `dphelper/package.json`.
|
|
211
|
+
|
|
212
|
+
If your `tsconfig.json` explicitly sets:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"resolvePackageJsonExports": false
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
TypeScript may fall back to physical path resolution and fail with:
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
TS2307: Cannot find module 'dphelper/<tool>'
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Keep:
|
|
227
|
+
|
|
228
|
+
```json
|
|
229
|
+
"resolvePackageJsonExports": true
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
or use the physical module path when required:
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
import { sanitize } from "dphelper/modules/sanitize";
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
This is a TypeScript resolution issue. Modern bundlers such as Vite resolve the package through the `exports` map at build/runtime.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## The Capability Model
|
|
243
|
+
|
|
244
|
+
`dphelper` is organized around three architectural principles.
|
|
245
|
+
|
|
246
|
+
### Stateless
|
|
247
|
+
|
|
248
|
+
`dphelper` does not own application state.
|
|
249
|
+
|
|
250
|
+
Its capabilities perform operations without becoming the authoritative store for application data.
|
|
251
|
+
|
|
252
|
+
### Modular
|
|
253
|
+
|
|
254
|
+
Each capability is independently addressable.
|
|
255
|
+
|
|
256
|
+
```text
|
|
257
|
+
dphelper/<capability>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
This makes the system easier to compose, test and tree-shake.
|
|
261
|
+
|
|
262
|
+
### Consistent
|
|
263
|
+
|
|
264
|
+
Capabilities follow a common namespace model:
|
|
265
|
+
|
|
266
|
+
```text
|
|
267
|
+
dphelper.<domain>.<operation>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
For example:
|
|
271
|
+
|
|
272
|
+
```text
|
|
273
|
+
dphelper.ai.toon()
|
|
274
|
+
dphelper.security.ulid()
|
|
275
|
+
dphelper.i18n.t()
|
|
276
|
+
dphelper.worker.create()
|
|
277
|
+
dphelper.sync.pulse()
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
This consistency is intended to make capabilities easier to discover, integrate and reason about.
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## AI Power User Guide
|
|
285
|
+
|
|
286
|
+
The `dphelper.ai` module provides utilities for modern AI applications, including LLM, RAG and vector-oriented workflows.
|
|
287
|
+
|
|
288
|
+
### TOON
|
|
289
|
+
|
|
290
|
+
Generate a compact structured representation suitable for LLM prompts:
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
const toonData = dphelper.ai.toon(myJsonObject);
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Context-Aware Token Counting
|
|
297
|
+
|
|
298
|
+
```javascript
|
|
299
|
+
const tokens = dphelper.ai.tokenCount(myJsonObject);
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Token estimation can take the resulting representation into account rather than treating the original object as the only representation.
|
|
303
|
+
|
|
304
|
+
### RAG-Oriented Chunking
|
|
305
|
+
|
|
306
|
+
```javascript
|
|
307
|
+
const chunks = dphelper.ai.chunker(longText, {
|
|
308
|
+
size: 1000,
|
|
309
|
+
overlap: 200
|
|
310
|
+
});
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Semantic Similarity
|
|
314
|
+
|
|
315
|
+
```javascript
|
|
316
|
+
const score = dphelper.ai.similarity(
|
|
317
|
+
embeddingA,
|
|
318
|
+
embeddingB
|
|
319
|
+
);
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Reasoning Extraction
|
|
323
|
+
|
|
324
|
+
```javascript
|
|
325
|
+
const { reasoning, content } =
|
|
326
|
+
dphelper.ai.extractReasoning(rawAiReply);
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Designed to process model responses that expose separate reasoning/content representations.
|
|
330
|
+
|
|
331
|
+
### AI Runtime Snapshot
|
|
332
|
+
|
|
333
|
+
```javascript
|
|
334
|
+
const appStateToon = dphelper.ai.snapshot();
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
The snapshot capability generates a compact runtime representation intended for AI-assisted inspection, debugging and recovery.
|
|
338
|
+
|
|
339
|
+
Depending on the application environment, this can include information such as:
|
|
340
|
+
|
|
341
|
+
* URL
|
|
342
|
+
* runtime/global state
|
|
343
|
+
* application logs
|
|
344
|
+
* relevant runtime context
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Modular Architecture
|
|
349
|
+
|
|
350
|
+
Every tool in `dphelper` is maintained as a self-contained module.
|
|
351
|
+
|
|
352
|
+
The build system:
|
|
353
|
+
|
|
354
|
+
1. Scans the `tools/` directory.
|
|
355
|
+
2. Generates module entry points.
|
|
356
|
+
3. Generates dynamic imports for the core.
|
|
357
|
+
4. Synchronizes TypeScript interfaces.
|
|
358
|
+
5. Keeps the public API aligned with the available tools.
|
|
359
|
+
|
|
360
|
+
This makes the module system extensible without requiring a manually maintained central registry.
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Web Worker Module
|
|
365
|
+
|
|
366
|
+
`dphelper.worker` provides worker creation, inline workers, worker pools and SharedWorker support.
|
|
367
|
+
|
|
368
|
+
### Worker
|
|
369
|
+
|
|
370
|
+
```javascript
|
|
371
|
+
const worker = dphelper.worker.create("worker.js", {
|
|
372
|
+
onmessage: (e) => console.log(e.data)
|
|
373
|
+
});
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Inline Worker
|
|
377
|
+
|
|
378
|
+
```javascript
|
|
379
|
+
const inlineWorker = dphelper.worker.createInline(`
|
|
380
|
+
self.onmessage = e => postMessage(e.data * 2);
|
|
381
|
+
`);
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Worker Pool
|
|
385
|
+
|
|
386
|
+
```javascript
|
|
387
|
+
const pool = dphelper.worker.pool("worker.js", 4);
|
|
388
|
+
|
|
389
|
+
const results = await dphelper.worker.poolExec(
|
|
390
|
+
pool,
|
|
391
|
+
[1, 2, 3, 4]
|
|
392
|
+
);
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### SharedWorker
|
|
396
|
+
|
|
397
|
+
```javascript
|
|
398
|
+
const shared = dphelper.worker.shared(
|
|
399
|
+
"worker.js",
|
|
400
|
+
{ name: "my-shared" }
|
|
401
|
+
);
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## UI Mirror & Auto-Recovery
|
|
407
|
+
|
|
408
|
+
`dphelper` provides browser capabilities designed to make web applications behave more like persistent desktop applications.
|
|
409
|
+
|
|
410
|
+
### Auto-Recovery
|
|
411
|
+
|
|
412
|
+
Persist useful UI context across reloads and crashes:
|
|
413
|
+
|
|
414
|
+
```javascript
|
|
415
|
+
dphelper.UI.anchorContext();
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### Cross-Tab Event Bus
|
|
419
|
+
|
|
420
|
+
Use `BroadcastChannel`-based synchronization without requiring a backend:
|
|
421
|
+
|
|
422
|
+
```javascript
|
|
423
|
+
const bus = dphelper.sync.pulse(
|
|
424
|
+
"my-app",
|
|
425
|
+
(msg) => {
|
|
426
|
+
console.debug(
|
|
427
|
+
"Received from another tab:",
|
|
428
|
+
msg
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
bus.emit({
|
|
434
|
+
action: "theme-change",
|
|
435
|
+
value: "dark"
|
|
436
|
+
});
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### Browser Interlock
|
|
440
|
+
|
|
441
|
+
Monitor the number of active application tabs:
|
|
442
|
+
|
|
443
|
+
```javascript
|
|
444
|
+
dphelper.browser.interlock((count) => {
|
|
445
|
+
console.debug(`Active tabs: ${count}`);
|
|
446
|
+
});
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
### Server-Sent Events
|
|
450
|
+
|
|
451
|
+
```javascript
|
|
452
|
+
const stream = dphelper.sse.open("/api/ai", {
|
|
453
|
+
method: "POST",
|
|
454
|
+
headers: {
|
|
455
|
+
"Authorization": "Bearer ..."
|
|
456
|
+
},
|
|
457
|
+
body: JSON.stringify({
|
|
458
|
+
prompt: "Hello AI"
|
|
459
|
+
})
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
stream.on("message", (data) => {
|
|
463
|
+
console.debug("Chunk:", data);
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
stream.on("error", (err) => {
|
|
467
|
+
console.error("Stream failure:", err);
|
|
468
|
+
});
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
## Browser Extension
|
|
474
|
+
|
|
475
|
+
The **dphelper Manager** browser extension provides tools for managing the `dphelper` environment, monitoring memory usage and accessing documentation.
|
|
476
|
+
|
|
477
|
+
* [Chrome Web Store](https://chrome.google.com/webstore/detail/dphelper-manager-dev-tool/oppppldaoknfddeikfloonnialijngbk)
|
|
478
|
+
* [Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/dphelper-manager-dev-to/kphabkbdpaljlfagldhojilhfammepnk)
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## Environment Compatibility
|
|
483
|
+
|
|
484
|
+
Tools are classified according to their execution target.
|
|
485
|
+
|
|
486
|
+
| Type | Description |
|
|
487
|
+
| ----------------- | ------------------------------------------------------------------------------------- |
|
|
488
|
+
| 🌐 **Client** | Browser-only capabilities requiring DOM, `window`, `navigator` or other browser APIs. |
|
|
489
|
+
| 🖥️ **Server** | Node.js, Bun or Deno capabilities requiring server-side APIs. |
|
|
490
|
+
| 🧬 **Isomorphic** | Capabilities designed to work across browser and server environments. |
|
|
491
|
+
|
|
492
|
+
### Core Module Status
|
|
493
|
+
|
|
494
|
+
| Module | Environment |
|
|
495
|
+
| ----------------- | --------------------------- |
|
|
496
|
+
| `dphelper.ai` | 🧬 Isomorphic |
|
|
497
|
+
| `dphelper.fetch` | 🧬 Isomorphic — Node.js 18+ |
|
|
498
|
+
| `dphelper.sse` | 🌐 Client |
|
|
499
|
+
| `dphelper.socket` | 🌐 Client |
|
|
500
|
+
| `dphelper.sync` | 🌐 Client |
|
|
501
|
+
| `dphelper.UI` | 🌐 Client |
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
## Security
|
|
506
|
+
|
|
507
|
+
Security-sensitive functionality should be evaluated according to the application's own threat model and deployment requirements.
|
|
508
|
+
|
|
509
|
+
### Cryptography
|
|
510
|
+
|
|
511
|
+
`dphelper` uses established cryptographic primitives including:
|
|
512
|
+
|
|
513
|
+
* **AES-256-GCM**
|
|
514
|
+
* **SHA-256**
|
|
515
|
+
* **PBKDF2**
|
|
516
|
+
* **310,000 PBKDF2 iterations** where applicable
|
|
517
|
+
|
|
518
|
+
These choices are intended to align with widely recognized security guidance; they should not be interpreted as a blanket certification or compliance claim for every application using the library.
|
|
519
|
+
|
|
520
|
+
### Network Security
|
|
521
|
+
|
|
522
|
+
Networking capabilities include:
|
|
523
|
+
|
|
524
|
+
* HTTPS for `fetch` and SSE where required by the application
|
|
525
|
+
* `wss://` for secure WebSocket connections
|
|
526
|
+
* URL validation capabilities
|
|
527
|
+
|
|
528
|
+
> [!IMPORTANT]
|
|
529
|
+
> **Library users remain responsible for input validation.**
|
|
530
|
+
>
|
|
531
|
+
> Always validate and sanitize externally supplied URLs before passing them to networking capabilities.
|
|
532
|
+
|
|
533
|
+
```javascript
|
|
534
|
+
const safeUrl = dphelper.sanitize.url(userInput);
|
|
535
|
+
|
|
536
|
+
await dphelper.fetch.get(safeUrl);
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
Avoid:
|
|
540
|
+
|
|
541
|
+
```javascript
|
|
542
|
+
await dphelper.fetch.get(userInput);
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Web Workers
|
|
546
|
+
|
|
547
|
+
Worker APIs execute supplied scripts in the Worker context and therefore require trusted input.
|
|
548
|
+
|
|
549
|
+
Do not pass untrusted user-controlled code directly to:
|
|
550
|
+
|
|
551
|
+
```javascript
|
|
552
|
+
dphelper.worker.createInline(code);
|
|
553
|
+
dphelper.worker.create(src);
|
|
554
|
+
dphelper.worker.pool(src);
|
|
555
|
+
dphelper.worker.importScripts(worker, scripts);
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
For example:
|
|
559
|
+
|
|
560
|
+
```javascript
|
|
561
|
+
// Trusted static worker
|
|
562
|
+
dphelper.worker.create("./my-trusted-worker.js");
|
|
563
|
+
|
|
564
|
+
// Trusted external resource
|
|
565
|
+
dphelper.worker.importScripts(
|
|
566
|
+
worker,
|
|
567
|
+
["https://cdn.example.com/lib.js"]
|
|
568
|
+
);
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
Never treat user-supplied code or URLs as trusted merely because they are passed through a library API.
|
|
572
|
+
|
|
573
|
+
### Security Testing
|
|
574
|
+
|
|
575
|
+
The project uses automated security scanning as part of its development workflow.
|
|
576
|
+
|
|
577
|
+
---
|
|
578
|
+
|
|
579
|
+
## State Architecture
|
|
580
|
+
|
|
581
|
+
`dphelper` is intentionally **stateless**.
|
|
582
|
+
|
|
583
|
+
Application state management is separated into dedicated libraries to keep capability execution independent from application state.
|
|
584
|
+
|
|
585
|
+
### Architecture
|
|
586
|
+
|
|
587
|
+
| Layer | Package | Operational Target | Design Philosophy |
|
|
588
|
+
| ---------------------------------- | ----------- | --------------------------- | ----------------------------------------------- |
|
|
589
|
+
| **Stateless Utilities & AI Tools** | `dphelper` | Browser, Node.js, Bun, Deno | Zero-dependency universal capability layer |
|
|
590
|
+
| **Simple Global State** | `memorio` | Application runtime | Lightweight global state management |
|
|
591
|
+
| **Enterprise State Architecture** | `Argis RGS` | Distributed / complex SaaS | Reactive state and complex data synchronization |
|
|
592
|
+
|
|
593
|
+
### Why separate state?
|
|
594
|
+
|
|
595
|
+
Keeping application state outside `dphelper` provides a clear separation between:
|
|
596
|
+
|
|
597
|
+
```text
|
|
598
|
+
CAPABILITIES
|
|
599
|
+
│
|
|
600
|
+
▼
|
|
601
|
+
dphelper
|
|
602
|
+
│
|
|
603
|
+
│ stateless operations
|
|
604
|
+
▼
|
|
605
|
+
APPLICATION
|
|
606
|
+
│
|
|
607
|
+
▼
|
|
608
|
+
STATE
|
|
609
|
+
│
|
|
610
|
+
┌───┴────┐
|
|
611
|
+
▼ ▼
|
|
612
|
+
Memorio RGS
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
This avoids coupling utility execution to application-specific state ownership.
|
|
616
|
+
|
|
617
|
+
### Integration Guidance
|
|
618
|
+
|
|
619
|
+
Do not rely on legacy state APIs such as:
|
|
620
|
+
|
|
621
|
+
```text
|
|
622
|
+
dphelper.store
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
Migrate state management to the appropriate dedicated state system.
|
|
626
|
+
|
|
627
|
+
For cross-tab communication, `dphelper.sync` can provide the transport/event mechanism while a dedicated state manager remains responsible for application state.
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
## License
|
|
632
|
+
|
|
633
|
+
MIT License
|
|
634
|
+
|
|
635
|
+
## Credits
|
|
636
|
+
|
|
637
|
+
Copyright (c) [Dario Passariello](https://dario.passariello.ca/)
|