@zintrust/trace 2.0.0 → 2.0.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/README.md +24 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -0
- package/dist/register.js +9 -1
- package/dist/runtime/BackgroundTaskScheduler.d.ts +38 -0
- package/dist/runtime/BackgroundTaskScheduler.js +105 -0
- package/dist/types.d.ts +2 -0
- package/dist/watchers/ExceptionWatcher.js +10 -2
- package/dist/watchers/HttpClientWatcher.js +10 -2
- package/dist/watchers/HttpWatcher.js +11 -3
- package/dist/watchers/LogWatcher.js +7 -2
- package/dist/watchers/QueryWatcher.js +10 -2
- package/package.json +2 -2
- package/dist/build-manifest.json +0 -441
package/README.md
CHANGED
|
@@ -91,6 +91,30 @@ import serviceManifest from './bootstrap/service-manifest';
|
|
|
91
91
|
ProjectRuntime.set({ serviceManifest });
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
#### Cloudflare Workers waitUntil Support
|
|
95
|
+
|
|
96
|
+
For reliable trace persistence in Cloudflare Workers, set the execution context in your Worker fetch handler:
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
// src/worker.ts or your Worker entrypoint
|
|
100
|
+
import { BackgroundTaskScheduler } from '@zintrust/trace';
|
|
101
|
+
|
|
102
|
+
export default {
|
|
103
|
+
async fetch(request, env, ctx) {
|
|
104
|
+
// Enable reliable trace persistence via ctx.waitUntil()
|
|
105
|
+
BackgroundTaskScheduler.setExecutionContext(ctx);
|
|
106
|
+
|
|
107
|
+
// Initialize and run your ZinTrust app
|
|
108
|
+
const app = createApp();
|
|
109
|
+
await app.boot();
|
|
110
|
+
|
|
111
|
+
return app.handle(request);
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
This ensures trace writes complete reliably even after the HTTP response is sent. Without this, trace writes may be lost in Workers environments. See [docs/WORKER_WAITUNTIL_SUPPORT.md](./docs/WORKER_WAITUNTIL_SUPPORT.md) for details.
|
|
117
|
+
|
|
94
118
|
Why this is the preferred path:
|
|
95
119
|
|
|
96
120
|
- The plugin files are the framework-owned opt-in point that ZinTrust already auto-loads during boot.
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export type { ITraceStorage } from './storage';
|
|
|
11
11
|
export { TraceContentBudget } from './storage/TraceContentBudget';
|
|
12
12
|
export { TraceContentRedaction } from './storage/TraceContentRedaction';
|
|
13
13
|
export { TraceContext } from './context';
|
|
14
|
+
export { BackgroundTaskScheduler } from './runtime/BackgroundTaskScheduler';
|
|
14
15
|
export { registerTraceDashboard, registerTraceRoutes } from './dashboard/routes';
|
|
15
16
|
export type { TraceDashboardOptions, TraceDashboardRegistrationOptions } from './dashboard/routes';
|
|
16
17
|
export { registerTraceIngestGateway, TraceIngestGateway } from './ingest/TraceIngestGateway';
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,10 @@ export { TraceContentRedaction } from './storage/TraceContentRedaction.js';
|
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
22
|
export { TraceContext } from './context.js';
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
|
+
// Runtime
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export { BackgroundTaskScheduler } from './runtime/BackgroundTaskScheduler.js';
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
24
28
|
// Dashboard
|
|
25
29
|
// ---------------------------------------------------------------------------
|
|
26
30
|
export { registerTraceDashboard, registerTraceRoutes } from './dashboard/routes.js';
|
package/dist/register.js
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import { TraceConfig } from './config.js';
|
|
23
23
|
import { TraceContext } from './context.js';
|
|
24
|
+
import { BackgroundTaskScheduler } from './runtime/BackgroundTaskScheduler.js';
|
|
24
25
|
import { ProxyTraceStorage, TraceServiceTag, TraceStorage } from './storage/index.js';
|
|
25
26
|
import { TraceContentBudget } from './storage/TraceContentBudget.js';
|
|
26
27
|
import { TraceContentRedaction } from './storage/TraceContentRedaction.js';
|
|
@@ -319,7 +320,14 @@ const createTraceWatcherArgs = async (core, Env, config) => {
|
|
|
319
320
|
connectionName: resolvedConnectionName,
|
|
320
321
|
logger: core.Logger,
|
|
321
322
|
});
|
|
322
|
-
return {
|
|
323
|
+
return {
|
|
324
|
+
storage,
|
|
325
|
+
config,
|
|
326
|
+
db: observedDb,
|
|
327
|
+
scheduleBackgroundTask: (task) => {
|
|
328
|
+
BackgroundTaskScheduler.schedule(task);
|
|
329
|
+
},
|
|
330
|
+
};
|
|
323
331
|
};
|
|
324
332
|
const registerTraceWatchers = async (watcherArgs) => {
|
|
325
333
|
const [{ HttpWatcher }, { QueryWatcher }, { LogWatcher }, { ExceptionWatcher }, { JobWatcher }, { CacheWatcher }, { ScheduleWatcher }, { MailWatcher }, { AuthWatcher }, { EventWatcher }, { ModelWatcher }, { NotificationWatcher }, { RedisWatcher }, { GateWatcher }, { MiddlewareWatcher }, { CommandWatcher }, { BatchWatcher }, { DumpWatcher }, { ViewWatcher }, { HttpClientWatcher },] = await Promise.all([
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BackgroundTaskScheduler — runtime-agnostic background task scheduling.
|
|
3
|
+
* Maps to ctx.waitUntil() in Cloudflare Workers, normal promises in Node.
|
|
4
|
+
*/
|
|
5
|
+
type ExecutionContext = {
|
|
6
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
7
|
+
};
|
|
8
|
+
type BackgroundTaskScheduler = {
|
|
9
|
+
schedule(task: Promise<void>): void;
|
|
10
|
+
isAvailable(): boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare const BackgroundTaskScheduler: Readonly<{
|
|
13
|
+
/**
|
|
14
|
+
* Set the Worker execution context for waitUntil support.
|
|
15
|
+
* Call this from your Cloudflare Worker fetch handler:
|
|
16
|
+
* BackgroundTaskScheduler.setExecutionContext(ctx);
|
|
17
|
+
*/
|
|
18
|
+
setExecutionContext(ctx: ExecutionContext): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get the current scheduler instance.
|
|
21
|
+
*/
|
|
22
|
+
getScheduler(): BackgroundTaskScheduler;
|
|
23
|
+
/**
|
|
24
|
+
* Schedule a background task.
|
|
25
|
+
* In Workers: uses ctx.waitUntil() if context is set
|
|
26
|
+
* In Node: fire-and-forget with error suppression
|
|
27
|
+
*/
|
|
28
|
+
schedule(task: Promise<void>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a proper scheduler is available (i.e., Workers context is set).
|
|
31
|
+
*/
|
|
32
|
+
isAvailable(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Reset the scheduler (useful for testing).
|
|
35
|
+
*/
|
|
36
|
+
reset(): void;
|
|
37
|
+
}>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BackgroundTaskScheduler — runtime-agnostic background task scheduling.
|
|
3
|
+
* Maps to ctx.waitUntil() in Cloudflare Workers, normal promises in Node.
|
|
4
|
+
*/
|
|
5
|
+
let _executionContext;
|
|
6
|
+
let _scheduler;
|
|
7
|
+
const isCloudflareRuntime = () => {
|
|
8
|
+
const globalRef = typeof globalThis === 'undefined' ? undefined : globalThis;
|
|
9
|
+
if (!globalRef)
|
|
10
|
+
return false;
|
|
11
|
+
// @ts-ignore - navigator is available in workers
|
|
12
|
+
if (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return (typeof globalRef.caches !== 'undefined' ||
|
|
16
|
+
typeof globalRef.WebSocketPair === 'function' ||
|
|
17
|
+
typeof globalRef.CF !== 'undefined');
|
|
18
|
+
};
|
|
19
|
+
const createWorkerScheduler = (ctx) => {
|
|
20
|
+
return Object.freeze({
|
|
21
|
+
schedule(task) {
|
|
22
|
+
ctx.waitUntil(task);
|
|
23
|
+
},
|
|
24
|
+
isAvailable() {
|
|
25
|
+
return true;
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
const createNodeScheduler = () => {
|
|
30
|
+
return Object.freeze({
|
|
31
|
+
schedule(task) {
|
|
32
|
+
// In Node, fire-and-forget is acceptable since the process doesn't terminate
|
|
33
|
+
// like Workers do. We still catch errors to prevent unhandled rejections.
|
|
34
|
+
task.catch(() => {
|
|
35
|
+
// Silently ignore background task errors to avoid noise
|
|
36
|
+
// The individual watchers handle their own error logging
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
isAvailable() {
|
|
40
|
+
return true;
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const createFallbackScheduler = () => {
|
|
45
|
+
return Object.freeze({
|
|
46
|
+
schedule(task) {
|
|
47
|
+
// Fallback: fire-and-forget with error suppression
|
|
48
|
+
task.catch(() => undefined);
|
|
49
|
+
},
|
|
50
|
+
isAvailable() {
|
|
51
|
+
return false;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
export const BackgroundTaskScheduler = Object.freeze({
|
|
56
|
+
/**
|
|
57
|
+
* Set the Worker execution context for waitUntil support.
|
|
58
|
+
* Call this from your Cloudflare Worker fetch handler:
|
|
59
|
+
* BackgroundTaskScheduler.setExecutionContext(ctx);
|
|
60
|
+
*/
|
|
61
|
+
setExecutionContext(ctx) {
|
|
62
|
+
_executionContext = ctx;
|
|
63
|
+
_scheduler = createWorkerScheduler(ctx);
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* Get the current scheduler instance.
|
|
67
|
+
*/
|
|
68
|
+
getScheduler() {
|
|
69
|
+
if (_scheduler)
|
|
70
|
+
return _scheduler;
|
|
71
|
+
if (_executionContext) {
|
|
72
|
+
_scheduler = createWorkerScheduler(_executionContext);
|
|
73
|
+
return _scheduler;
|
|
74
|
+
}
|
|
75
|
+
if (isCloudflareRuntime()) {
|
|
76
|
+
// We're in Workers but no context was set - use fallback
|
|
77
|
+
_scheduler = createFallbackScheduler();
|
|
78
|
+
return _scheduler;
|
|
79
|
+
}
|
|
80
|
+
// Node.js or other runtime
|
|
81
|
+
_scheduler = createNodeScheduler();
|
|
82
|
+
return _scheduler;
|
|
83
|
+
},
|
|
84
|
+
/**
|
|
85
|
+
* Schedule a background task.
|
|
86
|
+
* In Workers: uses ctx.waitUntil() if context is set
|
|
87
|
+
* In Node: fire-and-forget with error suppression
|
|
88
|
+
*/
|
|
89
|
+
schedule(task) {
|
|
90
|
+
this.getScheduler().schedule(task);
|
|
91
|
+
},
|
|
92
|
+
/**
|
|
93
|
+
* Check if a proper scheduler is available (i.e., Workers context is set).
|
|
94
|
+
*/
|
|
95
|
+
isAvailable() {
|
|
96
|
+
return this.getScheduler().isAvailable();
|
|
97
|
+
},
|
|
98
|
+
/**
|
|
99
|
+
* Reset the scheduler (useful for testing).
|
|
100
|
+
*/
|
|
101
|
+
reset() {
|
|
102
|
+
_executionContext = undefined;
|
|
103
|
+
_scheduler = undefined;
|
|
104
|
+
},
|
|
105
|
+
});
|
package/dist/types.d.ts
CHANGED
|
@@ -272,6 +272,8 @@ export interface ITraceWatcherConfig {
|
|
|
272
272
|
db?: IDatabase;
|
|
273
273
|
/** Optional: provide to allow HttpWatcher to register as global middleware. */
|
|
274
274
|
registerMiddleware?: (fn: (req: unknown, res: unknown, next: () => Promise<void>) => Promise<void>) => void;
|
|
275
|
+
/** Optional: schedule a background task (maps to ctx.waitUntil in Workers, normal promise in Node). */
|
|
276
|
+
scheduleBackgroundTask?: (task: Promise<void>) => void;
|
|
275
277
|
}
|
|
276
278
|
export interface ITraceWatcher {
|
|
277
279
|
register(opts: ITraceWatcherConfig): () => void;
|
|
@@ -35,6 +35,7 @@ const buildContent = (err, context) => {
|
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
37
|
let _storage = null;
|
|
38
|
+
let _scheduleBackgroundTask = null;
|
|
38
39
|
let _listenerRefCount = 0;
|
|
39
40
|
let _ignoreRoutes = [];
|
|
40
41
|
let _ignorePaths = [];
|
|
@@ -72,7 +73,7 @@ const captureException = (err, context) => {
|
|
|
72
73
|
const content = buildContent(err, context);
|
|
73
74
|
const hash = familyHash(`${content.class}:${content.file}:${content.line}`);
|
|
74
75
|
const uuid = crypto.randomUUID();
|
|
75
|
-
storage
|
|
76
|
+
const writePromise = storage
|
|
76
77
|
.writeEntry({
|
|
77
78
|
uuid,
|
|
78
79
|
batchId: context?.batchId ?? TraceContext.getBatchId(),
|
|
@@ -85,13 +86,19 @@ const captureException = (err, context) => {
|
|
|
85
86
|
})
|
|
86
87
|
.then(() => storage.markFamilyStale(hash, uuid))
|
|
87
88
|
.catch(() => undefined);
|
|
89
|
+
// Use background task scheduler if available (Workers waitUntil support)
|
|
90
|
+
if (_scheduleBackgroundTask) {
|
|
91
|
+
_scheduleBackgroundTask(writePromise);
|
|
92
|
+
}
|
|
93
|
+
// Otherwise, the promise is already fire-and-forget with error suppression
|
|
88
94
|
};
|
|
89
95
|
export const ExceptionWatcher = Object.freeze({
|
|
90
96
|
capture: captureException,
|
|
91
|
-
register({ storage, config }) {
|
|
97
|
+
register({ storage, config, scheduleBackgroundTask }) {
|
|
92
98
|
if (config.watchers.exception === false)
|
|
93
99
|
return () => undefined;
|
|
94
100
|
_storage = storage;
|
|
101
|
+
_scheduleBackgroundTask = scheduleBackgroundTask ?? null;
|
|
95
102
|
_ignoreRoutes = config.ignoreRoutes;
|
|
96
103
|
_ignorePaths = config.ignorePaths;
|
|
97
104
|
if (_listenerRefCount === 0) {
|
|
@@ -104,6 +111,7 @@ export const ExceptionWatcher = Object.freeze({
|
|
|
104
111
|
unregisterProcessListeners();
|
|
105
112
|
}
|
|
106
113
|
_storage = null;
|
|
114
|
+
_scheduleBackgroundTask = null;
|
|
107
115
|
_ignoreRoutes = [];
|
|
108
116
|
_ignorePaths = [];
|
|
109
117
|
};
|
|
@@ -4,6 +4,7 @@ import { AuthTag } from '../utils/authTag.js';
|
|
|
4
4
|
import { redactHeaders, redactUnknown } from '../utils/redact.js';
|
|
5
5
|
import { RequestFilter } from '../utils/requestFilter.js';
|
|
6
6
|
let _storage = null;
|
|
7
|
+
let _scheduleBackgroundTask = null;
|
|
7
8
|
let _redactHeaderNames = [];
|
|
8
9
|
let _redactBodyFields = [];
|
|
9
10
|
let _ignoreRoutes = [];
|
|
@@ -126,7 +127,7 @@ const emit = ({ source, method, url, requestHeaders, responseStatus, duration, r
|
|
|
126
127
|
responseBody,
|
|
127
128
|
error,
|
|
128
129
|
}, sourceRule, normalizedSource);
|
|
129
|
-
_storage
|
|
130
|
+
const writePromise = _storage
|
|
130
131
|
.writeEntry({
|
|
131
132
|
uuid: crypto.randomUUID(),
|
|
132
133
|
batchId: TraceContext.getBatchId(),
|
|
@@ -137,13 +138,19 @@ const emit = ({ source, method, url, requestHeaders, responseStatus, duration, r
|
|
|
137
138
|
createdAt: TraceContext.now(),
|
|
138
139
|
})
|
|
139
140
|
.catch(() => undefined);
|
|
141
|
+
// Use background task scheduler if available (Workers waitUntil support)
|
|
142
|
+
if (_scheduleBackgroundTask) {
|
|
143
|
+
_scheduleBackgroundTask(writePromise);
|
|
144
|
+
}
|
|
145
|
+
// Otherwise, the promise is already fire-and-forget with error suppression
|
|
140
146
|
};
|
|
141
147
|
export const HttpClientWatcher = Object.freeze({
|
|
142
148
|
emit,
|
|
143
|
-
register({ storage, config }) {
|
|
149
|
+
register({ storage, config, scheduleBackgroundTask }) {
|
|
144
150
|
if (!isWatcherEnabled(config.watchers.clientRequest))
|
|
145
151
|
return () => undefined;
|
|
146
152
|
_storage = storage;
|
|
153
|
+
_scheduleBackgroundTask = scheduleBackgroundTask ?? null;
|
|
147
154
|
_clientRequestWatcher =
|
|
148
155
|
typeof config.watchers.clientRequest === 'object' && config.watchers.clientRequest !== null
|
|
149
156
|
? config.watchers.clientRequest
|
|
@@ -154,6 +161,7 @@ export const HttpClientWatcher = Object.freeze({
|
|
|
154
161
|
_ignorePaths = config.ignorePaths;
|
|
155
162
|
return () => {
|
|
156
163
|
_storage = null;
|
|
164
|
+
_scheduleBackgroundTask = null;
|
|
157
165
|
_clientRequestWatcher = undefined;
|
|
158
166
|
_redactBodyFields = [];
|
|
159
167
|
_ignoreRoutes = [];
|
|
@@ -130,7 +130,7 @@ const shouldIgnore = (req, config) => {
|
|
|
130
130
|
};
|
|
131
131
|
const isWatcherEnabled = (config) => config.watchers.request !== false;
|
|
132
132
|
export const HttpWatcher = Object.freeze({
|
|
133
|
-
register({ storage, config, registerMiddleware }) {
|
|
133
|
+
register({ storage, config, registerMiddleware, scheduleBackgroundTask, }) {
|
|
134
134
|
if (!isWatcherEnabled(config))
|
|
135
135
|
return () => undefined;
|
|
136
136
|
if (!registerMiddleware)
|
|
@@ -162,14 +162,22 @@ export const HttpWatcher = Object.freeze({
|
|
|
162
162
|
isLatest: true,
|
|
163
163
|
createdAt: TraceContext.now(),
|
|
164
164
|
};
|
|
165
|
-
storage.writeEntry(entry).catch((error) => {
|
|
165
|
+
const writePromise = storage.writeEntry(entry).catch((error) => {
|
|
166
166
|
Logger.warn('[trace] HttpWatcher writeEntry failed', {
|
|
167
167
|
method: content.method,
|
|
168
168
|
uri: content.uri,
|
|
169
169
|
entryUuid: entry.uuid,
|
|
170
170
|
error: error instanceof Error ? error.message : String(error),
|
|
171
171
|
});
|
|
172
|
-
});
|
|
172
|
+
});
|
|
173
|
+
// Use background task scheduler if available (Workers waitUntil support)
|
|
174
|
+
if (scheduleBackgroundTask) {
|
|
175
|
+
scheduleBackgroundTask(writePromise);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Fallback to fire-and-forget for backward compatibility
|
|
179
|
+
writePromise.catch(() => undefined);
|
|
180
|
+
}
|
|
173
181
|
};
|
|
174
182
|
const completionHandler = registerCompletionHandler(response, persistEntry);
|
|
175
183
|
await next();
|
|
@@ -54,7 +54,7 @@ const shouldSkipTraceInfrastructureLog = (message, context) => {
|
|
|
54
54
|
isTraceStorageQueryLog(message, context));
|
|
55
55
|
};
|
|
56
56
|
export const LogWatcher = Object.freeze({
|
|
57
|
-
register({ storage, config }) {
|
|
57
|
+
register({ storage, config, scheduleBackgroundTask }) {
|
|
58
58
|
if (config.watchers.log === false)
|
|
59
59
|
return () => undefined;
|
|
60
60
|
const minPriority = LEVEL_PRIORITY[config.logMinLevel] ?? 1;
|
|
@@ -75,7 +75,7 @@ export const LogWatcher = Object.freeze({
|
|
|
75
75
|
context: context ?? undefined,
|
|
76
76
|
hostname: TraceContext.getHostname(),
|
|
77
77
|
};
|
|
78
|
-
storage
|
|
78
|
+
const writePromise = storage
|
|
79
79
|
.writeEntry({
|
|
80
80
|
uuid: crypto.randomUUID(),
|
|
81
81
|
batchId: TraceContext.getBatchId(),
|
|
@@ -86,6 +86,11 @@ export const LogWatcher = Object.freeze({
|
|
|
86
86
|
createdAt: TraceContext.now(),
|
|
87
87
|
})
|
|
88
88
|
.catch(() => undefined);
|
|
89
|
+
// Use background task scheduler if available (Workers waitUntil support)
|
|
90
|
+
if (scheduleBackgroundTask) {
|
|
91
|
+
scheduleBackgroundTask(writePromise);
|
|
92
|
+
}
|
|
93
|
+
// Otherwise, the promise is already fire-and-forget with error suppression
|
|
89
94
|
});
|
|
90
95
|
return unsubscribe;
|
|
91
96
|
},
|
|
@@ -7,6 +7,7 @@ import { EntryType } from '../types.js';
|
|
|
7
7
|
import { AuthTag } from '../utils/authTag.js';
|
|
8
8
|
let _storage = null;
|
|
9
9
|
let _config = null;
|
|
10
|
+
let _scheduleBackgroundTask = null;
|
|
10
11
|
const bindingsInterpolated = (sql, params) => {
|
|
11
12
|
// Inline params for display only — safe, not for re-execution.
|
|
12
13
|
let i = 0;
|
|
@@ -51,7 +52,7 @@ const emit = (query, params, duration, connection = 'default') => {
|
|
|
51
52
|
const tags = AuthTag.append([]);
|
|
52
53
|
if (slow)
|
|
53
54
|
tags.push('slow');
|
|
54
|
-
_storage
|
|
55
|
+
const writePromise = _storage
|
|
55
56
|
.writeEntry({
|
|
56
57
|
uuid: crypto.randomUUID(),
|
|
57
58
|
batchId,
|
|
@@ -63,16 +64,22 @@ const emit = (query, params, duration, connection = 'default') => {
|
|
|
63
64
|
createdAt: TraceContext.now(),
|
|
64
65
|
})
|
|
65
66
|
.catch(() => undefined);
|
|
67
|
+
// Use background task scheduler if available (Workers waitUntil support)
|
|
68
|
+
if (_scheduleBackgroundTask) {
|
|
69
|
+
_scheduleBackgroundTask(writePromise);
|
|
70
|
+
}
|
|
71
|
+
// Otherwise, the promise is already fire-and-forget with error suppression
|
|
66
72
|
};
|
|
67
73
|
export const QueryWatcher = Object.freeze({
|
|
68
74
|
emit,
|
|
69
|
-
register({ storage, config, db: injectedDb }) {
|
|
75
|
+
register({ storage, config, db: injectedDb, scheduleBackgroundTask, }) {
|
|
70
76
|
if (config.watchers.query === false)
|
|
71
77
|
return () => undefined;
|
|
72
78
|
if (!injectedDb)
|
|
73
79
|
return () => undefined; // no db available
|
|
74
80
|
_storage = storage;
|
|
75
81
|
_config = config;
|
|
82
|
+
_scheduleBackgroundTask = scheduleBackgroundTask ?? null;
|
|
76
83
|
const db = injectedDb;
|
|
77
84
|
const handler = (query, params, duration) => {
|
|
78
85
|
emit(query, params, duration);
|
|
@@ -81,6 +88,7 @@ export const QueryWatcher = Object.freeze({
|
|
|
81
88
|
return () => {
|
|
82
89
|
_storage = null;
|
|
83
90
|
_config = null;
|
|
91
|
+
_scheduleBackgroundTask = null;
|
|
84
92
|
db.offAfterQuery?.(handler);
|
|
85
93
|
};
|
|
86
94
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zintrust/trace",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Trace assistant for ZinTrust: logs requests, queries, exceptions, jobs, and more.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -55,4 +55,4 @@
|
|
|
55
55
|
"build": "tsc -p tsconfig.json && tsc -p tsconfig.migrations.json && node ../../scripts/fix-dist-esm-imports.mjs dist",
|
|
56
56
|
"prepublishOnly": "npm run build"
|
|
57
57
|
}
|
|
58
|
-
}
|
|
58
|
+
}
|
package/dist/build-manifest.json
DELETED
|
@@ -1,441 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@zintrust/trace",
|
|
3
|
-
"version": "2.0.0",
|
|
4
|
-
"buildDate": "2026-05-20T20:04:23.602Z",
|
|
5
|
-
"buildEnvironment": {
|
|
6
|
-
"node": "v20.20.2",
|
|
7
|
-
"platform": "linux",
|
|
8
|
-
"arch": "x64"
|
|
9
|
-
},
|
|
10
|
-
"git": {
|
|
11
|
-
"commit": "be96835b",
|
|
12
|
-
"branch": "master"
|
|
13
|
-
},
|
|
14
|
-
"package": {
|
|
15
|
-
"engines": {
|
|
16
|
-
"node": ">=20.0.0"
|
|
17
|
-
},
|
|
18
|
-
"dependencies": [],
|
|
19
|
-
"peerDependencies": [
|
|
20
|
-
"@zintrust/core"
|
|
21
|
-
]
|
|
22
|
-
},
|
|
23
|
-
"files": {
|
|
24
|
-
"TraceConnection.d.ts": {
|
|
25
|
-
"size": 1500,
|
|
26
|
-
"sha256": "0748601bebff011a0b3dbab736617d5e3dffe4af671f4b6f7af03012d58e5464"
|
|
27
|
-
},
|
|
28
|
-
"TraceConnection.js": {
|
|
29
|
-
"size": 4640,
|
|
30
|
-
"sha256": "c51cc312046b6b2bbe1673f1ff9508425cc7140a1d2341907f67aa36069c09f9"
|
|
31
|
-
},
|
|
32
|
-
"cli-register.d.ts": {
|
|
33
|
-
"size": 255,
|
|
34
|
-
"sha256": "da8d689fe5ef32e97e755f28017e4d3cb1aa63489073a71907ea41ad5761ede9"
|
|
35
|
-
},
|
|
36
|
-
"cli-register.js": {
|
|
37
|
-
"size": 1123,
|
|
38
|
-
"sha256": "c6de87d0a73df7ac66e18ecdc6f758b2652ec3abe9698e43620cf41135b33e4b"
|
|
39
|
-
},
|
|
40
|
-
"config.d.ts": {
|
|
41
|
-
"size": 470,
|
|
42
|
-
"sha256": "b034cbef0c71fb868071363624ef7a9f8d7acc20f8be8c895dd5db5a75e81f37"
|
|
43
|
-
},
|
|
44
|
-
"config.js": {
|
|
45
|
-
"size": 10503,
|
|
46
|
-
"sha256": "4514e95067194c7afacb1202a8f1caffc64a400dd995cf809301b1a51a67da38"
|
|
47
|
-
},
|
|
48
|
-
"context.d.ts": {
|
|
49
|
-
"size": 596,
|
|
50
|
-
"sha256": "4b8dade537b29dae3942d02c22e535f3b1ba1f0f6142e3a74203d4fa962a412b"
|
|
51
|
-
},
|
|
52
|
-
"context.js": {
|
|
53
|
-
"size": 2520,
|
|
54
|
-
"sha256": "00a82a58e18fb33934f449a9fb379a2f90023570ceed1676eae0aed59b02ddeb"
|
|
55
|
-
},
|
|
56
|
-
"dashboard/handlers.d.ts": {
|
|
57
|
-
"size": 993,
|
|
58
|
-
"sha256": "430f5b294d960e13e2ec39ed5c22f6655f85c46c2de9455c222505c67298ec6a"
|
|
59
|
-
},
|
|
60
|
-
"dashboard/handlers.js": {
|
|
61
|
-
"size": 10011,
|
|
62
|
-
"sha256": "a5f7f3d624a844df27ddc9d4908e73d91a4aac9b2aac1aefff1f391913353897"
|
|
63
|
-
},
|
|
64
|
-
"dashboard/routes.d.ts": {
|
|
65
|
-
"size": 997,
|
|
66
|
-
"sha256": "0ac87bc54e57978e8a9ac5924d248e1f984927bb6c819ea5528ab1179b0b50b8"
|
|
67
|
-
},
|
|
68
|
-
"dashboard/routes.js": {
|
|
69
|
-
"size": 2501,
|
|
70
|
-
"sha256": "06f0bf42214ed7691907443c0a1d5a4d8c3db3ce3f7b8269ba401ff421a54dfd"
|
|
71
|
-
},
|
|
72
|
-
"dashboard/ui.d.ts": {
|
|
73
|
-
"size": 117,
|
|
74
|
-
"sha256": "4862b41e0477f01afa0dbb446d4553b65c22ed774cd1e2db3489059ced392f94"
|
|
75
|
-
},
|
|
76
|
-
"dashboard/ui.js": {
|
|
77
|
-
"size": 84736,
|
|
78
|
-
"sha256": "6a19ca4b079944cf0070633a0694de28d034f78ff2d1f02af00707cd2434751f"
|
|
79
|
-
},
|
|
80
|
-
"index.d.ts": {
|
|
81
|
-
"size": 2693,
|
|
82
|
-
"sha256": "901aaefe88fb2cc1e7771cd541f41ebcfe6443390bd66905eacbda51f1a6f73d"
|
|
83
|
-
},
|
|
84
|
-
"index.js": {
|
|
85
|
-
"size": 3421,
|
|
86
|
-
"sha256": "09fa209693e5195efa6a58f18d869af4fef501a25462bc910ed7cec5c975a6bf"
|
|
87
|
-
},
|
|
88
|
-
"ingest/TraceIngestGateway.d.ts": {
|
|
89
|
-
"size": 786,
|
|
90
|
-
"sha256": "3a0a46fa5bbf5367047214533ec0ee92a171ee35a60d25c197eea1eed1ff0f65"
|
|
91
|
-
},
|
|
92
|
-
"ingest/TraceIngestGateway.js": {
|
|
93
|
-
"size": 10936,
|
|
94
|
-
"sha256": "c95f0e42f1294d8ae2e406a5910f8e74044c2b586e82e726876d75ddfafef27e"
|
|
95
|
-
},
|
|
96
|
-
"migrations/20260331000001_create_zin_trace_entries_table.d.ts": {
|
|
97
|
-
"size": 304,
|
|
98
|
-
"sha256": "7d99b4d7c02855d6e68ad87e39dffff5fec83a406bdf2414665c23ba3ce8711d"
|
|
99
|
-
},
|
|
100
|
-
"migrations/20260331000001_create_zin_trace_entries_table.js": {
|
|
101
|
-
"size": 955,
|
|
102
|
-
"sha256": "6aa54f3a6a95a78714e9b14d7f6adb4e94e9420e4e17ac467b43fef12bbc2583"
|
|
103
|
-
},
|
|
104
|
-
"migrations/20260331000002_create_zin_trace_entries_tags_table.d.ts": {
|
|
105
|
-
"size": 304,
|
|
106
|
-
"sha256": "6d07c135b0fa34acbda2f7f0788e4db657b00ba7c7459e2b203c8ded9c55b9dc"
|
|
107
|
-
},
|
|
108
|
-
"migrations/20260331000002_create_zin_trace_entries_tags_table.js": {
|
|
109
|
-
"size": 737,
|
|
110
|
-
"sha256": "614280fc7f3a5826c3e8334e2a38d707b562217fb68a660aff0d9a6c072f7b2a"
|
|
111
|
-
},
|
|
112
|
-
"migrations/20260331000003_create_zin_trace_monitoring_table.d.ts": {
|
|
113
|
-
"size": 308,
|
|
114
|
-
"sha256": "019e84f70cedf363eaf85a115d935abed841627b4a31d7fa34131352d402187a"
|
|
115
|
-
},
|
|
116
|
-
"migrations/20260331000003_create_zin_trace_monitoring_table.js": {
|
|
117
|
-
"size": 522,
|
|
118
|
-
"sha256": "dd80ea1fdfe6ea7f57330b2dff530d97ee8054081436f41bbf234b814cb1df19"
|
|
119
|
-
},
|
|
120
|
-
"migrations/20260407193000_widen_trace_created_at_for_sql.d.ts": {
|
|
121
|
-
"size": 335,
|
|
122
|
-
"sha256": "6e9c826a08a983927d9e801b2740f58d0cf6fbf7bff02ee5c1fd01227f73b741"
|
|
123
|
-
},
|
|
124
|
-
"migrations/20260407193000_widen_trace_created_at_for_sql.js": {
|
|
125
|
-
"size": 1185,
|
|
126
|
-
"sha256": "1de9d8e4a91ffeaed4a0bc5cf942e428cd76bdb6b65bc67fa76ef62f3c99e94d"
|
|
127
|
-
},
|
|
128
|
-
"migrations/index.d.ts": {
|
|
129
|
-
"size": 280,
|
|
130
|
-
"sha256": "0ba7bc9421754ff489f6947463c13e7e9c80558eb6611a818f3baab3b518a502"
|
|
131
|
-
},
|
|
132
|
-
"migrations/index.js": {
|
|
133
|
-
"size": 500,
|
|
134
|
-
"sha256": "6118c5f4e01ecd73208425253caa3a17e4304ff6f9f00ac7afc18785684e9e85"
|
|
135
|
-
},
|
|
136
|
-
"plugin.d.ts": {
|
|
137
|
-
"size": 16,
|
|
138
|
-
"sha256": "71d366165dd36f1675aa253a76262b226fb6c62e5ab632746b8aea61c0c625fc"
|
|
139
|
-
},
|
|
140
|
-
"plugin.js": {
|
|
141
|
-
"size": 128,
|
|
142
|
-
"sha256": "2d05bec517f57634276220b8a946125059fe0e320c42295b4f5a985431bb3d1c"
|
|
143
|
-
},
|
|
144
|
-
"register.d.ts": {
|
|
145
|
-
"size": 72,
|
|
146
|
-
"sha256": "535869aa1bfcdf0ec26fad27d7f18bb8822bc586c38fcc5ffdde5274ecbea17e"
|
|
147
|
-
},
|
|
148
|
-
"register.js": {
|
|
149
|
-
"size": 19680,
|
|
150
|
-
"sha256": "042a7585e68a8a676e25f33c9a176c6f263bccb4a63090b4d2cea52b9bcdd193"
|
|
151
|
-
},
|
|
152
|
-
"storage/ProxyTraceStorage.d.ts": {
|
|
153
|
-
"size": 339,
|
|
154
|
-
"sha256": "9c724ff342dfe82da12e7cce95593f6623faa80c40f97593719b8e78e95f266d"
|
|
155
|
-
},
|
|
156
|
-
"storage/ProxyTraceStorage.js": {
|
|
157
|
-
"size": 4330,
|
|
158
|
-
"sha256": "672c95ed022504b2e5be62f3c2b31bac168ac06158d793dd020f7e38907e8f64"
|
|
159
|
-
},
|
|
160
|
-
"storage/TraceContentBudget.d.ts": {
|
|
161
|
-
"size": 1306,
|
|
162
|
-
"sha256": "606a37af0a4aef4866c22cc727f67f485c43181b40eb831e1920b8b90fdaf503"
|
|
163
|
-
},
|
|
164
|
-
"storage/TraceContentBudget.js": {
|
|
165
|
-
"size": 11495,
|
|
166
|
-
"sha256": "8ed670773814f7b86b916c43ac43b048defc6a102593d808dfb4c8cf7606edf3"
|
|
167
|
-
},
|
|
168
|
-
"storage/TraceContentRedaction.d.ts": {
|
|
169
|
-
"size": 207,
|
|
170
|
-
"sha256": "2fd7b317c5ee87d8ecaa6467a75959499673ef374fec3ecfaa7911c4f3d5c83c"
|
|
171
|
-
},
|
|
172
|
-
"storage/TraceContentRedaction.js": {
|
|
173
|
-
"size": 1083,
|
|
174
|
-
"sha256": "127aa026f155c47361d3b44021138157cb2743f5e02e044ce6df66cc693cc3cb"
|
|
175
|
-
},
|
|
176
|
-
"storage/TraceEntryFiltering.d.ts": {
|
|
177
|
-
"size": 196,
|
|
178
|
-
"sha256": "a1158cedb4e4e749658127086e138e47886422366a697619d6ea9bd3338066e6"
|
|
179
|
-
},
|
|
180
|
-
"storage/TraceEntryFiltering.js": {
|
|
181
|
-
"size": 1579,
|
|
182
|
-
"sha256": "a096b0fadf21cd692e554e6ca7789f08759cffe1c690845cb33c5876c8587cc5"
|
|
183
|
-
},
|
|
184
|
-
"storage/TraceServiceTag.d.ts": {
|
|
185
|
-
"size": 224,
|
|
186
|
-
"sha256": "35d93c82d6db80071946adaa8e40d012408b469949f1002f85ae3fd20b0a70c8"
|
|
187
|
-
},
|
|
188
|
-
"storage/TraceServiceTag.js": {
|
|
189
|
-
"size": 1916,
|
|
190
|
-
"sha256": "1ddad82563c98ddbb4033e9b8fb31901d635cffa7024d499a896f0d7a6d00900"
|
|
191
|
-
},
|
|
192
|
-
"storage/TraceStorage.d.ts": {
|
|
193
|
-
"size": 517,
|
|
194
|
-
"sha256": "c9c215aaa414f7b0c1fec6c82b054fc52bdf97af58f96f35c7f96672fb859c31"
|
|
195
|
-
},
|
|
196
|
-
"storage/TraceStorage.js": {
|
|
197
|
-
"size": 15322,
|
|
198
|
-
"sha256": "95179a66f0774fb6c1622e7477d6e1420e374116800a6a0c60e14de9bd4c4c5c"
|
|
199
|
-
},
|
|
200
|
-
"storage/TraceWriteDiagnostics.d.ts": {
|
|
201
|
-
"size": 581,
|
|
202
|
-
"sha256": "5f49df97a830ad895653fa4a18b3a1b31ca4a5066d6f8150ee02dca013e16397"
|
|
203
|
-
},
|
|
204
|
-
"storage/TraceWriteDiagnostics.js": {
|
|
205
|
-
"size": 7041,
|
|
206
|
-
"sha256": "6fc34e6e52a9b463db0967dba4aec4c8c706b6978c496f568637ffc15327279a"
|
|
207
|
-
},
|
|
208
|
-
"storage/index.d.ts": {
|
|
209
|
-
"size": 210,
|
|
210
|
-
"sha256": "bb4c3a0c73eb3e2629dd1a1dbc29eecedd1910a37b221357cc7981ced320bdeb"
|
|
211
|
-
},
|
|
212
|
-
"storage/index.js": {
|
|
213
|
-
"size": 166,
|
|
214
|
-
"sha256": "ed5e83e108cd15f9a3976be71e966bdf0c44d8e0266d1d2dbad189f0885ad501"
|
|
215
|
-
},
|
|
216
|
-
"types.d.ts": {
|
|
217
|
-
"size": 10037,
|
|
218
|
-
"sha256": "68a2de953af2fce1a12447078177ff886f10e853c760378e13478b2558648868"
|
|
219
|
-
},
|
|
220
|
-
"types.js": {
|
|
221
|
-
"size": 696,
|
|
222
|
-
"sha256": "1cc1b7f7ff4760e6b4ccd642f6aa2f35453c4f40e6a360c3a525304729407836"
|
|
223
|
-
},
|
|
224
|
-
"ui.d.ts": {
|
|
225
|
-
"size": 382,
|
|
226
|
-
"sha256": "d8b33d77c1c6ccd82e140db83a1bf57edb4d62c03cd15360c2c2d70bd2b392ee"
|
|
227
|
-
},
|
|
228
|
-
"ui.js": {
|
|
229
|
-
"size": 285,
|
|
230
|
-
"sha256": "3a3cef493f0b9789a7198da620fd7e72ea2377fed3eba25572bb0d222155a446"
|
|
231
|
-
},
|
|
232
|
-
"utils/authTag.d.ts": {
|
|
233
|
-
"size": 150,
|
|
234
|
-
"sha256": "db7ed89155df453650ad2805d8cd7069a70b14eacac2d97c4b0bebd45df4bdd4"
|
|
235
|
-
},
|
|
236
|
-
"utils/authTag.js": {
|
|
237
|
-
"size": 534,
|
|
238
|
-
"sha256": "0c506812967c17548162ce0f28d96089b023865883ee8cfd0824a94084580afb"
|
|
239
|
-
},
|
|
240
|
-
"utils/entryFilter.d.ts": {
|
|
241
|
-
"size": 183,
|
|
242
|
-
"sha256": "a7809e98f76b4e326262c26b0e43e278b1c50ac0b35fee145e3e6006357dc700"
|
|
243
|
-
},
|
|
244
|
-
"utils/entryFilter.js": {
|
|
245
|
-
"size": 4123,
|
|
246
|
-
"sha256": "de2690c6e5852969083387b469fd2e12f10470c6eee81120154437cd8d8f3555"
|
|
247
|
-
},
|
|
248
|
-
"utils/familyHash.d.ts": {
|
|
249
|
-
"size": 60,
|
|
250
|
-
"sha256": "c94f85390c52470df6946a39576c720ea92c89797ae62fff913191c45580248f"
|
|
251
|
-
},
|
|
252
|
-
"utils/familyHash.js": {
|
|
253
|
-
"size": 266,
|
|
254
|
-
"sha256": "f60526423e69fa5c461b0f5d8dac90b1f0c18149609cd1109226f1c8d985f223"
|
|
255
|
-
},
|
|
256
|
-
"utils/redact.d.ts": {
|
|
257
|
-
"size": 449,
|
|
258
|
-
"sha256": "b72d01ebac46a984d314905b14de5b05c3f9c27141e460c5305dd16e347f5a13"
|
|
259
|
-
},
|
|
260
|
-
"utils/redact.js": {
|
|
261
|
-
"size": 2646,
|
|
262
|
-
"sha256": "4e82eaa3bb48f9d621b70f69519b0615d992068eb9f836beaf6df6c2382c2cff"
|
|
263
|
-
},
|
|
264
|
-
"utils/requestFilter.d.ts": {
|
|
265
|
-
"size": 398,
|
|
266
|
-
"sha256": "fb214bde16e970c58ac23a32b51def87157a495a89e70ad6a1aa9e28c8c721c4"
|
|
267
|
-
},
|
|
268
|
-
"utils/requestFilter.js": {
|
|
269
|
-
"size": 1947,
|
|
270
|
-
"sha256": "214855796b6dbe524a357355fb7c9c8fd0fa9705d9163f7ad0882f463e0ae5b1"
|
|
271
|
-
},
|
|
272
|
-
"utils/stackFrame.d.ts": {
|
|
273
|
-
"size": 149,
|
|
274
|
-
"sha256": "55008bb0bf16e96c7b4f706fa3aa2d3a5bb3a68d0b8bcbd046d23462a7f620e8"
|
|
275
|
-
},
|
|
276
|
-
"utils/stackFrame.js": {
|
|
277
|
-
"size": 1413,
|
|
278
|
-
"sha256": "ca651d04eaea48a240ec7c5714a0f8f1d92f2fcdaa6e735df0009b56de8c29ed"
|
|
279
|
-
},
|
|
280
|
-
"watchers/AuthWatcher.d.ts": {
|
|
281
|
-
"size": 225,
|
|
282
|
-
"sha256": "b062850fa3edd3d58bb293025b1dfc5491e39807b3ab3e4cc1c1aaa31316a7a3"
|
|
283
|
-
},
|
|
284
|
-
"watchers/AuthWatcher.js": {
|
|
285
|
-
"size": 1437,
|
|
286
|
-
"sha256": "c47cca14113fed3825610c9a5a28a4ef7b99ea238952b3df48a997d63eab6fd2"
|
|
287
|
-
},
|
|
288
|
-
"watchers/BatchWatcher.d.ts": {
|
|
289
|
-
"size": 277,
|
|
290
|
-
"sha256": "b1870a793f2dc7ed22705c8a2a6b6f970fa1bcd0229dbf12f185323b35f3bdcf"
|
|
291
|
-
},
|
|
292
|
-
"watchers/BatchWatcher.js": {
|
|
293
|
-
"size": 1338,
|
|
294
|
-
"sha256": "113a1077d267734335483cdc48bf94e929edb11f5a0f3f83234bd4e7da8bf6ef"
|
|
295
|
-
},
|
|
296
|
-
"watchers/CacheWatcher.d.ts": {
|
|
297
|
-
"size": 314,
|
|
298
|
-
"sha256": "19b5f6fe4f0fc8f3df6762f4f46d36f198c7c7d7da8d3d23e5c8f124462e8cf7"
|
|
299
|
-
},
|
|
300
|
-
"watchers/CacheWatcher.js": {
|
|
301
|
-
"size": 2067,
|
|
302
|
-
"sha256": "8e038d3d72fcd69286674ec06b916389872eaa393dc7bfb8667b0979a68115a4"
|
|
303
|
-
},
|
|
304
|
-
"watchers/CommandWatcher.d.ts": {
|
|
305
|
-
"size": 267,
|
|
306
|
-
"sha256": "f1b3a3253e7265c7b56a74ba674cd23426ea5227a33abb1bde0d941e2a02e894"
|
|
307
|
-
},
|
|
308
|
-
"watchers/CommandWatcher.js": {
|
|
309
|
-
"size": 1553,
|
|
310
|
-
"sha256": "b341c7a0ad2a1d8d6d21e5a14b8151d904194d292c8ef1f3a80cf8d507fc3f2a"
|
|
311
|
-
},
|
|
312
|
-
"watchers/DumpWatcher.d.ts": {
|
|
313
|
-
"size": 308,
|
|
314
|
-
"sha256": "13f81df217258b0827027cbba35b5ad549453fe2709bd4fcc66d845b065500ec"
|
|
315
|
-
},
|
|
316
|
-
"watchers/DumpWatcher.js": {
|
|
317
|
-
"size": 1441,
|
|
318
|
-
"sha256": "36ea2e9a6c73dc96e75d31fd3c2710548ebfd0a651bab0dde185c33d611be079"
|
|
319
|
-
},
|
|
320
|
-
"watchers/EventWatcher.d.ts": {
|
|
321
|
-
"size": 223,
|
|
322
|
-
"sha256": "f5a173b0f92490e417d175011d4191d8eafe9ff75d712adb55cece5368753ef6"
|
|
323
|
-
},
|
|
324
|
-
"watchers/EventWatcher.js": {
|
|
325
|
-
"size": 1299,
|
|
326
|
-
"sha256": "832d5db66433f685eea7a3da208fb226b62eb49c22f94619762962a04e58b122"
|
|
327
|
-
},
|
|
328
|
-
"watchers/ExceptionWatcher.d.ts": {
|
|
329
|
-
"size": 311,
|
|
330
|
-
"sha256": "0f58c50fd77704151399ca6cb6ec7890a9aef86afe28235951971f8cc9c1d600"
|
|
331
|
-
},
|
|
332
|
-
"watchers/ExceptionWatcher.js": {
|
|
333
|
-
"size": 3816,
|
|
334
|
-
"sha256": "52d21188c499fa409fa50691fee3d27ea08ad93b26199d9a42c08e76217d6de2"
|
|
335
|
-
},
|
|
336
|
-
"watchers/GateWatcher.d.ts": {
|
|
337
|
-
"size": 262,
|
|
338
|
-
"sha256": "2fb8699f8679d2442aa322d40fb5cd4bb4e944804bdc6b094a9daf406a407abf"
|
|
339
|
-
},
|
|
340
|
-
"watchers/GateWatcher.js": {
|
|
341
|
-
"size": 1330,
|
|
342
|
-
"sha256": "e3666b5d65ead0ccd3fe7a6d684d3245dda9d3ddd6da393e0afa028585f08679"
|
|
343
|
-
},
|
|
344
|
-
"watchers/HttpClientWatcher.d.ts": {
|
|
345
|
-
"size": 346,
|
|
346
|
-
"sha256": "dfb13bba526d5338e4dcd7a5aa0f72a61a03d9e2f6a250250c0bb8f0054c9712"
|
|
347
|
-
},
|
|
348
|
-
"watchers/HttpClientWatcher.js": {
|
|
349
|
-
"size": 5898,
|
|
350
|
-
"sha256": "320b5a264f26bfeb29ba9246ffa65b79e244db715a4614d69a1425364062d5f9"
|
|
351
|
-
},
|
|
352
|
-
"watchers/HttpWatcher.d.ts": {
|
|
353
|
-
"size": 96,
|
|
354
|
-
"sha256": "ce9a95a670f755193fd74ce721dbfa4b30f20c879a6566ebb35229b3b2435429"
|
|
355
|
-
},
|
|
356
|
-
"watchers/HttpWatcher.js": {
|
|
357
|
-
"size": 6880,
|
|
358
|
-
"sha256": "a69795a885d6b350012bb3be7a93a0a1a6e71070873cd172e3bd672b67b4ac08"
|
|
359
|
-
},
|
|
360
|
-
"watchers/JobWatcher.d.ts": {
|
|
361
|
-
"size": 441,
|
|
362
|
-
"sha256": "097c043678ac6b218096c9b04bc5922fc8ed2a31e9f53abc36f6e0d6f63180f0"
|
|
363
|
-
},
|
|
364
|
-
"watchers/JobWatcher.js": {
|
|
365
|
-
"size": 3317,
|
|
366
|
-
"sha256": "494646d87c71d1fbf069835fcf10c56dec7b449e2fc1b24e0c82d511aba085e4"
|
|
367
|
-
},
|
|
368
|
-
"watchers/LogWatcher.d.ts": {
|
|
369
|
-
"size": 95,
|
|
370
|
-
"sha256": "f3ddc5f8b58c6c86ac6b464dd48e5a55e79ab2bf2e735feacffc7480e4ccc0c4"
|
|
371
|
-
},
|
|
372
|
-
"watchers/LogWatcher.js": {
|
|
373
|
-
"size": 3290,
|
|
374
|
-
"sha256": "0297479465b25f93ab0b11bfd6c2083afe9023fdddaa1b7841d12d68b294fa3e"
|
|
375
|
-
},
|
|
376
|
-
"watchers/MailWatcher.d.ts": {
|
|
377
|
-
"size": 244,
|
|
378
|
-
"sha256": "5031b96ef8e64a6d376576e8cddf1c2560f22432a78f1d2be55f7cea6bff4547"
|
|
379
|
-
},
|
|
380
|
-
"watchers/MailWatcher.js": {
|
|
381
|
-
"size": 1766,
|
|
382
|
-
"sha256": "2b583137bb9800901a7ae70cc1af6e9f8763215f0f05f170af9cfb4556530780"
|
|
383
|
-
},
|
|
384
|
-
"watchers/MiddlewareWatcher.d.ts": {
|
|
385
|
-
"size": 259,
|
|
386
|
-
"sha256": "5a28b472c835bd0f79ec9d3670516544bc5b6da9f1f1bed5159be0cba39304a1"
|
|
387
|
-
},
|
|
388
|
-
"watchers/MiddlewareWatcher.js": {
|
|
389
|
-
"size": 1510,
|
|
390
|
-
"sha256": "4ed2a81d8f7b7984f572d1bea16abd7a40a896de789e668def961e32bb8eea7f"
|
|
391
|
-
},
|
|
392
|
-
"watchers/ModelWatcher.d.ts": {
|
|
393
|
-
"size": 285,
|
|
394
|
-
"sha256": "4c05112af855a92b3f3f97c6b61bf1b07444bcb7d5a17f3e0ae19da4a85faf1c"
|
|
395
|
-
},
|
|
396
|
-
"watchers/ModelWatcher.js": {
|
|
397
|
-
"size": 1492,
|
|
398
|
-
"sha256": "ae4151b422eb73500f981c799e5a261d7349ad36b4be060a56e5ad7944e85cae"
|
|
399
|
-
},
|
|
400
|
-
"watchers/NotificationWatcher.d.ts": {
|
|
401
|
-
"size": 274,
|
|
402
|
-
"sha256": "a1d918122c5db9a7f27fdf78c0c14a61f6e1213748ee6f9b06f976f33589dc33"
|
|
403
|
-
},
|
|
404
|
-
"watchers/NotificationWatcher.js": {
|
|
405
|
-
"size": 1808,
|
|
406
|
-
"sha256": "06bbc437a9e5ec29252e365fa4707e68ae9348b3f755094c14f0e18c99dad3ed"
|
|
407
|
-
},
|
|
408
|
-
"watchers/QueryWatcher.d.ts": {
|
|
409
|
-
"size": 240,
|
|
410
|
-
"sha256": "5d5046c65e5b683369c7709f1acd09b60aec3e7f44748fd1baeb35498836465b"
|
|
411
|
-
},
|
|
412
|
-
"watchers/QueryWatcher.js": {
|
|
413
|
-
"size": 2855,
|
|
414
|
-
"sha256": "dcb9fe2049e71b5fc850286758737d80738a07dd470d96f36e418d4f54e16263"
|
|
415
|
-
},
|
|
416
|
-
"watchers/RedisWatcher.d.ts": {
|
|
417
|
-
"size": 294,
|
|
418
|
-
"sha256": "0a0f0ef387cb02a20cb9a4308a87b48dbfbf1076b7e3090801fef7c9c794ec84"
|
|
419
|
-
},
|
|
420
|
-
"watchers/RedisWatcher.js": {
|
|
421
|
-
"size": 1349,
|
|
422
|
-
"sha256": "bcafbadbbc6caa85284a384efa8894895c077588ebb5fb45f0f966d869caf960"
|
|
423
|
-
},
|
|
424
|
-
"watchers/ScheduleWatcher.d.ts": {
|
|
425
|
-
"size": 291,
|
|
426
|
-
"sha256": "1d049cfc2472876bf11c4d091c2a889b948bfb2ac714da2aed8affd965f311a6"
|
|
427
|
-
},
|
|
428
|
-
"watchers/ScheduleWatcher.js": {
|
|
429
|
-
"size": 1393,
|
|
430
|
-
"sha256": "f653c3728d928b253b7f4fd4e1afd228bedf4ce32c52f107effa99aa026ada45"
|
|
431
|
-
},
|
|
432
|
-
"watchers/ViewWatcher.d.ts": {
|
|
433
|
-
"size": 202,
|
|
434
|
-
"sha256": "980ac30b405d135cd754de1462722147944a37b4f5271ce769afb6b71fa748b1"
|
|
435
|
-
},
|
|
436
|
-
"watchers/ViewWatcher.js": {
|
|
437
|
-
"size": 1180,
|
|
438
|
-
"sha256": "9af344802c5973a020487e261009e8d1a19a74b78ba7b388d33ce50687277c81"
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|