@plyaz/core 1.10.1 → 1.11.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/dist/base/observability/DatadogAdapter.d.ts.map +1 -1
- package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -1
- package/dist/domain/featureFlags/module.d.ts.map +1 -1
- package/dist/domain/files/BackendFilesDomainService.d.ts +10 -13
- package/dist/domain/files/BackendFilesDomainService.d.ts.map +1 -1
- package/dist/entry-backend.js +382 -200
- package/dist/entry-backend.js.map +1 -1
- package/dist/entry-backend.mjs +280 -98
- package/dist/entry-backend.mjs.map +1 -1
- package/dist/entry-frontend-browser.js +122 -35
- package/dist/entry-frontend-browser.js.map +1 -1
- package/dist/entry-frontend-browser.mjs +123 -33
- package/dist/entry-frontend-browser.mjs.map +1 -1
- package/dist/entry-frontend.js +122 -35
- package/dist/entry-frontend.js.map +1 -1
- package/dist/entry-frontend.mjs +123 -33
- package/dist/entry-frontend.mjs.map +1 -1
- package/dist/frontend/providers/PlyazProvider.d.ts +1 -3
- package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -1
- package/dist/index.js +1339 -1134
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1290 -1085
- package/dist/index.mjs.map +1 -1
- package/dist/init/CoreInitializer.d.ts +31 -1
- package/dist/init/CoreInitializer.d.ts.map +1 -1
- package/dist/init/nestjs/index.js +126 -14
- package/dist/init/nestjs/index.js.map +1 -1
- package/dist/init/nestjs/index.mjs +127 -15
- package/dist/init/nestjs/index.mjs.map +1 -1
- package/dist/services/DbService.d.ts +12 -0
- package/dist/services/DbService.d.ts.map +1 -1
- package/dist/services/NotificationService.d.ts +8 -0
- package/dist/services/NotificationService.d.ts.map +1 -1
- package/dist/services/StorageService.d.ts +8 -0
- package/dist/services/StorageService.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -7,7 +7,7 @@ import { generateRequestId, CorePackageError, BaseError, initializeErrorSystem,
|
|
|
7
7
|
import { ERROR_CODES as ERROR_CODES$1, ERROR_CATEGORY as ERROR_CATEGORY$1, DATABASE_ERROR_CODES } from '@plyaz/types/errors';
|
|
8
8
|
import { OBSERVABILITY_METRICS } from '@plyaz/types/observability';
|
|
9
9
|
import { clearEventEmitter, setEventEmitter, initializeGlobalErrorHandler } from '@plyaz/errors/middleware';
|
|
10
|
-
import { STORE_KEYS,
|
|
10
|
+
import { STORE_KEYS, createStandaloneFeatureFlagStore } from '@plyaz/store';
|
|
11
11
|
import { CORE_EVENTS as CORE_EVENTS$1 } from '@plyaz/types/core';
|
|
12
12
|
import { createDatabaseService } from '@plyaz/db';
|
|
13
13
|
|
|
@@ -969,7 +969,7 @@ var LoggerAdapter = class extends BaseAdapter {
|
|
|
969
969
|
let status = "unset";
|
|
970
970
|
let statusMessage;
|
|
971
971
|
const logSpans = this.logSpans;
|
|
972
|
-
const
|
|
972
|
+
const logger3 = this.observabilityLogger;
|
|
973
973
|
return {
|
|
974
974
|
context,
|
|
975
975
|
setAttribute: /* @__PURE__ */ __name((key, value) => {
|
|
@@ -981,7 +981,7 @@ var LoggerAdapter = class extends BaseAdapter {
|
|
|
981
981
|
addEvent: /* @__PURE__ */ __name((event) => {
|
|
982
982
|
events.push(event);
|
|
983
983
|
if (logSpans) {
|
|
984
|
-
|
|
984
|
+
logger3.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {
|
|
985
985
|
traceId: context.traceId,
|
|
986
986
|
spanId: context.spanId,
|
|
987
987
|
eventAttributes: event.attributes
|
|
@@ -996,7 +996,7 @@ var LoggerAdapter = class extends BaseAdapter {
|
|
|
996
996
|
const duration = (endTime ?? Date.now()) - startTime;
|
|
997
997
|
if (logSpans) {
|
|
998
998
|
const logMethod = status === "error" ? "warn" : "debug";
|
|
999
|
-
|
|
999
|
+
logger3[logMethod](`[SPAN END] ${options.name}`, {
|
|
1000
1000
|
traceId: context.traceId,
|
|
1001
1001
|
spanId: context.spanId,
|
|
1002
1002
|
durationMs: duration,
|
|
@@ -1009,7 +1009,7 @@ var LoggerAdapter = class extends BaseAdapter {
|
|
|
1009
1009
|
}, "end"),
|
|
1010
1010
|
recordException: /* @__PURE__ */ __name((error) => {
|
|
1011
1011
|
if (logSpans) {
|
|
1012
|
-
|
|
1012
|
+
logger3.error(`[SPAN ERROR] ${options.name}`, {
|
|
1013
1013
|
traceId: context.traceId,
|
|
1014
1014
|
spanId: context.spanId,
|
|
1015
1015
|
error: error.message,
|
|
@@ -2500,6 +2500,24 @@ var Core = class _Core {
|
|
|
2500
2500
|
*/
|
|
2501
2501
|
this._rootStore = null;
|
|
2502
2502
|
}
|
|
2503
|
+
static {
|
|
2504
|
+
/**
|
|
2505
|
+
* Injected store hook for frontend (set via setRootStoreHook before initialize).
|
|
2506
|
+
* This is used instead of directly importing from @plyaz/store to prevent
|
|
2507
|
+
* duplicate store instances when bundlers create multiple module copies.
|
|
2508
|
+
*/
|
|
2509
|
+
this._injectedStoreHook = null;
|
|
2510
|
+
}
|
|
2511
|
+
/**
|
|
2512
|
+
* Set the root store hook for frontend use.
|
|
2513
|
+
* Must be called before Core.initialize() when running in browser.
|
|
2514
|
+
* PlyazProvider calls this automatically with the store prop.
|
|
2515
|
+
*
|
|
2516
|
+
* @param store - The useRootStore hook from @plyaz/store
|
|
2517
|
+
*/
|
|
2518
|
+
static setRootStoreHook(store) {
|
|
2519
|
+
_Core._injectedStoreHook = store;
|
|
2520
|
+
}
|
|
2503
2521
|
/**
|
|
2504
2522
|
* Setup environment and context
|
|
2505
2523
|
*/
|
|
@@ -3410,8 +3428,14 @@ var Core = class _Core {
|
|
|
3410
3428
|
static async initializeRootStore(config, verbose) {
|
|
3411
3429
|
const isFrontend = typeof window !== "undefined";
|
|
3412
3430
|
if (isFrontend) {
|
|
3413
|
-
_Core.
|
|
3414
|
-
|
|
3431
|
+
if (!_Core._injectedStoreHook) {
|
|
3432
|
+
throw new CorePackageError(
|
|
3433
|
+
"Root store hook not set. Call Core.setRootStoreHook(useRootStore) before Core.initialize(), or use PlyazProvider with the store prop: <PlyazProvider store={useRootStore} ...>",
|
|
3434
|
+
ERROR_CODES.CLIENT_INITIALIZATION_FAILED
|
|
3435
|
+
);
|
|
3436
|
+
}
|
|
3437
|
+
_Core.log("Using frontend root store (Zustand) - injected via setRootStoreHook", verbose);
|
|
3438
|
+
_Core._rootStore = _Core._injectedStoreHook;
|
|
3415
3439
|
} else {
|
|
3416
3440
|
_Core.log("Creating backend composite store (in-memory)", verbose);
|
|
3417
3441
|
const ServerErrorMiddleware = getCoreDependency("ServerErrorMiddleware");
|
|
@@ -3520,26 +3544,76 @@ var Core = class _Core {
|
|
|
3520
3544
|
errorStore,
|
|
3521
3545
|
_Core.buildErrorHandlerConfig(_Core._errorConfig)
|
|
3522
3546
|
);
|
|
3547
|
+
_Core.setupErrorEventSubscription(verbose);
|
|
3548
|
+
_Core.setupErrorStoreSubscription(verbose);
|
|
3549
|
+
_Core.log("Global error handler initialized with CoreEventManager integration", verbose);
|
|
3550
|
+
if (_Core._errorConfig.httpHandler !== false) {
|
|
3551
|
+
await _Core.createHttpErrorHandler(_Core._errorConfig, verbose);
|
|
3552
|
+
}
|
|
3553
|
+
}
|
|
3554
|
+
/**
|
|
3555
|
+
* Log serialized errors with full details.
|
|
3556
|
+
*/
|
|
3557
|
+
static logErrors(errors, prefix = "ErrorStore") {
|
|
3558
|
+
for (const err of errors) {
|
|
3559
|
+
_Core.logger.error(`[${prefix}] ${err.code}: ${err.message}`, {
|
|
3560
|
+
id: err.id,
|
|
3561
|
+
code: err.code,
|
|
3562
|
+
message: err.message,
|
|
3563
|
+
category: err.category,
|
|
3564
|
+
source: err.source,
|
|
3565
|
+
status: err.status,
|
|
3566
|
+
isRetryable: err.isRetryable,
|
|
3567
|
+
context: err.context,
|
|
3568
|
+
timestamp: err.timestamp
|
|
3569
|
+
});
|
|
3570
|
+
}
|
|
3571
|
+
}
|
|
3572
|
+
/**
|
|
3573
|
+
* Setup SYSTEM.ERROR event subscription for error store updates.
|
|
3574
|
+
* Backend: Also logs errors with full details.
|
|
3575
|
+
* Frontend: Only updates store (logging handled by store subscription).
|
|
3576
|
+
*/
|
|
3577
|
+
static setupErrorEventSubscription(verbose) {
|
|
3578
|
+
const isBackend = BACKEND_RUNTIMES.includes(_Core._coreServices.runtime);
|
|
3523
3579
|
const errorEventCleanup = CoreEventManager.on(
|
|
3524
3580
|
CORE_EVENTS$1.SYSTEM.ERROR,
|
|
3525
3581
|
(event) => {
|
|
3526
3582
|
if (!_Core._rootStore) return;
|
|
3527
3583
|
try {
|
|
3528
3584
|
const { errors } = event.data;
|
|
3529
|
-
if (errors
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
}
|
|
3585
|
+
if (!errors || errors.length === 0) return;
|
|
3586
|
+
_Core._rootStore.getState().errors.addErrors(errors);
|
|
3587
|
+
if (isBackend) _Core.logErrors(errors);
|
|
3588
|
+
_Core.log(`Added ${errors.length} error(s) to store`, verbose);
|
|
3533
3589
|
} catch (e) {
|
|
3534
3590
|
_Core.logger.error("Failed to handle error event", { error: e });
|
|
3535
3591
|
}
|
|
3536
3592
|
}
|
|
3537
3593
|
);
|
|
3538
3594
|
_Core._eventCleanupFns.push(errorEventCleanup);
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3595
|
+
}
|
|
3596
|
+
/**
|
|
3597
|
+
* Setup error store subscription for frontend logging.
|
|
3598
|
+
* Logs new errors when they're added to the store.
|
|
3599
|
+
* Only active for non-backend runtimes (browser, nextjs, nuxt, edge).
|
|
3600
|
+
*/
|
|
3601
|
+
static setupErrorStoreSubscription(verbose) {
|
|
3602
|
+
const isFrontend = !BACKEND_RUNTIMES.includes(_Core._coreServices.runtime);
|
|
3603
|
+
if (!isFrontend || !_Core._rootStore) return;
|
|
3604
|
+
let prevErrorCount = 0;
|
|
3605
|
+
const storeUnsubscribe = _Core._rootStore.subscribe((state) => {
|
|
3606
|
+
const currentCount = state.errors.errorCount;
|
|
3607
|
+
if (currentCount <= prevErrorCount) {
|
|
3608
|
+
prevErrorCount = currentCount;
|
|
3609
|
+
return;
|
|
3610
|
+
}
|
|
3611
|
+
const newErrors = state.errors.errors.slice(0, currentCount - prevErrorCount);
|
|
3612
|
+
_Core.logErrors(newErrors, "ErrorStore:FE");
|
|
3613
|
+
prevErrorCount = currentCount;
|
|
3614
|
+
});
|
|
3615
|
+
_Core._eventCleanupFns.push(storeUnsubscribe);
|
|
3616
|
+
_Core.log("Error store subscription initialized for frontend", verbose);
|
|
3543
3617
|
}
|
|
3544
3618
|
/**
|
|
3545
3619
|
* Create HTTP error handler based on detected runtime.
|
|
@@ -3727,6 +3801,7 @@ var Core = class _Core {
|
|
|
3727
3801
|
_Core.log("Feature flags initialized", verbose);
|
|
3728
3802
|
}
|
|
3729
3803
|
};
|
|
3804
|
+
var logger2 = new PackageLogger({ packageName: "core", service: "DbService" });
|
|
3730
3805
|
var DEFAULT_ENCRYPTION_FIELDS = {
|
|
3731
3806
|
// User PII
|
|
3732
3807
|
users: ["password_hash", "phone_number", "date_of_birth"],
|
|
@@ -3820,6 +3895,41 @@ var DbService = class _DbService {
|
|
|
3820
3895
|
};
|
|
3821
3896
|
CoreEventManager.emit(CORE_EVENTS$1.DATABASE.ERROR, payload);
|
|
3822
3897
|
}
|
|
3898
|
+
/**
|
|
3899
|
+
* Creates merged event handlers that wrap user-provided handlers.
|
|
3900
|
+
* Adds Core-level logging and forwards to user handlers.
|
|
3901
|
+
*
|
|
3902
|
+
* Note: Unlike StorageService/NotificationService, DB events don't emit
|
|
3903
|
+
* to CoreEventManager by default (too verbose). User handlers can emit
|
|
3904
|
+
* if needed.
|
|
3905
|
+
*
|
|
3906
|
+
* @param userHandlers - User-provided event handlers from config
|
|
3907
|
+
* @returns Merged handlers with Core logging + user handlers
|
|
3908
|
+
*/
|
|
3909
|
+
static createMergedEventHandlers(userHandlers) {
|
|
3910
|
+
return {
|
|
3911
|
+
...userHandlers,
|
|
3912
|
+
onAfterWrite: /* @__PURE__ */ __name(async (event) => {
|
|
3913
|
+
logger2.debug("Database write completed", {
|
|
3914
|
+
operation: event.operation,
|
|
3915
|
+
table: event.table,
|
|
3916
|
+
duration: event.duration
|
|
3917
|
+
});
|
|
3918
|
+
if (userHandlers?.onAfterWrite) {
|
|
3919
|
+
await userHandlers.onAfterWrite(event);
|
|
3920
|
+
}
|
|
3921
|
+
}, "onAfterWrite"),
|
|
3922
|
+
onAfterRead: /* @__PURE__ */ __name(async (event) => {
|
|
3923
|
+
logger2.debug("Database read completed", {
|
|
3924
|
+
table: event.table,
|
|
3925
|
+
duration: event.duration
|
|
3926
|
+
});
|
|
3927
|
+
if (userHandlers?.onAfterRead) {
|
|
3928
|
+
await userHandlers.onAfterRead(event);
|
|
3929
|
+
}
|
|
3930
|
+
}, "onAfterRead")
|
|
3931
|
+
};
|
|
3932
|
+
}
|
|
3823
3933
|
/**
|
|
3824
3934
|
* Gets the singleton instance of DbService
|
|
3825
3935
|
*
|
|
@@ -4024,6 +4134,8 @@ var DbService = class _DbService {
|
|
|
4024
4134
|
if (cache) dbConfig.cache = cache;
|
|
4025
4135
|
if (audit) dbConfig.audit = audit;
|
|
4026
4136
|
if (encryption) dbConfig.encryption = encryption;
|
|
4137
|
+
const events = _DbService.createMergedEventHandlers(config.events);
|
|
4138
|
+
if (events) dbConfig.events = events;
|
|
4027
4139
|
return dbConfig;
|
|
4028
4140
|
}
|
|
4029
4141
|
/**
|