unified-notification-core 0.1.1 → 0.1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,76 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.2
4
+
5
+ - Validate runtime `preferencePolicy` values and dispatch limits before any
6
+ publication, claim, or provider invocation.
7
+ - Validate every caller-provided JSON payload recursively before persistence,
8
+ with an iterative 256-depth/10,000-node budget that rejects cycles,
9
+ unsupported values, accessors, array extras, non-finite numbers, and
10
+ non-plain objects without invoking getters.
11
+ - Keep resolved provider calls truthfully `sent` when optional adapter output is
12
+ invalid: discard the optional result, persist diagnostic error details, and
13
+ never retry the provider for result-shape failures.
14
+ - Isolate retry-delay and logger callbacks from delivery state. Invalid or
15
+ synchronously/asynchronously throwing retry policies and native Promises
16
+ now use the deterministic built-in backoff without unhandled rejections.
17
+ - Cap persisted, logged, and returned delivery diagnostic messages at 10,000
18
+ characters through one non-throwing normalization boundary.
19
+ - Reject every present runtime `channelData` value unless it is a plain own-key
20
+ JSON object; falsy non-objects can no longer bypass validation.
21
+ - Replace per-recipient publication queries with bulk inserts/selects while
22
+ preserving recipient order, channel uniqueness, preferences, custom text
23
+ identifiers, and per-recipient idempotency under concurrent publication.
24
+ - Avoid repeatedly normalizing immutable preference defaults during a batch.
25
+ - Reject PostgreSQL-unsafe NUL and unpaired-surrogate strings in public input
26
+ and JSON keys/values before mutation. Invalid optional adapter output follows
27
+ the existing sent-safe diagnostic path, while valid Unicode pairs are kept.
28
+ - Capture the durable finalization timestamp before provider invocation so an
29
+ application clock callback cannot fail after provider acceptance.
30
+ - Consume exact native logger Promise rejections and time out exact native retry
31
+ Promises after 100 ms with deterministic fallback and late-rejection handling.
32
+ - Validate exact runtime booleans, configured adapter functions, finite integer
33
+ limits, identifiers, dates, and complete preference batches before writes.
34
+ - Reserve JSON child-node capacity immediately after `ownKeys`, before child
35
+ descriptor inspection, so oversized Proxy objects remain bounded.
36
+ - Restrict async logger/retry results to exact same-realm native Node Promises,
37
+ detected with a hook-free brand check and captured intrinsic verification.
38
+ Arbitrary thenables are rejected without reading or invoking `then`.
39
+ - Harden `NotificationDeliveryError` options: only omitted or
40
+ plain/null-prototype records are accepted, a present `retryable` is an exact
41
+ boolean, and code/message strings are bounded and PostgreSQL-safe.
42
+ - Descriptor-capture constructor configuration, public method wrappers, public
43
+ arrays, schema-factory options, and preference-resolver input once before any
44
+ transaction, claim, or provider call, preventing mutable Proxy values from
45
+ changing after validation.
46
+ - Require configuration/API wrappers and channel-keyed maps to be plain or
47
+ null-prototype records, rejecting maps, sets, dates, arrays, functions, class
48
+ instances, accessors, and symbol keys while keeping Drizzle database/schema
49
+ dependencies opaque.
50
+ - Start the monotonic 100 ms retry-policy deadline before invoking application
51
+ code and reject values produced after synchronous policy stalls.
52
+ - Observe genuine logger Promises immediately without awaiting them. Ignore
53
+ invalid logger return values without traversal; synchronous logger callback
54
+ work remains application-owned.
55
+ - Reject Promise subclasses, cross-realm Promises, custom `PromiseLike` values,
56
+ and native Promises with own `then`/`constructor` hooks at runtime. Invalid
57
+ retry results use deterministic fallback.
58
+ - Require exact `Array.prototype` public/JSON arrays with canonical in-range
59
+ indices only; reject subclasses, exotic prototypes, accessors, index
60
+ `4294967295`, and every other extra property before mutation.
61
+ - Convert revoked-Proxy inspection failures, including `Array.isArray`, into
62
+ public `NotificationConfigurationError` values.
63
+ - Capture and bind every retry-isolation intrinsic at module initialization,
64
+ install native deadline settlement before policy invocation, attach accepted
65
+ Promise rejection handling before checking post-callback lateness, and remove
66
+ reliance on mutable public `Promise.race`.
67
+ - Enforce one PostgreSQL-safe `maxAttempts` range of 1 through 2,147,483,647 for
68
+ core defaults, scalar/per-channel publication, requeue, and claim overflow
69
+ guards.
70
+ - Classify native retry Promise lateness inside its actual fulfillment or
71
+ rejection callback using the captured monotonic clock, so event-loop ordering
72
+ cannot let a settlement after 100 ms beat a starved deadline timer.
73
+
3
74
  ## 0.1.1
4
75
 
5
76
  - Made delivery claims unique per row and attempt, with durable attempt counts
package/README.md CHANGED
@@ -150,6 +150,44 @@ const result = await notificationCore.publishAndDispatch({
150
150
  `publish()` only persists. `publishAndDispatch()` persists and immediately
151
151
  attempts due deliveries. Both use the same durable outbox records.
152
152
 
153
+ Publication validates the complete JSON payload before opening its transaction.
154
+ `data`, channel-specific values, and other persisted payload properties must be
155
+ recursive JSON values: cycles, `undefined`, functions, symbols, bigints,
156
+ non-finite numbers, sparse arrays, accessors, and non-plain objects are rejected
157
+ with `NotificationConfigurationError`. TypeScript's `JsonValue` cannot express
158
+ the finite-number restriction, so this is also enforced at runtime. Invalid
159
+ publish input creates no notification or delivery rows.
160
+
161
+ Every persisted public string and JSON key/value must also be PostgreSQL-safe
162
+ UTF-8 text: NUL and unpaired UTF-16 surrogates are rejected, while valid
163
+ surrogate pairs such as emoji remain supported. Optional actor/entity ids must
164
+ be non-empty strings when present. Runtime booleans are exact booleans; truthy
165
+ or falsy substitutes are not accepted.
166
+
167
+ Configuration objects, public method option/input wrappers, and channel-keyed
168
+ maps must be plain or null-prototype records. Maps, Sets, Dates, arrays,
169
+ functions, class instances, symbols, and accessor properties are rejected at
170
+ those record boundaries. UNC captures every accepted field and array element
171
+ through its descriptor into an immutable snapshot before opening a transaction
172
+ or invoking a callback, so caller-side getters and later mutations cannot
173
+ change one operation midway through execution. Drizzle database and schema
174
+ objects are opaque values and are not subjected to the plain-record rule.
175
+ Public arrays must use `Array.prototype` directly and contain only canonical
176
+ indices from zero through `2^32 - 2` below their captured length. Subclasses,
177
+ exotic prototypes, accessors, sparse entries, and all extra properties are
178
+ rejected without invoking getters.
179
+
180
+ Validation is iterative and bounded to 256 nesting levels and 10,000 total JSON
181
+ nodes per checked value. It inspects own property descriptors without invoking
182
+ getters, rejects symbol/non-canonical/extra array properties, and copies accepted
183
+ values through descriptors before persistence. A present `channelData` must be
184
+ a plain own-key JSON object; `null`, `false`, `0`, and empty strings are invalid
185
+ rather than being treated as absence.
186
+
187
+ Recipients and deliveries are inserted and read in bulk. The number of database
188
+ query waves stays constant as recipient/channel count grows, while returned
189
+ recipients preserve first-seen input order and channels remain unique.
190
+
153
191
  A core constructed with a Drizzle `PgTransaction` is publish-only. This lets an
154
192
  application commit its own row and `publish()` atomically. Do not call
155
193
  `publishAndDispatch()` or `dispatchDue()` on that core: both fail before writing
@@ -167,6 +205,11 @@ await notificationCore.dispatchDue({
167
205
  });
168
206
  ```
169
207
 
208
+ `dispatchDue()` accepts `limit` from 1 through 1000 and `concurrency` from 1
209
+ through 100. `publishAndDispatch()` accepts the same concurrency range. Runtime
210
+ values must be finite positive integers; invalid values fail before publishing,
211
+ claiming, or calling a provider.
212
+
170
213
  This can run from a cron handler, queue consumer, scheduled function, or an
171
214
  application-owned interval. The package starts no timer and exposes no port.
172
215
  Concurrent workers claim rows with `FOR UPDATE SKIP LOCKED`; abandoned
@@ -260,6 +303,11 @@ await notificationCore.publish({
260
303
  });
261
304
  ```
262
305
 
306
+ The only accepted runtime policy values are `"respect"` and `"ignore"`.
307
+ Omitting the property defaults to `"respect"`; an explicitly supplied `null`,
308
+ `undefined`, or any other value is a `NotificationConfigurationError` before
309
+ the publication transaction starts.
310
+
263
311
  ## In-app inbox
264
312
 
265
313
  ```ts
@@ -307,6 +355,13 @@ throw new NotificationDeliveryError(
307
355
  );
308
356
  ```
309
357
 
358
+ `NotificationDeliveryError` accepts omitted options or a plain/null-prototype
359
+ options record. If `retryable` is present it must be an exact boolean; only
360
+ omission defaults it to `true`. The code is trimmed, non-empty, PostgreSQL-safe,
361
+ and at most 191 characters. The message is non-empty, PostgreSQL-safe, and at
362
+ most 10,000 characters. Options are descriptor-captured once before the Error
363
+ is constructed.
364
+
310
365
  Unknown errors are retryable. The default backoff is 1 minute, 5 minutes,
311
366
  15 minutes, 1 hour, then 6 hours. Configure `retryDelayMs` and
312
367
  `defaultMaxAttempts` for application policy. A failed delivery can be explicitly
@@ -315,11 +370,67 @@ is claimed, before the adapter runs. `requeueDelivery()` preserves that counter
315
370
  by default and therefore requires remaining attempt capacity; pass a larger
316
371
  `maxAttempts`, or set `resetAttempts: true` to start a new attempt budget.
317
372
  Only a `failed` delivery whose notification is not canceled can be requeued.
373
+ Constructor defaults, scalar or per-channel publish overrides, and requeue
374
+ overrides all accept `maxAttempts` from 1 through 2,147,483,647, matching the
375
+ positive PostgreSQL `integer` range. Larger values fail before a transaction or
376
+ claim, and claim predicates prevent `attempts` from overflowing that range.
377
+
378
+ `retryDelayMs` may return a number or an exact same-realm native Node
379
+ `Promise<number>`. UNC installs the deadline before invoking the policy and
380
+ awaits it inside that boundary for at most 100 ms measured with a trusted
381
+ monotonic clock. Synchronous policy or Promise handling that crosses the
382
+ deadline cannot submit a late value. The resolved value must be finite,
383
+ non-negative, and produce a valid retry timestamp. Synchronous throws,
384
+ asynchronous rejections, never-settling Promises, timeouts, and
385
+ invalid values are consumed and logged before the deterministic built-in
386
+ backoff is used; the provider failure is still durably finalized and never left
387
+ stuck in `processing`. Late policy rejections are consumed. Logger callbacks may
388
+ return `void` or an exact native `Promise<void>`. UNC observes that Promise
389
+ immediately without awaiting it, so rejection is consumed while dispatch remains
390
+ independent. The logger callback itself is synchronous application code and must
391
+ return promptly.
392
+
393
+ The monotonic clock, timer functions, Promise constructor/prototype/`then`,
394
+ Promise brand check, and required Object/Reflect inspection operations are
395
+ captured and bound when the module initializes. Deadline settlement is installed
396
+ before application policy code runs. For an accepted native Promise, rejection
397
+ handling is attached before UNC checks whether synchronous policy work already
398
+ crossed the deadline. Fulfillment and rejection callbacks read the captured
399
+ monotonic clock before settling the deadline, so a timer starved by blocking
400
+ event-loop work cannot admit a value produced after 100 ms. UNC does not depend
401
+ on mutable public `Promise.race`.
402
+
403
+ Arbitrary `PromiseLike` values, custom thenables, cross-realm Promises, Promise
404
+ subclasses, and genuine Promises with own `then`/`constructor` hooks are invalid.
405
+ UNC uses Node's hook-free Promise brand check plus the captured exact native
406
+ prototype/intrinsics and never reads or calls an invalid value's `then` property.
407
+ An invalid retry result uses deterministic fallback; an invalid logger result is
408
+ ignored. The caller remains responsible for any rejected Promise hidden inside
409
+ an invalid object.
318
410
 
319
411
  If a provider callback already has its own durable queue, returning after a
320
412
  successful enqueue is correct. UNC then tracks acceptance by that
321
413
  queue; provider delivery events may be stored in the adapter's own tables.
322
414
 
415
+ After an adapter resolves, provider success is final even if its optional return
416
+ value is malformed. `providerMessageId`, when present, must be a non-empty
417
+ string of at most 10,000 characters. `metadata`, when present, must be a finite
418
+ recursive JSON object under the same rules as publish input. If either field is
419
+ invalid, UNC discards the entire optional adapter result, durably marks the
420
+ delivery `sent`, stores `invalid_adapter_result` diagnostics, and logs the
421
+ problem without invoking the provider again.
422
+
423
+ Optional adapter strings and metadata must obey the same PostgreSQL-safe string
424
+ contract. Invalid NUL or unpaired-surrogate output is discarded through the
425
+ same sent-safe path. UNC captures the finalization timestamp with the claim,
426
+ before calling the provider, so a later failure in an application-supplied
427
+ `now()` callback cannot turn provider acceptance into a resend risk.
428
+
429
+ Diagnostic extraction never invokes error getters, `toString`, or coercion
430
+ hooks. Persisted `errorMessage`, logger context, and returned `DispatchResult`
431
+ share one 10,000-character cap, including malformed adapter-result diagnostics;
432
+ unsafe PostgreSQL characters are replaced before the diagnostic is persisted.
433
+
323
434
  ## Idempotency and scheduling
324
435
 
325
436
  An `idempotencyKey` is unique per recipient. Publishing the same key again
package/dist/core.d.ts CHANGED
@@ -10,7 +10,7 @@ export type NotificationCoreConfig<TChannel extends string, TData extends JsonOb
10
10
  preferenceDefaults?: PreferenceDefaults<TChannel>;
11
11
  defaultPreferenceEnabled?: boolean;
12
12
  defaultMaxAttempts?: number;
13
- retryDelayMs?: (attempt: number, error: unknown) => number;
13
+ retryDelayMs?: (attempt: number, error: unknown) => number | Promise<number>;
14
14
  lockTimeoutMs?: number;
15
15
  now?: () => Date;
16
16
  logger?: NotificationLogger;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}