ai-database 0.0.0-development → 0.2.0
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/.turbo/turbo-build.log +5 -0
- package/.turbo/turbo-test.log +102 -0
- package/README.md +402 -47
- package/TESTING.md +410 -0
- package/TEST_SUMMARY.md +250 -0
- package/TODO.md +128 -0
- package/dist/ai-promise-db.d.ts +370 -0
- package/dist/ai-promise-db.d.ts.map +1 -0
- package/dist/ai-promise-db.js +839 -0
- package/dist/ai-promise-db.js.map +1 -0
- package/dist/authorization.d.ts +531 -0
- package/dist/authorization.d.ts.map +1 -0
- package/dist/authorization.js +632 -0
- package/dist/authorization.js.map +1 -0
- package/dist/durable-clickhouse.d.ts +193 -0
- package/dist/durable-clickhouse.d.ts.map +1 -0
- package/dist/durable-clickhouse.js +422 -0
- package/dist/durable-clickhouse.js.map +1 -0
- package/dist/durable-promise.d.ts +182 -0
- package/dist/durable-promise.d.ts.map +1 -0
- package/dist/durable-promise.js +409 -0
- package/dist/durable-promise.js.map +1 -0
- package/dist/execution-queue.d.ts +239 -0
- package/dist/execution-queue.d.ts.map +1 -0
- package/dist/execution-queue.js +400 -0
- package/dist/execution-queue.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/linguistic.d.ts +115 -0
- package/dist/linguistic.d.ts.map +1 -0
- package/dist/linguistic.js +379 -0
- package/dist/linguistic.js.map +1 -0
- package/dist/memory-provider.d.ts +304 -0
- package/dist/memory-provider.d.ts.map +1 -0
- package/dist/memory-provider.js +785 -0
- package/dist/memory-provider.js.map +1 -0
- package/dist/schema.d.ts +899 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +1165 -0
- package/dist/schema.js.map +1 -0
- package/dist/tests.d.ts +107 -0
- package/dist/tests.d.ts.map +1 -0
- package/dist/tests.js +568 -0
- package/dist/tests.js.map +1 -0
- package/dist/types.d.ts +972 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +126 -0
- package/dist/types.js.map +1 -0
- package/package.json +37 -23
- package/src/ai-promise-db.ts +1243 -0
- package/src/authorization.ts +1102 -0
- package/src/durable-clickhouse.ts +596 -0
- package/src/durable-promise.ts +582 -0
- package/src/execution-queue.ts +608 -0
- package/src/index.test.ts +868 -0
- package/src/index.ts +337 -0
- package/src/linguistic.ts +404 -0
- package/src/memory-provider.test.ts +1036 -0
- package/src/memory-provider.ts +1119 -0
- package/src/schema.test.ts +1254 -0
- package/src/schema.ts +2296 -0
- package/src/tests.ts +725 -0
- package/src/types.ts +1177 -0
- package/test/README.md +153 -0
- package/test/edge-cases.test.ts +646 -0
- package/test/provider-resolution.test.ts +402 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +19 -0
- package/LICENSE +0 -21
- package/dist/types/database.d.ts +0 -46
- package/dist/types/document.d.ts +0 -15
- package/dist/types/index.d.ts +0 -5
- package/dist/types/mdxdb/embedding.d.ts +0 -7
- package/dist/types/mdxdb/types.d.ts +0 -59
- package/dist/types/synthetic.d.ts +0 -9
- package/dist/types/tools.d.ts +0 -10
- package/dist/types/vector.d.ts +0 -16
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Promise - Promise-like wrapper around database Actions
|
|
3
|
+
*
|
|
4
|
+
* Time is an implementation detail. Whether an operation takes 10ms or 10 hours,
|
|
5
|
+
* the same code works. The DurablePromise persists its state as an Action,
|
|
6
|
+
* allowing crash recovery, observability, and time-agnostic execution.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
import type { Action, MemoryProvider } from './memory-provider.js';
|
|
11
|
+
/**
|
|
12
|
+
* Execution priority tiers
|
|
13
|
+
*
|
|
14
|
+
* - priority: Pay more for immediate execution (fastest, highest cost)
|
|
15
|
+
* - standard: Normal price/latency tradeoff (default)
|
|
16
|
+
* - flex: Discount for variable latency (cost savings)
|
|
17
|
+
* - batch: Maximum discount, 24h SLA (50% savings)
|
|
18
|
+
*/
|
|
19
|
+
export type ExecutionPriority = 'priority' | 'standard' | 'flex' | 'batch';
|
|
20
|
+
/**
|
|
21
|
+
* Options for creating a DurablePromise
|
|
22
|
+
*/
|
|
23
|
+
export interface DurablePromiseOptions<T = unknown> {
|
|
24
|
+
/** Method identifier (e.g., 'ai.generate', 'db.get', 'api.fetch') */
|
|
25
|
+
method: string;
|
|
26
|
+
/** Arguments passed to the method */
|
|
27
|
+
args?: unknown[];
|
|
28
|
+
/** The executor function that performs the actual work */
|
|
29
|
+
executor: () => Promise<T>;
|
|
30
|
+
/** Execution priority tier (defaults to context or 'standard') */
|
|
31
|
+
priority?: ExecutionPriority;
|
|
32
|
+
/** Concurrency key for queue grouping */
|
|
33
|
+
concurrencyKey?: string;
|
|
34
|
+
/** Defer execution until this time (for batch windows) */
|
|
35
|
+
deferUntil?: Date;
|
|
36
|
+
/** Action IDs this promise depends on (must complete first) */
|
|
37
|
+
dependsOn?: string[];
|
|
38
|
+
/** Actor identifier (who initiated this operation) */
|
|
39
|
+
actor?: string;
|
|
40
|
+
/** Additional metadata */
|
|
41
|
+
meta?: Record<string, unknown>;
|
|
42
|
+
/** Provider instance (if not using context) */
|
|
43
|
+
provider?: MemoryProvider;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Result of DurablePromise resolution
|
|
47
|
+
*/
|
|
48
|
+
export interface DurablePromiseResult<T> {
|
|
49
|
+
/** The resolved value */
|
|
50
|
+
value: T;
|
|
51
|
+
/** The underlying Action record */
|
|
52
|
+
action: Action;
|
|
53
|
+
/** Total execution time in ms */
|
|
54
|
+
duration: number;
|
|
55
|
+
}
|
|
56
|
+
interface ExecutionContext {
|
|
57
|
+
priority: ExecutionPriority;
|
|
58
|
+
provider?: MemoryProvider;
|
|
59
|
+
concurrencyKey?: string;
|
|
60
|
+
actor?: string;
|
|
61
|
+
batchWindow?: number;
|
|
62
|
+
onFlush?: () => Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get the current execution context
|
|
66
|
+
*/
|
|
67
|
+
export declare function getCurrentContext(): ExecutionContext | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Run code within an execution context
|
|
70
|
+
*/
|
|
71
|
+
export declare function withContext<T>(context: Partial<ExecutionContext>, fn: () => Promise<T>): Promise<T>;
|
|
72
|
+
/**
|
|
73
|
+
* Set global default context
|
|
74
|
+
*/
|
|
75
|
+
export declare function setDefaultContext(context: Partial<ExecutionContext>): void;
|
|
76
|
+
/** Symbol to identify DurablePromise instances */
|
|
77
|
+
export declare const DURABLE_PROMISE_SYMBOL: unique symbol;
|
|
78
|
+
/**
|
|
79
|
+
* A Promise-like class that persists its state as an Action
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* const promise = new DurablePromise({
|
|
84
|
+
* method: 'ai.generate',
|
|
85
|
+
* args: [{ prompt: 'Hello' }],
|
|
86
|
+
* executor: async () => await ai.generate({ prompt: 'Hello' }),
|
|
87
|
+
* priority: 'batch',
|
|
88
|
+
* })
|
|
89
|
+
*
|
|
90
|
+
* // Access the underlying action
|
|
91
|
+
* console.log(promise.actionId)
|
|
92
|
+
*
|
|
93
|
+
* // Await like a normal promise
|
|
94
|
+
* const result = await promise
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare class DurablePromise<T> implements PromiseLike<T> {
|
|
98
|
+
readonly [DURABLE_PROMISE_SYMBOL] = true;
|
|
99
|
+
/** The Action ID backing this promise */
|
|
100
|
+
readonly actionId: string;
|
|
101
|
+
/** The method being executed */
|
|
102
|
+
readonly method: string;
|
|
103
|
+
/** The execution priority */
|
|
104
|
+
readonly priority: ExecutionPriority;
|
|
105
|
+
/** Dependencies that must complete first */
|
|
106
|
+
readonly dependsOn: string[];
|
|
107
|
+
private readonly state;
|
|
108
|
+
private action;
|
|
109
|
+
private provider;
|
|
110
|
+
private executor;
|
|
111
|
+
private startTime;
|
|
112
|
+
constructor(options: DurablePromiseOptions<T>);
|
|
113
|
+
private initializeAction;
|
|
114
|
+
private parseActionVerb;
|
|
115
|
+
private waitForDependencies;
|
|
116
|
+
private execute;
|
|
117
|
+
private executeDirectly;
|
|
118
|
+
private resolve;
|
|
119
|
+
private reject;
|
|
120
|
+
/**
|
|
121
|
+
* Implement PromiseLike interface
|
|
122
|
+
*/
|
|
123
|
+
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
124
|
+
/**
|
|
125
|
+
* Catch handler
|
|
126
|
+
*/
|
|
127
|
+
catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
|
|
128
|
+
/**
|
|
129
|
+
* Finally handler
|
|
130
|
+
*/
|
|
131
|
+
finally(onfinally?: (() => void) | null): Promise<T>;
|
|
132
|
+
/**
|
|
133
|
+
* Get the current status
|
|
134
|
+
*/
|
|
135
|
+
get status(): Action['status'];
|
|
136
|
+
/**
|
|
137
|
+
* Get the underlying Action (if available)
|
|
138
|
+
*/
|
|
139
|
+
getAction(): Promise<Action | null>;
|
|
140
|
+
/**
|
|
141
|
+
* Get the result with full metadata
|
|
142
|
+
*/
|
|
143
|
+
getResult(): Promise<DurablePromiseResult<T>>;
|
|
144
|
+
/**
|
|
145
|
+
* Cancel the promise if still pending
|
|
146
|
+
*/
|
|
147
|
+
cancel(): Promise<void>;
|
|
148
|
+
/**
|
|
149
|
+
* Retry a failed promise
|
|
150
|
+
*/
|
|
151
|
+
retry(): Promise<this>;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Check if a value is a DurablePromise
|
|
155
|
+
*/
|
|
156
|
+
export declare function isDurablePromise(value: unknown): value is DurablePromise<unknown>;
|
|
157
|
+
/**
|
|
158
|
+
* Create a durable promise from an executor function
|
|
159
|
+
*/
|
|
160
|
+
export declare function durable<T>(method: string, executor: () => Promise<T>, options?: Omit<DurablePromiseOptions<T>, 'method' | 'executor'>): DurablePromise<T>;
|
|
161
|
+
/**
|
|
162
|
+
* Get the global batch scheduler
|
|
163
|
+
*/
|
|
164
|
+
export declare function getBatchScheduler(): BatchScheduler | null;
|
|
165
|
+
/**
|
|
166
|
+
* Set the global batch scheduler
|
|
167
|
+
*/
|
|
168
|
+
export declare function setBatchScheduler(scheduler: BatchScheduler | null): void;
|
|
169
|
+
/**
|
|
170
|
+
* Interface for batch scheduling
|
|
171
|
+
* Full implementation is in execution-queue.ts
|
|
172
|
+
*/
|
|
173
|
+
export interface BatchScheduler {
|
|
174
|
+
/** Add a promise to the batch queue */
|
|
175
|
+
enqueue(promise: DurablePromise<unknown>): void;
|
|
176
|
+
/** Flush all pending batches */
|
|
177
|
+
flush(): Promise<void>;
|
|
178
|
+
/** Get count of pending promises */
|
|
179
|
+
readonly pending: number;
|
|
180
|
+
}
|
|
181
|
+
export {};
|
|
182
|
+
//# sourceMappingURL=durable-promise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-promise.d.ts","sourceRoot":"","sources":["../src/durable-promise.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Promise - Promise-like wrapper around database Actions
|
|
3
|
+
*
|
|
4
|
+
* Time is an implementation detail. Whether an operation takes 10ms or 10 hours,
|
|
5
|
+
* the same code works. The DurablePromise persists its state as an Action,
|
|
6
|
+
* allowing crash recovery, observability, and time-agnostic execution.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
const contextStack = [];
|
|
11
|
+
/**
|
|
12
|
+
* Get the current execution context
|
|
13
|
+
*/
|
|
14
|
+
export function getCurrentContext() {
|
|
15
|
+
return contextStack[contextStack.length - 1];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Run code within an execution context
|
|
19
|
+
*/
|
|
20
|
+
export async function withContext(context, fn) {
|
|
21
|
+
const parent = getCurrentContext();
|
|
22
|
+
const merged = {
|
|
23
|
+
priority: context.priority ?? parent?.priority ?? 'standard',
|
|
24
|
+
provider: context.provider ?? parent?.provider,
|
|
25
|
+
concurrencyKey: context.concurrencyKey ?? parent?.concurrencyKey,
|
|
26
|
+
actor: context.actor ?? parent?.actor,
|
|
27
|
+
batchWindow: context.batchWindow ?? parent?.batchWindow,
|
|
28
|
+
onFlush: context.onFlush ?? parent?.onFlush,
|
|
29
|
+
};
|
|
30
|
+
contextStack.push(merged);
|
|
31
|
+
try {
|
|
32
|
+
return await fn();
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
contextStack.pop();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Set global default context
|
|
40
|
+
*/
|
|
41
|
+
export function setDefaultContext(context) {
|
|
42
|
+
if (contextStack.length === 0) {
|
|
43
|
+
contextStack.push({
|
|
44
|
+
priority: context.priority ?? 'standard',
|
|
45
|
+
provider: context.provider,
|
|
46
|
+
concurrencyKey: context.concurrencyKey,
|
|
47
|
+
actor: context.actor,
|
|
48
|
+
batchWindow: context.batchWindow,
|
|
49
|
+
onFlush: context.onFlush,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
Object.assign(contextStack[0], context);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// DurablePromise Class
|
|
58
|
+
// =============================================================================
|
|
59
|
+
/** Symbol to identify DurablePromise instances */
|
|
60
|
+
export const DURABLE_PROMISE_SYMBOL = Symbol.for('ai-database.DurablePromise');
|
|
61
|
+
/**
|
|
62
|
+
* A Promise-like class that persists its state as an Action
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* const promise = new DurablePromise({
|
|
67
|
+
* method: 'ai.generate',
|
|
68
|
+
* args: [{ prompt: 'Hello' }],
|
|
69
|
+
* executor: async () => await ai.generate({ prompt: 'Hello' }),
|
|
70
|
+
* priority: 'batch',
|
|
71
|
+
* })
|
|
72
|
+
*
|
|
73
|
+
* // Access the underlying action
|
|
74
|
+
* console.log(promise.actionId)
|
|
75
|
+
*
|
|
76
|
+
* // Await like a normal promise
|
|
77
|
+
* const result = await promise
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export class DurablePromise {
|
|
81
|
+
[DURABLE_PROMISE_SYMBOL] = true;
|
|
82
|
+
/** The Action ID backing this promise */
|
|
83
|
+
actionId;
|
|
84
|
+
/** The method being executed */
|
|
85
|
+
method;
|
|
86
|
+
/** The execution priority */
|
|
87
|
+
priority;
|
|
88
|
+
/** Dependencies that must complete first */
|
|
89
|
+
dependsOn;
|
|
90
|
+
state = {
|
|
91
|
+
status: 'pending',
|
|
92
|
+
resolvers: [],
|
|
93
|
+
};
|
|
94
|
+
action = null;
|
|
95
|
+
provider = null;
|
|
96
|
+
executor = null;
|
|
97
|
+
startTime = Date.now();
|
|
98
|
+
constructor(options) {
|
|
99
|
+
const context = getCurrentContext();
|
|
100
|
+
this.method = options.method;
|
|
101
|
+
this.priority = options.priority ?? context?.priority ?? 'standard';
|
|
102
|
+
this.dependsOn = options.dependsOn ?? [];
|
|
103
|
+
this.provider = options.provider ?? context?.provider ?? null;
|
|
104
|
+
this.executor = options.executor;
|
|
105
|
+
this.actionId = crypto.randomUUID();
|
|
106
|
+
// Create the action immediately if we have a provider
|
|
107
|
+
if (this.provider) {
|
|
108
|
+
this.initializeAction(options);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Defer action creation but start execution
|
|
112
|
+
this.executeDirectly();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async initializeAction(options) {
|
|
116
|
+
if (!this.provider)
|
|
117
|
+
return;
|
|
118
|
+
try {
|
|
119
|
+
// Create the action record
|
|
120
|
+
this.action = await this.provider.createAction({
|
|
121
|
+
actor: options.actor ?? getCurrentContext()?.actor ?? 'system',
|
|
122
|
+
action: this.parseActionVerb(this.method),
|
|
123
|
+
object: this.method,
|
|
124
|
+
objectData: {
|
|
125
|
+
method: this.method,
|
|
126
|
+
args: options.args,
|
|
127
|
+
priority: this.priority,
|
|
128
|
+
concurrencyKey: options.concurrencyKey,
|
|
129
|
+
deferUntil: options.deferUntil?.toISOString(),
|
|
130
|
+
dependsOn: this.dependsOn,
|
|
131
|
+
},
|
|
132
|
+
meta: options.meta,
|
|
133
|
+
});
|
|
134
|
+
this.action.id = this.actionId;
|
|
135
|
+
// Check if we should defer execution
|
|
136
|
+
if (this.priority === 'batch') {
|
|
137
|
+
// Register with the batch scheduler instead of executing immediately
|
|
138
|
+
const scheduler = getBatchScheduler();
|
|
139
|
+
if (scheduler) {
|
|
140
|
+
scheduler.enqueue(this);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Check dependencies
|
|
145
|
+
if (this.dependsOn.length > 0) {
|
|
146
|
+
await this.waitForDependencies();
|
|
147
|
+
}
|
|
148
|
+
// Execute
|
|
149
|
+
await this.execute();
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
this.reject(error);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
parseActionVerb(method) {
|
|
156
|
+
// Extract verb from method like 'ai.generate' -> 'generate'
|
|
157
|
+
const parts = method.split('.');
|
|
158
|
+
return parts[parts.length - 1] || 'process';
|
|
159
|
+
}
|
|
160
|
+
async waitForDependencies() {
|
|
161
|
+
if (!this.provider || this.dependsOn.length === 0)
|
|
162
|
+
return;
|
|
163
|
+
// Poll for dependency completion
|
|
164
|
+
const checkInterval = 100; // ms
|
|
165
|
+
const maxWait = 24 * 60 * 60 * 1000; // 24 hours
|
|
166
|
+
const startWait = Date.now();
|
|
167
|
+
while (Date.now() - startWait < maxWait) {
|
|
168
|
+
const pending = await this.provider.listActions({
|
|
169
|
+
status: 'pending',
|
|
170
|
+
});
|
|
171
|
+
const active = await this.provider.listActions({
|
|
172
|
+
status: 'active',
|
|
173
|
+
});
|
|
174
|
+
const blockedBy = [...pending, ...active]
|
|
175
|
+
.filter((a) => this.dependsOn.includes(a.id))
|
|
176
|
+
.map((a) => a.id);
|
|
177
|
+
if (blockedBy.length === 0) {
|
|
178
|
+
// All dependencies resolved
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Wait before checking again
|
|
182
|
+
await new Promise((resolve) => setTimeout(resolve, checkInterval));
|
|
183
|
+
}
|
|
184
|
+
throw new Error(`Timeout waiting for dependencies: ${this.dependsOn.join(', ')}`);
|
|
185
|
+
}
|
|
186
|
+
async execute() {
|
|
187
|
+
if (!this.executor) {
|
|
188
|
+
throw new Error('No executor provided');
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
// Mark as active
|
|
192
|
+
if (this.provider && this.action) {
|
|
193
|
+
await this.provider.updateAction(this.actionId, { status: 'active' });
|
|
194
|
+
}
|
|
195
|
+
// Execute the actual work
|
|
196
|
+
const result = await this.executor();
|
|
197
|
+
// Mark as completed
|
|
198
|
+
if (this.provider && this.action) {
|
|
199
|
+
await this.provider.updateAction(this.actionId, {
|
|
200
|
+
status: 'completed',
|
|
201
|
+
result: { value: result },
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
this.resolve(result);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
// Mark as failed
|
|
208
|
+
if (this.provider && this.action) {
|
|
209
|
+
await this.provider.updateAction(this.actionId, {
|
|
210
|
+
status: 'failed',
|
|
211
|
+
error: error.message,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
this.reject(error);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async executeDirectly() {
|
|
218
|
+
if (!this.executor) {
|
|
219
|
+
throw new Error('No executor provided');
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const result = await this.executor();
|
|
223
|
+
this.resolve(result);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
this.reject(error);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
resolve(value) {
|
|
230
|
+
if (this.state.status !== 'pending')
|
|
231
|
+
return;
|
|
232
|
+
this.state.status = 'resolved';
|
|
233
|
+
this.state.value = value;
|
|
234
|
+
for (const { resolve } of this.state.resolvers) {
|
|
235
|
+
resolve(value);
|
|
236
|
+
}
|
|
237
|
+
this.state.resolvers = [];
|
|
238
|
+
}
|
|
239
|
+
reject(error) {
|
|
240
|
+
if (this.state.status !== 'pending')
|
|
241
|
+
return;
|
|
242
|
+
this.state.status = 'rejected';
|
|
243
|
+
this.state.error = error;
|
|
244
|
+
for (const { reject } of this.state.resolvers) {
|
|
245
|
+
reject(error);
|
|
246
|
+
}
|
|
247
|
+
this.state.resolvers = [];
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Implement PromiseLike interface
|
|
251
|
+
*/
|
|
252
|
+
then(onfulfilled, onrejected) {
|
|
253
|
+
return new Promise((resolve, reject) => {
|
|
254
|
+
const handleResolve = (value) => {
|
|
255
|
+
if (onfulfilled) {
|
|
256
|
+
try {
|
|
257
|
+
resolve(onfulfilled(value));
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
reject(e);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
resolve(value);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
const handleReject = (error) => {
|
|
268
|
+
if (onrejected) {
|
|
269
|
+
try {
|
|
270
|
+
resolve(onrejected(error));
|
|
271
|
+
}
|
|
272
|
+
catch (e) {
|
|
273
|
+
reject(e);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
reject(error);
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
if (this.state.status === 'resolved') {
|
|
281
|
+
handleResolve(this.state.value);
|
|
282
|
+
}
|
|
283
|
+
else if (this.state.status === 'rejected') {
|
|
284
|
+
handleReject(this.state.error);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
this.state.resolvers.push({
|
|
288
|
+
resolve: handleResolve,
|
|
289
|
+
reject: handleReject,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Catch handler
|
|
296
|
+
*/
|
|
297
|
+
catch(onrejected) {
|
|
298
|
+
return this.then(null, onrejected);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Finally handler
|
|
302
|
+
*/
|
|
303
|
+
finally(onfinally) {
|
|
304
|
+
return this.then((value) => {
|
|
305
|
+
onfinally?.();
|
|
306
|
+
return value;
|
|
307
|
+
}, (reason) => {
|
|
308
|
+
onfinally?.();
|
|
309
|
+
throw reason;
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get the current status
|
|
314
|
+
*/
|
|
315
|
+
get status() {
|
|
316
|
+
if (this.action)
|
|
317
|
+
return this.action.status;
|
|
318
|
+
if (this.state.status === 'resolved')
|
|
319
|
+
return 'completed';
|
|
320
|
+
if (this.state.status === 'rejected')
|
|
321
|
+
return 'failed';
|
|
322
|
+
return 'pending';
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Get the underlying Action (if available)
|
|
326
|
+
*/
|
|
327
|
+
async getAction() {
|
|
328
|
+
if (this.action)
|
|
329
|
+
return this.action;
|
|
330
|
+
if (!this.provider)
|
|
331
|
+
return null;
|
|
332
|
+
return this.provider.getAction(this.actionId);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get the result with full metadata
|
|
336
|
+
*/
|
|
337
|
+
async getResult() {
|
|
338
|
+
const value = await this;
|
|
339
|
+
const action = await this.getAction();
|
|
340
|
+
return {
|
|
341
|
+
value,
|
|
342
|
+
action: action,
|
|
343
|
+
duration: Date.now() - this.startTime,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Cancel the promise if still pending
|
|
348
|
+
*/
|
|
349
|
+
async cancel() {
|
|
350
|
+
if (this.state.status !== 'pending') {
|
|
351
|
+
throw new Error('Cannot cancel a resolved or rejected promise');
|
|
352
|
+
}
|
|
353
|
+
if (this.provider) {
|
|
354
|
+
await this.provider.cancelAction(this.actionId);
|
|
355
|
+
}
|
|
356
|
+
this.reject(new Error('Promise cancelled'));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Retry a failed promise
|
|
360
|
+
*/
|
|
361
|
+
async retry() {
|
|
362
|
+
if (this.state.status !== 'rejected') {
|
|
363
|
+
throw new Error('Can only retry failed promises');
|
|
364
|
+
}
|
|
365
|
+
if (this.provider) {
|
|
366
|
+
await this.provider.retryAction(this.actionId);
|
|
367
|
+
}
|
|
368
|
+
// Re-execute
|
|
369
|
+
this.state.status = 'pending';
|
|
370
|
+
await this.execute();
|
|
371
|
+
return this;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Check if a value is a DurablePromise
|
|
376
|
+
*/
|
|
377
|
+
export function isDurablePromise(value) {
|
|
378
|
+
return (typeof value === 'object' &&
|
|
379
|
+
value !== null &&
|
|
380
|
+
DURABLE_PROMISE_SYMBOL in value &&
|
|
381
|
+
value[DURABLE_PROMISE_SYMBOL] === true);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Create a durable promise from an executor function
|
|
385
|
+
*/
|
|
386
|
+
export function durable(method, executor, options) {
|
|
387
|
+
return new DurablePromise({
|
|
388
|
+
method,
|
|
389
|
+
executor,
|
|
390
|
+
...options,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
// =============================================================================
|
|
394
|
+
// Batch Scheduler Singleton
|
|
395
|
+
// =============================================================================
|
|
396
|
+
let batchScheduler = null;
|
|
397
|
+
/**
|
|
398
|
+
* Get the global batch scheduler
|
|
399
|
+
*/
|
|
400
|
+
export function getBatchScheduler() {
|
|
401
|
+
return batchScheduler;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Set the global batch scheduler
|
|
405
|
+
*/
|
|
406
|
+
export function setBatchScheduler(scheduler) {
|
|
407
|
+
batchScheduler = scheduler;
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=durable-promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-promise.js","sourceRoot":"","sources":["../src/durable-promise.ts"],"names":[],"mappings":"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"}
|