@happyvertical/smrt-reports 0.51.32 → 0.51.33

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { type SmrtObject } from '@happyvertical/smrt-core';
2
+ import type { DurableJobPayloadSigner } from '@happyvertical/smrt-jobs';
3
+ import { type DatabaseInterface } from '@happyvertical/sql';
4
+ import type { ReportRefreshActionDescriptor } from './adapter.js';
5
+ import type { ReportRefreshExecutionAuthority } from './scheduler.js';
6
+ import type { ReportRefreshMode, ReportRefreshResult, ReportRefreshTrigger } from './types.js';
7
+ type ReportCtor = new (...args: any[]) => SmrtObject;
8
+ export type ReportLifecycleState = 'current' | 'stale' | 'refreshing' | 'lock-skipped' | 'failed';
9
+ export interface ReportLifecycleRun {
10
+ id: string;
11
+ status: 'running' | 'success' | 'failed' | 'skipped';
12
+ mode: ReportRefreshMode;
13
+ trigger: ReportRefreshTrigger;
14
+ startedAt?: string;
15
+ completedAt?: string;
16
+ rowCount: number;
17
+ changedGroupCount: number;
18
+ /** A failed run is safe to retry through the separately permissioned action. */
19
+ mayRetry: boolean;
20
+ }
21
+ /**
22
+ * Transport-neutral report lifecycle state. It deliberately never includes a
23
+ * lock owner, a raw failure message, or tenant fanout identifiers.
24
+ */
25
+ export interface ReportLifecycleSnapshot {
26
+ version: 1;
27
+ state: ReportLifecycleState;
28
+ asOf?: string;
29
+ refreshedAt?: string;
30
+ /** Whether existing materialized rows can remain visible while work changes state. */
31
+ hasUsableRows: boolean;
32
+ mode: ReportRefreshMode;
33
+ run?: ReportLifecycleRun;
34
+ /** A stable, redacted failure signal; raw executor errors stay server-side. */
35
+ failure?: {
36
+ code: 'refresh_failed';
37
+ retryable: true;
38
+ };
39
+ lock: {
40
+ held: boolean;
41
+ expiresAt?: string;
42
+ };
43
+ }
44
+ export interface ReportLifecycleOptions {
45
+ db: DatabaseInterface;
46
+ /** Test seam; production callers use the current clock. */
47
+ now?: Date;
48
+ }
49
+ export interface ReportRefreshJobHandle {
50
+ jobId: string;
51
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
52
+ attempts: number;
53
+ maxAttempts: number;
54
+ /** Bounded polling guidance; this API does not create a second queue. */
55
+ pollAfterMs: number;
56
+ }
57
+ export interface ReportRefreshActionContext {
58
+ phase: 'preview' | 'apply';
59
+ reportClassName: string;
60
+ /** The action always applies to the caller's already-bound tenant scope. */
61
+ tenantScope: 'ambient';
62
+ mode: ReportRefreshMode;
63
+ requiredPermission: string;
64
+ }
65
+ /** Authority and audit stay with the application action host, not reports. */
66
+ export interface ReportRefreshActionHost {
67
+ authorize(context: ReportRefreshActionContext, authority?: ReportRefreshExecutionAuthority): Promise<void> | void;
68
+ audit(context: ReportRefreshActionContext, authority?: ReportRefreshExecutionAuthority): Promise<void> | void;
69
+ /** Capture only a non-secret identity reference for worker-time reauthorization. */
70
+ executionAuthority?(context: ReportRefreshActionContext): ReportRefreshExecutionAuthority | Promise<ReportRefreshExecutionAuthority>;
71
+ /** Server-only signer shared with report worker processes. */
72
+ jobIntegritySigner?(context: ReportRefreshActionContext): DurableJobPayloadSigner | Promise<DurableJobPayloadSigner>;
73
+ }
74
+ export interface PreviewReportRefreshOptions extends ReportLifecycleOptions {
75
+ host: ReportRefreshActionHost;
76
+ mode?: ReportRefreshMode;
77
+ /**
78
+ * Pass `descriptor.refresh.action` when the adapter declares a custom
79
+ * refresh permission, so the displayed and enforced action stay aligned.
80
+ */
81
+ refreshAction?: Pick<ReportRefreshActionDescriptor, 'requiredPermission'>;
82
+ }
83
+ export interface ReportRefreshPreview {
84
+ phase: 'preview';
85
+ lifecycle: ReportLifecycleSnapshot;
86
+ action: ReportRefreshActionContext;
87
+ execution: 'background';
88
+ }
89
+ export interface ApplyReportRefreshOptions extends PreviewReportRefreshOptions {
90
+ jobIntegritySigner?: DurableJobPayloadSigner;
91
+ queue?: string;
92
+ priority?: number;
93
+ timeout?: number;
94
+ maxAttempts?: number;
95
+ tenantJobCap?: number;
96
+ }
97
+ export interface AppliedReportRefresh {
98
+ phase: 'apply';
99
+ job: ReportRefreshJobHandle;
100
+ }
101
+ export interface ReportRefreshOutcome {
102
+ state: 'current' | 'lock-skipped' | 'partial';
103
+ rowCount: number;
104
+ changedGroupCount: number;
105
+ completedScopes: number;
106
+ lockSkippedScopes: number;
107
+ mode: ReportRefreshMode;
108
+ refreshedAt: string;
109
+ runId?: string;
110
+ }
111
+ /**
112
+ * Read only the ambient tenant's report state. The caller cannot supply a
113
+ * tenant selector, which prevents lifecycle lookup from becoming a tenant
114
+ * enumeration surface.
115
+ */
116
+ export declare function getReportLifecycle(reportCtor: ReportCtor, options: ReportLifecycleOptions): Promise<ReportLifecycleSnapshot>;
117
+ /** Preview only declares a separately authorized and audited refresh request. */
118
+ export declare function previewReportRefresh(reportCtor: ReportCtor, options: PreviewReportRefreshOptions): Promise<ReportRefreshPreview>;
119
+ /** Queue a manual refresh only after the action host authorizes and audits it. */
120
+ export declare function applyReportRefresh(reportCtor: ReportCtor, options: ApplyReportRefreshOptions): Promise<AppliedReportRefresh>;
121
+ /** Normalize executor results without exposing the tenant identifiers in a fanout. */
122
+ export declare function reportRefreshOutcome(result: ReportRefreshResult): ReportRefreshOutcome;
123
+ export {};
124
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  "version": "1.0.0",
3
3
  "timestamp": 0,
4
4
  "packageName": "@happyvertical/smrt-reports",
5
- "packageVersion": "0.51.32",
5
+ "packageVersion": "0.51.33",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-reports:SmrtReport": {
8
8
  "name": "smrtreport",
package/dist/refresh.d.ts CHANGED
@@ -1,106 +1,8 @@
1
- import { AggregateFunction } from '@happyvertical/sql';
2
- import { AggregateTimeBucketUnit } from '@happyvertical/sql';
3
- import { DatabaseInterface } from '@happyvertical/sql';
4
- import { SmrtObject } from '@happyvertical/smrt-core';
5
- import { SqlAdapterType } from '@happyvertical/sql';
6
- import { WhereClause } from '@happyvertical/sql';
7
-
8
- export declare function refreshReport(reportCtor: ReportCtor, options?: ReportRefreshOptions): Promise<ReportRefreshResult>;
9
-
10
- declare interface ReportAggregateFieldMetadata {
11
- kind: 'aggregate';
12
- fn: ReportAggregateFn;
13
- column?: string;
14
- distinct?: boolean;
15
- }
16
-
17
- declare type ReportAggregateFn = AggregateFunction;
18
-
19
- declare interface ReportBucketFieldMetadata {
20
- kind: 'bucket';
21
- unit: ReportTimeBucketUnit;
22
- sourceColumn: string;
23
- }
24
-
25
- declare type ReportCtor = new (...args: any[]) => SmrtObject;
26
-
27
- declare interface ReportDefinition {
28
- reportClassName: string;
29
- sourceClassName: string;
30
- sourceTable: string;
31
- fields: ReportFieldDefinition[];
32
- where?: WhereClause;
33
- having?: WhereClause;
34
- refresh?: ReportRefreshConfig;
35
- }
36
-
37
- declare interface ReportFieldDefinition {
38
- fieldName: string;
39
- columnName?: string;
40
- type?: string;
41
- report?: ReportFieldMetadata;
42
- }
43
-
44
- declare type ReportFieldMetadata = ReportGroupFieldMetadata | ReportBucketFieldMetadata | ReportAggregateFieldMetadata;
45
-
46
- declare interface ReportGroupFieldMetadata {
47
- kind: 'group';
48
- sourceColumn?: string;
49
- }
50
-
51
- declare interface ReportRefreshConfig {
52
- mode?: ReportRefreshMode;
53
- schedule?: string;
54
- onChange?: ReportSource[];
55
- /**
56
- * Milliseconds before collection reads trigger a synchronous refresh.
57
- *
58
- * TTL refresh checks add a read-time MAX(refreshedAt) query, and stale reads
59
- * perform the refresh before returning list/get results.
60
- */
61
- ttl?: number;
62
- manual?: boolean;
63
- watermarkColumn?: string;
64
- softDeleteColumn?: string;
65
- fullRebuildSchedule?: string;
66
- tenantFanout?: boolean;
67
- }
68
-
69
- declare type ReportRefreshMode = 'rebuild' | 'incremental';
70
-
71
- declare interface ReportRefreshOptions {
72
- db?: DatabaseInterface;
73
- mode?: ReportRefreshMode;
74
- adapterType?: SqlAdapterType;
75
- trigger?: ReportRefreshTrigger;
76
- tenantId?: string | null;
77
- tenantIds?: string[];
78
- lock?: boolean;
79
- lockTtlMs?: number;
80
- trackRuns?: boolean;
81
- scheduleId?: string;
82
- changedRows?: Record<string, unknown>[];
83
- }
84
-
85
- declare interface ReportRefreshResult {
86
- rowCount: number;
87
- refreshedAt: Date;
88
- mode: ReportRefreshMode;
89
- tenantId?: string | null;
90
- runId?: string;
91
- changedGroupCount?: number;
92
- skipped?: boolean;
93
- tenantResults?: ReportRefreshResult[];
94
- }
95
-
96
- declare type ReportRefreshTrigger = 'manual' | 'schedule' | 'change' | 'ttl' | 'job';
97
-
98
- export declare function reportRowIdentity(row: Record<string, any>, definition: ReportDefinition): string;
99
-
100
- declare type ReportSource = string | (new (...args: any[]) => SmrtObject) | (abstract new (...args: any[]) => SmrtObject);
101
-
102
- export declare function reportSourceClassName(source: ReportSource): string;
103
-
104
- declare type ReportTimeBucketUnit = AggregateTimeBucketUnit;
105
-
106
- export { }
1
+ import { type SmrtObject } from '@happyvertical/smrt-core';
2
+ import type { ReportDefinition, ReportRefreshOptions, ReportRefreshResult, ReportSource } from './types.js';
3
+ type ReportCtor = new (...args: any[]) => SmrtObject;
4
+ export declare function refreshReport(reportCtor: ReportCtor, options?: ReportRefreshOptions): Promise<ReportRefreshResult>;
5
+ export declare function reportRowIdentity(row: Record<string, any>, definition: ReportDefinition): string;
6
+ export declare function reportSourceClassName(source: ReportSource): string;
7
+ export {};
8
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAuB3E,OAAO,KAAK,EAGV,gBAAgB,EAEhB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,KAAK,UAAU,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,CAAC;AAu/BrD,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA8B9B;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,UAAU,EAAE,gBAAgB,GAC3B,MAAM,CAKR;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAElE"}
@@ -0,0 +1,38 @@
1
+ import { SmrtCollection, type SmrtListOptions, SmrtObject, type SmrtObjectOptions, type SmrtSelectedRow, type SmrtSelectField, type SmrtStiReadScope } from '@happyvertical/smrt-core';
2
+ import type { ReportRefreshOptions, ReportRefreshResult } from './types.js';
3
+ export declare class SmrtReport extends SmrtObject {
4
+ static readonly _isReportBase: true;
5
+ refreshedAt: Date | null;
6
+ constructor(options?: SmrtObjectOptions);
7
+ isStale(ttlMs?: number): boolean;
8
+ refresh(options?: Omit<ReportRefreshOptions, 'db'>): Promise<ReportRefreshResult>;
9
+ }
10
+ export declare class SmrtReportCollection<ModelType extends SmrtReport> extends SmrtCollection<ModelType> {
11
+ private refreshIfStale;
12
+ refresh(options?: Omit<ReportRefreshOptions, 'db'>): Promise<ReportRefreshResult>;
13
+ list<const Select extends readonly SmrtSelectField<ModelType>[]>(options: Omit<SmrtListOptions<ModelType>, 'select' | 'stiScope'> & {
14
+ select: Select;
15
+ include?: never;
16
+ stiScope: SmrtStiReadScope;
17
+ }): Promise<Record<string, unknown>[]>;
18
+ list<const Select extends readonly SmrtSelectField<ModelType>[]>(options: Omit<SmrtListOptions<ModelType>, 'select' | 'stiScope'> & {
19
+ select: Select;
20
+ include?: never;
21
+ stiScope?: undefined;
22
+ }): Promise<SmrtSelectedRow<ModelType, Select>[]>;
23
+ list(options: Omit<SmrtListOptions<ModelType>, 'select' | 'stiScope'> & {
24
+ select?: undefined;
25
+ stiScope: SmrtStiReadScope;
26
+ }): Promise<SmrtObject[]>;
27
+ list(options?: undefined): Promise<ModelType[]>;
28
+ list(options: Omit<SmrtListOptions<ModelType>, 'select' | 'stiScope'> & {
29
+ select?: undefined;
30
+ stiScope?: undefined;
31
+ }): Promise<ModelType[]>;
32
+ list(options: (Omit<SmrtListOptions<ModelType>, 'select'> & {
33
+ select?: undefined;
34
+ }) | undefined): Promise<SmrtObject[]>;
35
+ list(options: SmrtListOptions<ModelType> | undefined): Promise<SmrtObject[] | Record<string, unknown>[]>;
36
+ get(filter: Parameters<SmrtCollection<ModelType>['get']>[0], options?: Parameters<SmrtCollection<ModelType>['get']>[1]): Promise<ModelType | null>;
37
+ }
38
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -1,164 +1,136 @@
1
- import { DatabaseInterface } from '@happyvertical/sql';
2
- import { DurableJobPayloadIntegrity } from '@happyvertical/smrt-jobs';
3
- import { DurableJobPayloadSigner } from '@happyvertical/smrt-jobs';
4
- import { EventEmitter } from 'node:events';
5
- import { JobExecutionContext } from '@happyvertical/smrt-jobs';
6
- import { SmrtJob } from '@happyvertical/smrt-jobs';
7
- import { SmrtObject } from '@happyvertical/smrt-core';
8
- import { SqlAdapterType } from '@happyvertical/sql';
9
-
10
- export declare function enqueueReportRefresh(options: EnqueueReportRefreshOptions): Promise<SmrtJob>;
11
-
12
- export declare interface EnqueueReportRefreshOptions extends ReportRefreshJobArgs {
13
- report?: ReportCtor;
14
- reportClass: string;
15
- db: DatabaseInterface;
16
- queue?: string;
17
- priority?: number;
18
- timeout?: number;
19
- maxAttempts?: number;
20
- tenantJobCap?: number;
21
- /** Server-only signer; register the same key in every worker process. */
22
- integritySigner?: DurableJobPayloadSigner;
23
- }
24
-
25
- export declare function ensureReportRefreshSchedules(options: EnsureReportSchedulesOptions): Promise<void>;
26
-
27
- export declare interface EnsureReportSchedulesOptions {
28
- db: DatabaseInterface;
29
- reports: ReportCtor[];
30
- tenantIds?: string[];
31
- queue?: string;
32
- priority?: number;
33
- timeout?: number;
34
- }
35
-
36
- export declare function registerReportRefreshExecutionAuthorityHost(hostId: string, host: ReportRefreshExecutionAuthorityHost): () => void;
37
-
38
- export declare function registerReportRefreshInterceptor(options: ReportRefreshInterceptorOptions): () => boolean;
39
-
40
- export declare function registerReportRefreshJobIntegritySigner(signer: DurableJobPayloadSigner): () => void;
41
-
42
- declare type ReportCtor = new (...args: any[]) => SmrtObject;
43
-
44
- export declare interface ReportExecutionPrincipalReference {
45
- version: 1;
46
- actorUserId: string;
47
- tenantId: string | null;
48
- onBehalfOfUserId?: string | null;
49
- actsAsProfileId?: string | null;
50
- agentClass?: string | null;
51
- }
52
-
53
- export declare interface ReportRefreshExecutionAuditEvent extends ReportRefreshExecutionAuthorityContext {
54
- outcome: 'allowed' | 'denied';
55
- principal: ReportExecutionPrincipalReference;
56
- reason?: string;
57
- }
58
-
59
- export declare interface ReportRefreshExecutionAuthority {
60
- version: 1;
61
- hostId: string;
62
- principal: ReportExecutionPrincipalReference;
63
- }
64
-
65
- export declare interface ReportRefreshExecutionAuthorityContext {
66
- phase: 'execute';
67
- reportClass: string;
68
- mode: ReportRefreshMode;
69
- trigger: ReportRefreshTrigger;
70
- tenantId: string | null;
71
- }
72
-
73
- export declare interface ReportRefreshExecutionAuthorityHost {
74
- authorize(principal: Readonly<ReportExecutionPrincipalReference>, context: Readonly<ReportRefreshExecutionAuthorityContext>): Promise<void> | void;
75
- audit(event: Readonly<ReportRefreshExecutionAuditEvent>): Promise<void> | void;
76
- }
77
-
78
- export declare interface ReportRefreshInterceptorOptions {
79
- db: DatabaseInterface;
80
- reports: ReportCtor[];
81
- enqueue?: boolean;
82
- queue?: string;
83
- priority?: number;
84
- timeout?: number;
85
- tenantJobCap?: number;
86
- name?: string;
87
- integritySigner?: DurableJobPayloadSigner;
88
- }
89
-
90
- export declare interface ReportRefreshJobArgs {
91
- reportClass?: string;
92
- mode?: ReportRefreshMode;
93
- trigger?: ReportRefreshTrigger;
94
- tenantId?: string | null;
95
- tenantIds?: string[];
96
- scheduleId?: string;
97
- adapterType?: SqlAdapterType;
98
- changedRows?: Record<string, unknown>[];
99
- _scheduleId?: string;
100
- executionAuthority?: ReportRefreshExecutionAuthority;
101
- integrity?: DurableJobPayloadIntegrity;
102
- }
103
-
104
- declare type ReportRefreshMode = 'rebuild' | 'incremental';
105
-
106
- declare type ReportRefreshTrigger = 'manual' | 'schedule' | 'change' | 'ttl' | 'job';
107
-
108
- export declare interface ReportScheduleInfo {
109
- id: string;
110
- reportClass: string;
111
- tenantId: string | null;
112
- cron: string;
113
- mode: ReportRefreshMode;
114
- }
115
-
116
- export declare class ReportScheduleRunner extends EventEmitter {
117
- readonly id: string;
118
- private readonly config;
119
- private db;
120
- private running;
121
- private pollTimer;
122
- constructor(config?: ReportScheduleRunnerConfig);
123
- initialize(db: DatabaseInterface): Promise<void>;
124
- start(): Promise<void>;
125
- stop(): Promise<void>;
126
- isRunning(): boolean;
127
- handleJobCompletion(scheduleId: string, success: boolean, errorMessage?: string): Promise<void>;
128
- private startPolling;
129
- poll(): Promise<void>;
130
- private triggerSchedule;
131
- }
132
-
133
- export declare interface ReportScheduleRunnerConfig {
134
- id?: string;
135
- pollInterval?: number;
136
- batchSize?: number;
137
- integritySigner?: DurableJobPayloadSigner;
138
- }
139
-
140
- export declare interface ReportScheduleRunnerEvents {
141
- 'schedule:triggered': (schedule: ReportScheduleInfo) => void;
142
- 'schedule:error': (schedule: ReportScheduleInfo, error: Error) => void;
143
- 'schedule:completed': (scheduleId: string) => void;
144
- 'schedule:failed': (scheduleId: string, error: string) => void;
145
- 'runner:started': () => void;
146
- 'runner:stopped': () => void;
147
- 'runner:error': (error: Error) => void;
148
- }
149
-
150
- /** Worker target whose authority requirement cannot be downgraded by job args. */
151
- export declare class SmrtPrincipalReportRefreshTask extends SmrtReportRefreshTask {
152
- run(args?: ReportRefreshJobArgs, context?: JobExecutionContext): Promise<unknown>;
153
- }
154
-
155
- export declare class SmrtReportRefreshTask extends SmrtObject {
156
- tenantId: string | null;
157
- reportClass: string;
158
- mode: ReportRefreshMode;
159
- trigger: ReportRefreshTrigger;
160
- args: ReportRefreshJobArgs;
161
- run(args?: ReportRefreshJobArgs, context?: JobExecutionContext): Promise<unknown>;
162
- }
163
-
164
- export { }
1
+ import { EventEmitter } from 'node:events';
2
+ import { SmrtObject } from '@happyvertical/smrt-core';
3
+ import { type DurableJobPayloadIntegrity, type DurableJobPayloadSigner, type JobExecutionContext, type SmrtJob } from '@happyvertical/smrt-jobs';
4
+ import type { DatabaseInterface, SqlAdapterType } from '@happyvertical/sql';
5
+ import type { ReportRefreshMode, ReportRefreshTrigger } from './types.js';
6
+ type ReportCtor = new (...args: any[]) => SmrtObject;
7
+ export interface ReportRefreshJobArgs {
8
+ reportClass?: string;
9
+ mode?: ReportRefreshMode;
10
+ trigger?: ReportRefreshTrigger;
11
+ tenantId?: string | null;
12
+ tenantIds?: string[];
13
+ scheduleId?: string;
14
+ adapterType?: SqlAdapterType;
15
+ changedRows?: Record<string, unknown>[];
16
+ _scheduleId?: string;
17
+ executionAuthority?: ReportRefreshExecutionAuthority;
18
+ integrity?: DurableJobPayloadIntegrity;
19
+ }
20
+ export interface ReportExecutionPrincipalReference {
21
+ version: 1;
22
+ actorUserId: string;
23
+ tenantId: string | null;
24
+ onBehalfOfUserId?: string | null;
25
+ actsAsProfileId?: string | null;
26
+ agentClass?: string | null;
27
+ }
28
+ export interface ReportRefreshExecutionAuthority {
29
+ version: 1;
30
+ hostId: string;
31
+ principal: ReportExecutionPrincipalReference;
32
+ }
33
+ export interface ReportRefreshExecutionAuthorityContext {
34
+ phase: 'execute';
35
+ reportClass: string;
36
+ mode: ReportRefreshMode;
37
+ trigger: ReportRefreshTrigger;
38
+ tenantId: string | null;
39
+ }
40
+ export interface ReportRefreshExecutionAuditEvent extends ReportRefreshExecutionAuthorityContext {
41
+ outcome: 'allowed' | 'denied';
42
+ principal: ReportExecutionPrincipalReference;
43
+ reason?: string;
44
+ }
45
+ export interface ReportRefreshExecutionAuthorityHost {
46
+ authorize(principal: Readonly<ReportExecutionPrincipalReference>, context: Readonly<ReportRefreshExecutionAuthorityContext>): Promise<void> | void;
47
+ audit(event: Readonly<ReportRefreshExecutionAuditEvent>): Promise<void> | void;
48
+ }
49
+ export interface EnqueueReportRefreshOptions extends ReportRefreshJobArgs {
50
+ report?: ReportCtor;
51
+ reportClass: string;
52
+ db: DatabaseInterface;
53
+ queue?: string;
54
+ priority?: number;
55
+ timeout?: number;
56
+ maxAttempts?: number;
57
+ tenantJobCap?: number;
58
+ /** Server-only signer; register the same key in every worker process. */
59
+ integritySigner?: DurableJobPayloadSigner;
60
+ }
61
+ export interface EnsureReportSchedulesOptions {
62
+ db: DatabaseInterface;
63
+ reports: ReportCtor[];
64
+ tenantIds?: string[];
65
+ queue?: string;
66
+ priority?: number;
67
+ timeout?: number;
68
+ }
69
+ export interface ReportScheduleRunnerConfig {
70
+ id?: string;
71
+ pollInterval?: number;
72
+ batchSize?: number;
73
+ integritySigner?: DurableJobPayloadSigner;
74
+ }
75
+ export interface ReportScheduleInfo {
76
+ id: string;
77
+ reportClass: string;
78
+ tenantId: string | null;
79
+ cron: string;
80
+ mode: ReportRefreshMode;
81
+ }
82
+ export interface ReportScheduleRunnerEvents {
83
+ 'schedule:triggered': (schedule: ReportScheduleInfo) => void;
84
+ 'schedule:error': (schedule: ReportScheduleInfo, error: Error) => void;
85
+ 'schedule:completed': (scheduleId: string) => void;
86
+ 'schedule:failed': (scheduleId: string, error: string) => void;
87
+ 'runner:started': () => void;
88
+ 'runner:stopped': () => void;
89
+ 'runner:error': (error: Error) => void;
90
+ }
91
+ export interface ReportRefreshInterceptorOptions {
92
+ db: DatabaseInterface;
93
+ reports: ReportCtor[];
94
+ enqueue?: boolean;
95
+ queue?: string;
96
+ priority?: number;
97
+ timeout?: number;
98
+ tenantJobCap?: number;
99
+ name?: string;
100
+ integritySigner?: DurableJobPayloadSigner;
101
+ }
102
+ export declare function registerReportRefreshJobIntegritySigner(signer: DurableJobPayloadSigner): () => void;
103
+ export declare function registerReportRefreshExecutionAuthorityHost(hostId: string, host: ReportRefreshExecutionAuthorityHost): () => void;
104
+ export declare class SmrtReportRefreshTask extends SmrtObject {
105
+ tenantId: string | null;
106
+ reportClass: string;
107
+ mode: ReportRefreshMode;
108
+ trigger: ReportRefreshTrigger;
109
+ args: ReportRefreshJobArgs;
110
+ run(args?: ReportRefreshJobArgs, context?: JobExecutionContext): Promise<unknown>;
111
+ }
112
+ /** Worker target whose authority requirement cannot be downgraded by job args. */
113
+ export declare class SmrtPrincipalReportRefreshTask extends SmrtReportRefreshTask {
114
+ run(args?: ReportRefreshJobArgs, context?: JobExecutionContext): Promise<unknown>;
115
+ }
116
+ export declare function enqueueReportRefresh(options: EnqueueReportRefreshOptions): Promise<SmrtJob>;
117
+ export declare function ensureReportRefreshSchedules(options: EnsureReportSchedulesOptions): Promise<void>;
118
+ export declare class ReportScheduleRunner extends EventEmitter {
119
+ readonly id: string;
120
+ private readonly config;
121
+ private db;
122
+ private running;
123
+ private pollTimer;
124
+ constructor(config?: ReportScheduleRunnerConfig);
125
+ initialize(db: DatabaseInterface): Promise<void>;
126
+ start(): Promise<void>;
127
+ stop(): Promise<void>;
128
+ isRunning(): boolean;
129
+ handleJobCompletion(scheduleId: string, success: boolean, errorMessage?: string): Promise<void>;
130
+ private startPolling;
131
+ poll(): Promise<void>;
132
+ private triggerSchedule;
133
+ }
134
+ export declare function registerReportRefreshInterceptor(options: ReportRefreshInterceptorOptions): () => boolean;
135
+ export {};
136
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}