@autostorejs/plugins 4.3.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/README.md +15 -0
- package/dist/asyncpro.cjs +2 -0
- package/dist/asyncpro.cjs.map +1 -0
- package/dist/asyncpro.d.cts +312 -0
- package/dist/asyncpro.d.ts +312 -0
- package/dist/asyncpro.js +2 -0
- package/dist/asyncpro.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/shadow.cjs +2 -0
- package/dist/shadow.cjs.map +1 -0
- package/dist/shadow.d.cts +58 -0
- package/dist/shadow.d.ts +58 -0
- package/dist/shadow.js +2 -0
- package/dist/shadow.js.map +1 -0
- package/dist/trace.cjs +2 -0
- package/dist/trace.cjs.map +1 -0
- package/dist/trace.d.cts +74 -0
- package/dist/trace.d.ts +74 -0
- package/dist/trace.js +2 -0
- package/dist/trace.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { Dict, ComputedOptions, StateOperate, AsyncComputedGetterArgs, ObserverDescriptorBuilder, ObserverDescriptor, AsyncComputedGetter, ComputedObject, AsyncComputedValue, RuntimeComputedOptions, ComputedDepends, AnyAutoStore } from 'autostore';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* 在signal的基础上提供计算属性功能
|
|
6
|
+
*
|
|
7
|
+
* const signal = createSignal({
|
|
8
|
+
* name:'zhangsan',
|
|
9
|
+
* price: 13,
|
|
10
|
+
* count: 2,
|
|
11
|
+
* total: (data){
|
|
12
|
+
* return data.price * data.count
|
|
13
|
+
* }
|
|
14
|
+
* })
|
|
15
|
+
*
|
|
16
|
+
*
|
|
17
|
+
*
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
interface AsyncProComputedGetterArgs extends AsyncComputedGetterArgs {
|
|
22
|
+
/**
|
|
23
|
+
* 获取一个进度条,用来显示异步计算的进度
|
|
24
|
+
* @param opts
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
getProgressbar?: (opts?: {
|
|
28
|
+
max?: number;
|
|
29
|
+
min?: number;
|
|
30
|
+
value?: number;
|
|
31
|
+
}) => AsyncComputedProgressbar;
|
|
32
|
+
/**
|
|
33
|
+
* 当计算函数启用超时时,可以指定一个cb,在超时后会调用此函数
|
|
34
|
+
* @param cb
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
onTimeout?: (cb: () => void) => void;
|
|
38
|
+
/**
|
|
39
|
+
* 在执行计算函数时,如果传入AbortController.signal可以用来传递给异步计算函数,用来取消异步计算
|
|
40
|
+
* 例如:fetch(url,{signal:signal})
|
|
41
|
+
*/
|
|
42
|
+
abortSignal: AbortSignal;
|
|
43
|
+
/**
|
|
44
|
+
* 用来取消操作正在执行的异步计算函数
|
|
45
|
+
* 异步函数可以通过此方法来取消异步计算
|
|
46
|
+
*
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
cancel: () => void;
|
|
50
|
+
}
|
|
51
|
+
type AsyncProComputedGetter<Value, Scope = any> = (scope: Scope, args: Required<AsyncProComputedGetterArgs>) => Promise<Value>;
|
|
52
|
+
type AsyncProComputedDescriptor<Value = any, Scope = any> = ObserverDescriptor<"asyncpro", Value, Scope, AsyncComputedGetter<Value, Scope>, AsyncProComputedOptions<Value, Scope>>;
|
|
53
|
+
interface AsyncComputedProgressbar {
|
|
54
|
+
value: (num: number) => void;
|
|
55
|
+
end: () => void;
|
|
56
|
+
}
|
|
57
|
+
type AsyncProComputedDescriptorBuilder<Value = any, Scope = any> = ObserverDescriptorBuilder<"asyncpro", Value, Scope, AsyncProComputedDescriptor<Value, Scope>>;
|
|
58
|
+
interface AsyncProComputedOptions<Value = any, Scope = any, Schema extends Dict = Dict> extends ComputedOptions<Value, Scope, Schema> {
|
|
59
|
+
/**
|
|
60
|
+
*
|
|
61
|
+
* 计算函数的执行超时时间
|
|
62
|
+
*
|
|
63
|
+
* @description
|
|
64
|
+
* 指定超时时间,当计算函数执行超过指定时间后,会自动设置loading为false
|
|
65
|
+
* 如果timeout是一个数组,则第一个值表示超时时间,第二个值表示超时期的倒计时间隔
|
|
66
|
+
* 例如:[1000,10]表示1000ms代表1s后超时并置loading=false
|
|
67
|
+
* 10代表setInterval(1000/100), 每次执行时-1,直到为0时停止
|
|
68
|
+
* 这样就可以通过绑定timeout值来实现倒计时的效果
|
|
69
|
+
* 如果要实现60秒倒计时,可以这样写:[60*1000,60],这样value.timeout就会从60开始递减
|
|
70
|
+
*/
|
|
71
|
+
timeout?: number | [number, number];
|
|
72
|
+
/**
|
|
73
|
+
* 计算函数是否允许重入执行
|
|
74
|
+
*
|
|
75
|
+
* 默认为true,即允许重入执行
|
|
76
|
+
*
|
|
77
|
+
*/
|
|
78
|
+
reentry?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* 提供一个异步信号,用来传递给异步计算函数以便可以取消异步计算
|
|
81
|
+
*
|
|
82
|
+
* @description
|
|
83
|
+
*
|
|
84
|
+
* 仅在异步计算函数中有效
|
|
85
|
+
*
|
|
86
|
+
*/
|
|
87
|
+
abortController?: () => AbortController | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* 当计算函数执行出错时的重试次数
|
|
90
|
+
*
|
|
91
|
+
* @description
|
|
92
|
+
*
|
|
93
|
+
* retry:3 表示最多重试3次,重试间隔为0,加上第1次执行,总共执行4次
|
|
94
|
+
* retry:[3,1000] 表示最多重试3次,重试间隔为1000ms,加上第1次执行,总共执行4次
|
|
95
|
+
*
|
|
96
|
+
* 重试数据可以通过AsyncComputedObject.retry获取
|
|
97
|
+
* 当首次执行失败时触发重试,此时AsyncComputedObject.retry=3,然后每次重试-1,直到为0时停止重试
|
|
98
|
+
* 可以在UI中通过AsyncComputedObject.retry来实时显示重试次数
|
|
99
|
+
*
|
|
100
|
+
*/
|
|
101
|
+
retry?: number | [number, number];
|
|
102
|
+
}
|
|
103
|
+
type AsyncProRuntimeComputedOptions = AsyncProComputedOptions & {
|
|
104
|
+
first?: boolean;
|
|
105
|
+
operate?: StateOperate;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
*
|
|
110
|
+
* 异步计算
|
|
111
|
+
*
|
|
112
|
+
*/
|
|
113
|
+
|
|
114
|
+
declare class AsyncProComputedObject<Value = any, Scope = any> extends ComputedObject<AsyncComputedValue<Value>> {
|
|
115
|
+
private _isRunning;
|
|
116
|
+
private _defaultAbortController;
|
|
117
|
+
private _userAbortController?;
|
|
118
|
+
private _firstRun;
|
|
119
|
+
/**
|
|
120
|
+
* 用于标识这是一个简单计算对象
|
|
121
|
+
*
|
|
122
|
+
* 不同于全功能异步计算对象
|
|
123
|
+
*
|
|
124
|
+
*/
|
|
125
|
+
lite: boolean;
|
|
126
|
+
get async(): boolean;
|
|
127
|
+
get value(): AsyncComputedValue<Value>;
|
|
128
|
+
set value(value: AsyncComputedValue<Value>);
|
|
129
|
+
get running(): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* 本方法用来处理配置参数
|
|
132
|
+
* 主要
|
|
133
|
+
* @param options
|
|
134
|
+
*/
|
|
135
|
+
protected onInitOptions(options: Required<RuntimeComputedOptions>): void;
|
|
136
|
+
protected onInitial(): void;
|
|
137
|
+
/**
|
|
138
|
+
* 销毁时取消正在进行的异步计算(复用 AbortController)
|
|
139
|
+
*/
|
|
140
|
+
protected onDestroy(): void;
|
|
141
|
+
private createAsyncComputedValue;
|
|
142
|
+
/**
|
|
143
|
+
*
|
|
144
|
+
* 局部更新计算属性的值
|
|
145
|
+
*
|
|
146
|
+
*/
|
|
147
|
+
private updateComputedValue;
|
|
148
|
+
/**
|
|
149
|
+
*
|
|
150
|
+
* 运行计算函数
|
|
151
|
+
*
|
|
152
|
+
*/
|
|
153
|
+
run(options?: AsyncProRuntimeComputedOptions): Promise<void>;
|
|
154
|
+
getValue(): any;
|
|
155
|
+
/**
|
|
156
|
+
* computed(async (scope,{getProgressbar})=>{
|
|
157
|
+
* const pbar = getProgressbar({max:100,min:0}) // 初始值
|
|
158
|
+
* pbar.value(12) // 修改进度值
|
|
159
|
+
* pbar.end() // 结束进度条
|
|
160
|
+
* })
|
|
161
|
+
*
|
|
162
|
+
* @param init
|
|
163
|
+
* @returns
|
|
164
|
+
*/
|
|
165
|
+
private createComputeProgressbar;
|
|
166
|
+
/**
|
|
167
|
+
*
|
|
168
|
+
* AbortController是一个用于控制一个或多个请求的AbortSignal对象的生命周期的对象
|
|
169
|
+
*
|
|
170
|
+
*
|
|
171
|
+
* - 整个异步对象只有一个默认的AbortController对象,仅当用户调用cancel方法时才会使用
|
|
172
|
+
*
|
|
173
|
+
* ,当用户指定了abortController选项时,会使用用户指定的AbortController对象
|
|
174
|
+
*
|
|
175
|
+
*
|
|
176
|
+
*
|
|
177
|
+
* @param options
|
|
178
|
+
* @returns
|
|
179
|
+
*/
|
|
180
|
+
private getAbortController;
|
|
181
|
+
/**
|
|
182
|
+
* 处理超时
|
|
183
|
+
* @param timeoutCallback
|
|
184
|
+
* @param options
|
|
185
|
+
* @returns
|
|
186
|
+
*/
|
|
187
|
+
private setTimeoutControl;
|
|
188
|
+
/**
|
|
189
|
+
* 执行计算函数
|
|
190
|
+
*
|
|
191
|
+
*/
|
|
192
|
+
private executeGetter;
|
|
193
|
+
/**
|
|
194
|
+
* 当计算属性操作完成时的回调函数
|
|
195
|
+
*
|
|
196
|
+
* 此函数负责在计算属性操作完成后,根据操作的执行状态调用用户定义的回调函数
|
|
197
|
+
* 它会传递操作的结果、错误状态、是否中止以及是否超时等信息给回调函数
|
|
198
|
+
*
|
|
199
|
+
* @param options - 计算属性的运行时选项,被强制转换为Required类型,确保所有选项都是必需的
|
|
200
|
+
* @param error - 如果操作过程中发生错误,该错误对象将被传递
|
|
201
|
+
* @param abort - 一个布尔值,表示操作是否被中止
|
|
202
|
+
* @param timeout - 一个布尔值,表示操作是否因超时而结束
|
|
203
|
+
* @param scope - 操作执行的上下文或范围
|
|
204
|
+
* @param value - 操作的结果,如果操作成功完成
|
|
205
|
+
*/
|
|
206
|
+
private onDoneCallback;
|
|
207
|
+
protected onDependsChange(params: StateOperate): void;
|
|
208
|
+
/**
|
|
209
|
+
*
|
|
210
|
+
* 由于异步计算是一个对象,所以我们需要侦听的是对象的变化,而不仅是对象的值
|
|
211
|
+
*
|
|
212
|
+
*/
|
|
213
|
+
protected getValueWatchPath(): string[];
|
|
214
|
+
/**
|
|
215
|
+
* 由于所有异步计算属性均会被转换为一个AsyncComputedValue<{value,timeout,....}>的形式
|
|
216
|
+
* 这样,当我们在指定一个依赖是异步属性时,就需要指定为xxxx.value才可以个侦听到变化
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* const store = new AutoStore({
|
|
220
|
+
* a0: 1,
|
|
221
|
+
* a1: computed(async (scope:any)=>{
|
|
222
|
+
* return scope.a0 + 1
|
|
223
|
+
* },["a0"],{initial:2}),
|
|
224
|
+
* a2: computed(async (scope:any)=>{
|
|
225
|
+
* return scope.a1.value + 1
|
|
226
|
+
* },["a1.value"],{initial:3})
|
|
227
|
+
* });
|
|
228
|
+
*
|
|
229
|
+
* 以上a2依赖于a1,由于a1是一个异步对象,所以在写依赖时就必须写上["a1.value"]
|
|
230
|
+
* 这就有点反直觉了。
|
|
231
|
+
*
|
|
232
|
+
* 本函数在异步计算对象订阅变更事件时调用,用来返回字符串形式的依赖数组
|
|
233
|
+
*
|
|
234
|
+
* 本函数的功能就是对所有依赖进行判断如果其是一个异步计算依赖,则自动添加.value,这样就可以如下方式来写依赖了
|
|
235
|
+
*
|
|
236
|
+
* const store = new AutoStore({
|
|
237
|
+
* a0: 1,
|
|
238
|
+
* a1: computed(async (scope:any)=>{
|
|
239
|
+
* return scope.a0 + 1
|
|
240
|
+
* },["a0"],{initial:2}),
|
|
241
|
+
* a2: computed(async (scope:any)=>{
|
|
242
|
+
* return scope.a1.value + 1
|
|
243
|
+
* },["a1"],{initial:3})
|
|
244
|
+
* });
|
|
245
|
+
*
|
|
246
|
+
*/
|
|
247
|
+
protected getDepends(): string[][];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* 用来封装状态的计算函数,使用计算函数的传入的是当前对象
|
|
252
|
+
*
|
|
253
|
+
*
|
|
254
|
+
* @param getter
|
|
255
|
+
* @param depends
|
|
256
|
+
* @param options
|
|
257
|
+
* @returns
|
|
258
|
+
*
|
|
259
|
+
*/
|
|
260
|
+
declare function asyncComputed<Value = any, Scope = any>(getter: AsyncProComputedGetter<Value, Scope>, depends: ComputedDepends, options?: AsyncProComputedOptions<Value, Scope>): AsyncProComputedDescriptorBuilder<AsyncComputedValue<Value>, Scope>;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* shadow 插件
|
|
264
|
+
*
|
|
265
|
+
* 为 AutoStore 注入影子 store(shadowStore)能力:
|
|
266
|
+
* - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法
|
|
267
|
+
* - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state
|
|
268
|
+
* - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算
|
|
269
|
+
* - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)
|
|
270
|
+
*
|
|
271
|
+
* shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。
|
|
272
|
+
* 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT
|
|
273
|
+
* (不能是 CURRENT 或相对路径)。
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
*
|
|
277
|
+
* import { AutoStore, computed } from "autostore";
|
|
278
|
+
* import { shadow } from "@autostorejs/plugins";
|
|
279
|
+
*
|
|
280
|
+
* const store = new AutoStore({ price: 10, count: 3 });
|
|
281
|
+
* shadow(store); // 安装插件,挂载 store.shadow 方法
|
|
282
|
+
*
|
|
283
|
+
* const shadowStore = store.shadow({
|
|
284
|
+
* total: computed((scope) => scope.price * scope.count),
|
|
285
|
+
* });
|
|
286
|
+
*
|
|
287
|
+
* shadowStore.state.total; // 30
|
|
288
|
+
* store.state.count = 4;
|
|
289
|
+
* shadowStore.state.total; // 40
|
|
290
|
+
*/
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* shadow 插件入口
|
|
294
|
+
*
|
|
295
|
+
* 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。
|
|
296
|
+
*
|
|
297
|
+
* @param store 目标 AutoStore 实例
|
|
298
|
+
* @returns 无返回值,副作用是给 store 挂载 shadow 方法
|
|
299
|
+
*/
|
|
300
|
+
declare function asyncpro(store: AnyAutoStore): void;
|
|
301
|
+
declare module "autostore" {
|
|
302
|
+
interface AutoStore<State extends Dict, Options = unknown> {
|
|
303
|
+
}
|
|
304
|
+
interface ObserverObjects {
|
|
305
|
+
asyncpro: AsyncProComputedObject;
|
|
306
|
+
}
|
|
307
|
+
interface AsyncComputedObjects {
|
|
308
|
+
asyncpro: AsyncProComputedObject;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export { type AsyncComputedProgressbar, type AsyncProComputedDescriptor, type AsyncProComputedDescriptorBuilder, type AsyncProComputedGetter, type AsyncProComputedGetterArgs, AsyncProComputedObject, type AsyncProComputedOptions, type AsyncProRuntimeComputedOptions, asyncComputed, asyncpro };
|
package/dist/asyncpro.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {ComputedObject,markRaw,getValueScope,emitStoreEvent,AbortError,getError,isFunction,isPathEq,getSnap,isMap,getDefaultComputedOptions,normalizeDeps,OBSERVER_DESCRIPTOR_FLAG,OBSERVER_TYPE_FLAG}from'autostore';var P=Object.defineProperty;var n=(s,t)=>P(s,"name",{value:t,configurable:true}),d=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});function x(s){globalThis.__AUTOSTORE_PLUGINS__||(globalThis.__AUTOSTORE_PLUGINS__=[]),globalThis.__AUTOSTORE_PLUGINS__.push(s);}n(x,"installPlugin");async function C(s){return new Promise((t,e)=>setTimeout(t,s))}n(C,"t");(s=>typeof d<"u"?d:typeof Proxy<"u"?new Proxy(s,{get:n((t,e)=>(typeof d<"u"?d:t)[e],"get")}):s)(function(s){if(typeof d<"u")return d.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});function E(s,t,e){let o=s,i=t.length-1;t.forEach((r,l)=>{let h=isMap(o);if(l===i){let u=h?o.get(r):o[r];typeof u=="object"&&Object.assign(u,e);return}h?(o.has(r)||o.set(r,{}),o=o.get(r)):(r in o||(o[r]={}),o=o[r]);});}n(E,"updateObjectVal");var y=class extends ComputedObject{static{n(this,"AsyncProComputedObject");}_isRunning=false;_defaultAbortController=null;_userAbortController;_firstRun=false;lite=false;get async(){return true}get value(){return super.value}set value(t){super.value=t;}get running(){return this._isRunning}onInitOptions(t){t.reentry===void 0&&(t.reentry=this.store.options.reentry);}onInitial(){this.initial=this.createAsyncComputedValue(),this.attach(),setTimeout(()=>{(this.options.immediate===true||this.options.immediate==="auto"&&this.options.initial===void 0)&&this.run({first:true});},0);}onDestroy(){try{this._isRunning&&this.getAbortController().abort();}catch{}}createAsyncComputedValue(){return Object.assign({loading:false,timeout:0,retry:0,error:null,value:this.options.initial,progress:0,run:markRaw(t=>this.store.computedObjects.run(this.id,Object.assign({},t))),cancel:markRaw(()=>{this.getAbortController().abort();})})}updateComputedValue(t){let e=this.strPath,o=Object.keys(t).length;if(this.associated)this.store.update(i=>{E(i,this.path,t);},{batch:o>1?e:false});else {Object.assign(this.value,t);let i=o>1,r=[];Object.entries(t).forEach(([l,h])=>{let u={type:"set",path:[...this.path,l],value:h,parent:this.value};i&&(u.reply=true),this.store.operates.emit(`${this.strPath}.${l}`,u),r.push(u);}),i&&this.store.operates.emit(this.strPath,{type:"batch",path:this.path,value:r});}}async run(t){let{first:e}=t??{};if(this.isDisable(t?.enable)){this.store.logger.warn(()=>`Async computed <${this.toString()}> is disabled`);return}let o=this.error!==void 0;this.error=void 0,this._firstRun=true,e||this.store.logger.info(()=>`Run async computed for : ${this.toString()}`);let i=t?Object.assign({first:e},this.options,t):this.options,r=getValueScope(this,"sync",this.context,i),{reentry:l}=i;if(this._isRunning&&!l){this.store.logger.warn(()=>`Async computed: ${this.toString()} is running, can't reentry`),emitStoreEvent(this.store,`observer/${this.id}/cancel`,{reason:"reentry",observer:this});return}this._isRunning=true;try{return await this.executeGetter(r,i,o)}finally{this._isRunning=false;}}getValue(){return this.value.value}createComputeProgressbar(t){let{max:e=100,min:o=0,value:i=0}=Object.assign({},t);return this.updateComputedValue({progress:i}),{value:n(r=>{r>e&&(r=e),r<o&&(r=o),this.updateComputedValue({progress:r});},"value"),end(){this.value(e);}}}getAbortController(t){if(t&&typeof t.abortController=="function"){let e=t.abortController();e&&e instanceof AbortController&&(this._userAbortController=e);}return this._userAbortController?this._userAbortController:(this._defaultAbortController||(this._defaultAbortController=new AbortController),this._defaultAbortController.signal.aborted&&(this._defaultAbortController=new AbortController),this._defaultAbortController)}setTimeoutControl(t,e,o){let{timeout:i}=o,[r,l]=Array.isArray(i)?i:[i,0],h,u;return r>0&&(e.timeout=l>1?l:r,u=setTimeout(()=>{t.hasTimeout=true,t.hasError=true,t.error="TIMEOUT",typeof t.timeoutCallback=="function"&&t.timeoutCallback(),clearInterval(h),this.updateComputedValue({loading:false,error:"TIMEOUT",timeout:0});},r),l>1&&(h=setInterval(()=>{this.updateComputedValue({timeout:l--}),l===0&&clearInterval(h);},r/(l+1)))),{clear:n(()=>{clearTimeout(u),clearInterval(h);},"clear"),enable:r>0}}async executeGetter(t,e,o=false){let{retry:i}=e,[r,l]=i?Array.isArray(i)?i:[Number(i),0]:[0,0],h,u=this.getAbortController(e),_={onTimeout:n(b=>{h=b;},"onTimeout"),getProgressbar:this.createComputeProgressbar.bind(this),getSnap:n(b=>getSnap(b),"getSnap"),cancel:u.abort.bind(u),extras:e.extras,operate:e.operate,first:e.first,abortSignal:u.signal},a={error:null,hasError:false,hasTimeout:false,hasAbort:false,timeoutCallback:h},A=n(()=>{a.hasAbort=true;},"abortHandler");u.signal.addEventListener("abort",A),this.error=void 0;let v={clear:n(()=>{},"clear"),enable:false},m;try{let b=n(c=>Object.assign(a,c),"updateCtx");for(let c=0;c<r+1;c++){let f={};try{let p={loading:!0};if(o&&(p.error=null),r>0&&(p.retry=c>0?r-c+1:0),c>0&&b({error:null,hasError:!1,hasTimeout:!1}),v=this.setTimeoutControl(a,p,e),this.updateComputedValue(p),a.hasAbort)throw new AbortError;if(emitStoreEvent(this.store,`observer/${this.id}/run`,{args:_,observer:this,scope:t}),m=await this.getter.call(this,t,_),a.hasAbort)throw new AbortError;a.hasTimeout||(e.raw&&markRaw(m),f.value=m,o&&(f.error=null),v.enable&&(f.timeout=0));}catch(p){if(a.hasError=!0,a.error=p,a.hasTimeout||(f.error=getError(p).message),isFunction(e.onError)){let j=e.onError(p);j!==void 0&&(f.value=j);}}finally{v.clear(),c===r&&(a.hasTimeout&&(f.error=a.error),r>0&&(f.retry=0)),f.loading=!1,this.updateComputedValue(f);}a.hasError&&r>0&&l>0&&c<r&&await C(l);}a.hasAbort?emitStoreEvent(this.store,`observer/${this.id}/cancel`,{reason:"abort",observer:this}):a.hasError||a.hasTimeout?(this.error=a.error,emitStoreEvent(this.store,`observer/${this.id}/error`,{error:a.error,observer:this})):emitStoreEvent(this.store,`observer/${this.id}/done`,{value:m,observer:this}),this.onDoneCallback(e,a.error,a.hasAbort,a.hasTimeout,t,m);}finally{u.signal.removeEventListener("abort",A);}}onDoneCallback(t,e,o,i,r,l){typeof t.onDone=="function"&&t.onDone.call(this,{id:this.id,path:this.path,value:l,error:e,abort:o,timeout:i,scope:r});}onDependsChange(t){this.store.logger.debug(()=>`AsyncComputed<${this.id}> is running by depends ${t.type}/${t.path.join(".")} operate `),this.run({operate:t,first:!this._firstRun});}getValueWatchPath(){let t=this.path.join(this.store.options.delimiter);return [`${t}.*`,t]}getDepends(){return super.getDepends().map(e=>{if(e.length===0)return e;for(let o of this.store.computedObjects.values())if(isPathEq(o.path,e)&&o.async)return [`${e.join(this.store.options.delimiter)}.value`];return e})}};function w(s,t,e){if(typeof s!="function")throw new Error("computed getter must be a function");let o=Object.assign({},getDefaultComputedOptions(),e,{async:true});o.depends=normalizeDeps(t);let i=n(()=>({type:"asyncpro",getter:s,options:o,[OBSERVER_DESCRIPTOR_FLAG]:true}),"descriptorBuilder");return i[OBSERVER_TYPE_FLAG]="asyncpro",i}n(w,"asyncComputed");function N(s){let t=s.constructor.observers;t.asyncpro=(e,o,i)=>{let r=new y(e,o,i);return e.computedObjects.set(r.id,r),r},s.options.sandbox||(s.options.sandbox={}),s.options.sandbox.context||(s.options.sandbox.context={}),s.options.sandbox.context.asyncComputed=w;}n(N,"asyncpro");x(N);export{y as AsyncProComputedObject,w as asyncComputed,N as asyncpro};//# sourceMappingURL=asyncpro.js.map
|
|
2
|
+
//# sourceMappingURL=asyncpro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/installPlugin.ts","../../../node_modules/.bun/flex-tools@1.6.6/node_modules/flex-tools/src/async/delay.ts","../../../node_modules/.bun/flex-tools@1.6.6/node_modules/flex-tools/dist/chunk-R42SWOGE.mjs","../src/utils/updateObjectVal.ts","../src/asyncpro/async.ts","../src/asyncpro/asyncComputed.ts","../src/asyncpro/index.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","delay","ms","resolve","reject","a","__require","__name","b","c","updateObjectVal","obj","keyPath","val","parent","lastIdx","length","forEach","key","idx","isMapObj","isMap","oldVal","get","Object","assign","has","set","AsyncProComputedObject","ComputedObject","_isRunning","_defaultAbortController","_userAbortController","_firstRun","lite","async","value","running","onInitOptions","options","reentry","undefined","store","onInitial","initial","createAsyncComputedValue","attach","setTimeout","immediate","run","first","onDestroy","getAbortController","abort","loading","timeout","retry","error","progress","markRaw","args","computedObjects","id","cancel","updateComputedValue","values","batchEvent","strPath","updatedCount","keys","associated","update","state","path","batch","isBatch","ops","entries","op","type","reply","operates","emit","isDisable","enable","logger","warn","toString","hadError","info","finalComputedOptions","scope","getValueScope","context","emitStoreEvent","reason","observer","executeGetter","getValue","createComputeProgressbar","opts","max","min","num","end","abortController","AbortController","signal","aborted","setTimeoutControl","ctx","initValue","timeoutValue","countdown","Array","isArray","countdownId","tmId","hasTimeout","hasError","timeoutCallback","clearInterval","setInterval","clear","clearTimeout","retryCount","retryInterval","Number","getterArgs","onTimeout","cb","getProgressbar","bind","getSnap","extras","operate","abortSignal","hasAbort","abortHandler","addEventListener","computedResult","updateCtx","i","afterUpdated","AbortError","getter","call","raw","e","getError","message","isFunction","onError","errValue","onDoneCallback","removeEventListener","onDone","onDependsChange","params","debug","join","getValueWatchPath","spath","delimiter","getDepends","map","dep","isPathEq","asyncComputed","depends","Error","getDefaultComputedOptions","normalizeDeps","descriptorBuilder","OBSERVER_DESCRIPTOR_FLAG","OBSERVER_TYPE_FLAG","asyncpro","observers","descriptor","computedObj","sandbox"],"mappings":"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","file":"asyncpro.js","sourcesContent":["import type { IAutoStorePlugin } from \"autostore\";\r\n\r\nexport function installPlugin(plugin: IAutoStorePlugin) {\r\n // @ts-ignore\r\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\r\n // @ts-ignore\r\n globalThis.__AUTOSTORE_PLUGINS__ = [];\r\n }\r\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\r\n}\r\n\r\ndeclare global {\r\n // @ts-ignore\r\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\r\n}\r\n","export async function delay(ms: number){\n return new Promise((resolve, reject) =>setTimeout(resolve, ms))\n}\n","/**\n* ---=== FlexTools ===---\n* https://zhangfisher.github.com/flex-tools \n*/\nvar i=Object.create;var f=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty;var g=a=>{throw TypeError(a)};var o=(a=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(a,{get:(b,c)=>(typeof require<\"u\"?require:b)[c]}):a)(function(a){if(typeof require<\"u\")return require.apply(this,arguments);throw Error('Dynamic require of \"'+a+'\" is not supported')});var p=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var n=(a,b,c,d)=>{if(b&&typeof b==\"object\"||typeof b==\"function\")for(let e of k(b))!m.call(a,e)&&e!==c&&f(a,e,{get:()=>b[e],enumerable:!(d=j(b,e))||d.enumerable});return a};var q=(a,b,c)=>(c=a!=null?i(l(a)):{},n(b||!a||!a.__esModule?f(c,\"default\",{value:a,enumerable:true}):c,a));var h=(a,b,c)=>b.has(a)||g(\"Cannot \"+c);var r=(a,b,c)=>(h(a,b,\"read from private field\"),c?c.call(a):b.get(a)),s=(a,b,c)=>b.has(a)?g(\"Cannot add the same private member more than once\"):b instanceof WeakSet?b.add(a):b.set(a,c),t=(a,b,c,d)=>(h(a,b,\"write to private field\"),d?d.call(a,c):b.set(a,c),c);export{o as a,p as b,q as c,r as d,s as e,t as f};//# sourceMappingURL=chunk-R42SWOGE.mjs.map\n//# sourceMappingURL=chunk-R42SWOGE.mjs.map","import { isMap } from \"autostore\";\r\n\r\n/**\r\n *\r\n * 用于更新对象的值\r\n * 采用Object.assign()的方式更新对象的值\r\n *\r\n *\r\n * @param obj\r\n * @param keyPath\r\n * @param val\r\n */\r\nexport function updateObjectVal(obj: any, keyPath: string[], val: object) {\r\n let parent = obj;\r\n const lastIdx = keyPath.length - 1;\r\n keyPath.forEach((key, idx) => {\r\n const isMapObj = isMap(parent);\r\n if (idx === lastIdx) {\r\n const oldVal: any = isMapObj ? parent.get(key) : parent[key];\r\n if (typeof oldVal === \"object\") {\r\n Object.assign(oldVal, val);\r\n }\r\n return;\r\n }\r\n if (isMapObj) {\r\n if (!parent.has(key)) {\r\n parent.set(key, {});\r\n }\r\n parent = parent.get(key);\r\n } else {\r\n if (!(key in parent)) {\r\n parent[key] = {};\r\n }\r\n parent = parent[key];\r\n }\r\n });\r\n}\r\n","/**\r\n *\r\n * 异步计算\r\n *\r\n */\r\nimport {\r\n isFunction,\r\n isPathEq,\r\n markRaw,\r\n getSnap,\r\n AbortError,\r\n emitStoreEvent,\r\n ASYNC_COMPUTED_VALUE,\r\n ComputedObject,\r\n getValueScope,\r\n getError,\r\n AsyncComputedValue,\r\n} from \"autostore\";\r\nimport type { Dict, RuntimeComputedOptions, StateOperate } from \"autostore\";\r\nimport { delay } from \"flex-tools/async/delay\";\r\nimport type {\r\n AsyncComputedProgressbar,\r\n AsyncProComputedGetterArgs,\r\n AsyncProRuntimeComputedOptions,\r\n} from \"./types\";\r\nimport { updateObjectVal } from \"../utils/updateObjectVal\";\r\n\r\ntype GetterRunContext = {\r\n error: any;\r\n hasError: boolean;\r\n hasTimeout: boolean;\r\n hasAbort: boolean;\r\n timeoutCallback: (() => void) | undefined;\r\n};\r\n\r\nexport class AsyncProComputedObject<Value = any, Scope = any> extends ComputedObject<\r\n AsyncComputedValue<Value>\r\n> {\r\n private _isRunning: boolean = false;\r\n private _defaultAbortController: AbortController | null = null;\r\n private _userAbortController?: AbortController;\r\n private _firstRun: boolean = false; // 是否已经第一次运行过\r\n /**\r\n * 用于标识这是一个简单计算对象\r\n *\r\n * 不同于全功能异步计算对象\r\n *\r\n */\r\n lite: boolean = false;\r\n override get async() {\r\n return true;\r\n }\r\n override get value() {\r\n return super.value as AsyncComputedValue<Value>;\r\n }\r\n override set value(value: AsyncComputedValue<Value>) {\r\n super.value = value;\r\n }\r\n get running() {\r\n return this._isRunning;\r\n }\r\n /**\r\n * 本方法用来处理配置参数\r\n * 主要\r\n * @param options\r\n */\r\n protected override onInitOptions(options: Required<RuntimeComputedOptions>) {\r\n if (options.reentry === undefined) options.reentry = this.store.options.reentry!;\r\n }\r\n\r\n protected onInitial() {\r\n this.initial = this.createAsyncComputedValue();\r\n this.attach();\r\n // 为什么要延迟执行?\r\n // 因为onInitial函数是在第一次读取时执行的同步操作,此时的依赖项还没有收集完毕,原始的计算函数还没有初始化\r\n // 比如{ total:computed(async()=>{ return 1+2 }) },在第一次读取total时,此时的computed函数还没有初始化\r\n // 如果这时候执行run,则total的值还是一个function,而run执行时会将运行的数据更新到total.value,total.loading 等值,\r\n // 由于total还没有初始化为{loading,value,....}对象,所以会出错\r\n setTimeout(() => {\r\n if (\r\n this.options.immediate === true ||\r\n (this.options.immediate === \"auto\" && this.options.initial === undefined)\r\n ) {\r\n this.run({ first: true });\r\n }\r\n }, 0);\r\n }\r\n /**\r\n * 销毁时取消正在进行的异步计算(复用 AbortController)\r\n */\r\n protected onDestroy() {\r\n try {\r\n if (this._isRunning) this.getAbortController().abort();\r\n } catch {}\r\n }\r\n\r\n private createAsyncComputedValue() {\r\n return Object.assign({\r\n // [ASYNC_COMPUTED_VALUE]: true,\r\n loading: false,\r\n timeout: 0,\r\n retry: 0,\r\n error: null,\r\n value: this.options.initial,\r\n progress: 0,\r\n run: markRaw((args: Dict) => {\r\n return this.store.computedObjects.run(this.id, Object.assign({}, args));\r\n }),\r\n cancel: markRaw(() => {\r\n this.getAbortController().abort();\r\n }),\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * 局部更新计算属性的值\r\n *\r\n */\r\n private updateComputedValue(values: Partial<AsyncComputedValue>) {\r\n const batchEvent = this.strPath;\r\n const updatedCount = Object.keys(values).length;\r\n if (this.associated) {\r\n this.store.update(\r\n (state) => {\r\n updateObjectVal(state, this.path!, values);\r\n },\r\n { batch: updatedCount > 1 ? batchEvent : false },\r\n );\r\n } else {\r\n Object.assign(this.value as object, values);\r\n const isBatch = updatedCount > 1;\r\n const ops: StateOperate[] = [];\r\n Object.entries(values).forEach(([key, value]) => {\r\n const op: StateOperate = {\r\n type: \"set\",\r\n path: [...this.path, key],\r\n value: value,\r\n parent: this.value,\r\n };\r\n if (isBatch) op.reply = true;\r\n this.store.operates.emit(`${this.strPath}.${key}`, op);\r\n ops.push(op);\r\n });\r\n if (isBatch) {\r\n this.store.operates.emit(this.strPath, {\r\n type: \"batch\",\r\n path: this.path,\r\n value: ops,\r\n });\r\n }\r\n }\r\n }\r\n /**\r\n *\r\n * 运行计算函数\r\n *\r\n */\r\n async run(options?: AsyncProRuntimeComputedOptions) {\r\n const { first } = options ?? {};\r\n\r\n // 1. 检查是否计算被禁用, 注意,仅点非初始化时才检查计算开关,因为第一次运行需要收集依赖,这样才能在后续运行时,随时启用/禁用计算属性\r\n if (this.isDisable(options?.enable)) {\r\n this.store.logger.warn(() => `Async computed <${this.toString()}> is disabled`);\r\n return;\r\n }\r\n // 先记录上一次运行是否出错,再清除错误记录\r\n // 用于在重新计算开始时清除状态中残留的旧error(ctx是本次新建的,读不到上次的错误)\r\n const hadError = this.error !== undefined;\r\n this.error = undefined;\r\n this._firstRun = true;\r\n if (!first) {\r\n this.store.logger.info(() => `Run async computed for : ${this.toString()}`);\r\n }\r\n\r\n // 2. 合成最终的配置参数\r\n const finalComputedOptions = (\r\n options ? Object.assign({ first }, this.options, options) : this.options\r\n ) as Required<AsyncProRuntimeComputedOptions>;\r\n\r\n // 3. 根据配置参数获取计算函数的上下文对象\r\n const scope = getValueScope<AsyncComputedValue<Value>, Scope>(\r\n this as any,\r\n \"sync\",\r\n this.context,\r\n finalComputedOptions,\r\n );\r\n // 4. 检查是否有重入\r\n const { reentry } = finalComputedOptions;\r\n if (this._isRunning && !reentry) {\r\n this.store.logger.warn(\r\n () => `Async computed: ${this.toString()} is running, can't reentry`,\r\n );\r\n emitStoreEvent(this.store, `observer/${this.id}/cancel`, {\r\n reason: \"reentry\",\r\n observer: this,\r\n });\r\n return;\r\n }\r\n this._isRunning = true; // 即所依赖项的值\r\n try {\r\n return await this.executeGetter(scope, finalComputedOptions, hadError);\r\n } finally {\r\n this._isRunning = false;\r\n }\r\n }\r\n getValue() {\r\n return this.value.value as any;\r\n }\r\n /**\r\n * computed(async (scope,{getProgressbar})=>{\r\n * const pbar = getProgressbar({max:100,min:0}) // 初始值\r\n * pbar.value(12) // 修改进度值\r\n * pbar.end() // 结束进度条\r\n * })\r\n *\r\n * @param init\r\n * @returns\r\n */\r\n private createComputeProgressbar(opts?: {\r\n max?: number;\r\n min?: number;\r\n value?: number;\r\n }): AsyncComputedProgressbar {\r\n const { max = 100, min = 0, value = 0 } = Object.assign({}, opts);\r\n this.updateComputedValue({ progress: value });\r\n return {\r\n value: (num: number) => {\r\n if (num > max) num = max;\r\n if (num < min) num = min;\r\n this.updateComputedValue({ progress: num });\r\n },\r\n end() {\r\n this.value(max);\r\n },\r\n };\r\n }\r\n /**\r\n *\r\n * AbortController是一个用于控制一个或多个请求的AbortSignal对象的生命周期的对象\r\n *\r\n *\r\n * - 整个异步对象只有一个默认的AbortController对象,仅当用户调用cancel方法时才会使用\r\n *\r\n * ,当用户指定了abortController选项时,会使用用户指定的AbortController对象\r\n *\r\n *\r\n *\r\n * @param options\r\n * @returns\r\n */\r\n private getAbortController(options?: Required<AsyncProRuntimeComputedOptions>) {\r\n if (options && typeof options.abortController === \"function\") {\r\n const abortController = options.abortController();\r\n if (abortController && abortController instanceof AbortController) {\r\n this._userAbortController = abortController;\r\n }\r\n }\r\n if (this._userAbortController) return this._userAbortController;\r\n if (!this._defaultAbortController) this._defaultAbortController = new AbortController();\r\n if (this._defaultAbortController.signal.aborted)\r\n this._defaultAbortController = new AbortController();\r\n return this._defaultAbortController;\r\n }\r\n\r\n /**\r\n * 处理超时\r\n * @param timeoutCallback\r\n * @param options\r\n * @returns\r\n */\r\n private setTimeoutControl(\r\n ctx: GetterRunContext,\r\n initValue: Partial<AsyncComputedValue>,\r\n options: Required<AsyncProRuntimeComputedOptions>,\r\n ) {\r\n const { timeout } = options;\r\n let [timeoutValue, countdown] = Array.isArray(timeout) ? timeout : [timeout, 0];\r\n\r\n let countdownId: any;\r\n let tmId: any;\r\n if (timeoutValue > 0) {\r\n initValue.timeout = countdown > 1 ? countdown : timeoutValue;\r\n tmId = setTimeout(() => {\r\n ctx.hasTimeout = true;\r\n ctx.hasError = true;\r\n ctx.error = \"TIMEOUT\";\r\n if (typeof ctx.timeoutCallback === \"function\") ctx.timeoutCallback();\r\n clearInterval(countdownId);\r\n this.updateComputedValue({\r\n loading: false,\r\n error: \"TIMEOUT\",\r\n timeout: 0,\r\n });\r\n }, timeoutValue);\r\n // 启用设置倒计时: 比如timeout= 6*1000, countdown= 6\r\n if (countdown > 1) {\r\n countdownId = setInterval(\r\n () => {\r\n this.updateComputedValue({\r\n timeout: countdown--,\r\n });\r\n if (countdown === 0) clearInterval(countdownId);\r\n },\r\n timeoutValue / (countdown + 1),\r\n );\r\n }\r\n }\r\n\r\n return {\r\n clear: () => {\r\n clearTimeout(tmId);\r\n clearInterval(countdownId);\r\n },\r\n enable: timeoutValue > 0,\r\n };\r\n }\r\n /**\r\n * 执行计算函数\r\n *\r\n */\r\n private async executeGetter(\r\n scope: any,\r\n options: Required<AsyncProRuntimeComputedOptions>,\r\n hadError = false,\r\n ) {\r\n const { retry } = options;\r\n const [retryCount, retryInterval] = retry\r\n ? Array.isArray(retry)\r\n ? retry\r\n : [Number(retry), 0]\r\n : [0, 0];\r\n\r\n let timeoutCallback: (() => void) | undefined; // 异步计算函数可以在超时时执行的回调函数\r\n\r\n const abortController = this.getAbortController(options);\r\n\r\n const getterArgs: Required<AsyncProComputedGetterArgs> = {\r\n onTimeout: (cb: () => void) => {\r\n timeoutCallback = cb;\r\n },\r\n getProgressbar: this.createComputeProgressbar.bind(this),\r\n getSnap: (scope: any) => getSnap(scope),\r\n cancel: abortController.abort.bind(abortController),\r\n extras: options.extras,\r\n operate: options.operate,\r\n first: options.first,\r\n abortSignal: abortController.signal,\r\n } as any;\r\n\r\n const ctx: GetterRunContext = {\r\n error: null,\r\n hasError: false,\r\n hasTimeout: false,\r\n hasAbort: false,\r\n timeoutCallback,\r\n };\r\n\r\n // 侦听中止信号,以便在中止时能停止\r\n const abortHandler = () => {\r\n ctx.hasAbort = true;\r\n };\r\n abortController.signal.addEventListener(\"abort\", abortHandler);\r\n this.error = undefined;\r\n let timeout = { clear: () => {}, enable: false };\r\n let computedResult: any;\r\n\r\n try {\r\n const updateCtx = (values: Partial<GetterRunContext>) => Object.assign(ctx, values);\r\n for (let i = 0; i < retryCount + 1; i++) {\r\n const afterUpdated: Partial<AsyncComputedValue> = {}; // 保存执行完成后需要更新的内容,以便在最后一次执行后更新状态\r\n try {\r\n // 1. 初始化数据\r\n const initValue: Partial<AsyncComputedValue> = {\r\n loading: true,\r\n };\r\n // 上一次运行出错时,在开始计算前清除状态中残留的旧error\r\n // (ctx是本次新建的读不到上次错误,hadError由run()在清除this.error前捕获)\r\n if (hadError) initValue.error = null;\r\n\r\n if (retryCount > 0) initValue.retry = i > 0 ? retryCount - i + 1 : 0;\r\n\r\n if (i > 0) {\r\n updateCtx({\r\n error: null,\r\n hasError: false,\r\n hasTimeout: false,\r\n });\r\n }\r\n\r\n timeout = this.setTimeoutControl(ctx, initValue, options);\r\n\r\n this.updateComputedValue(initValue);\r\n\r\n // 如果有中止信号,则取消计算\r\n if (ctx.hasAbort) throw new AbortError();\r\n // 执行回调\r\n emitStoreEvent(this.store, `observer/${this.id}/run`, {\r\n args: getterArgs,\r\n observer: this,\r\n scope,\r\n });\r\n // 执行计算函数\r\n computedResult = await this.getter.call(this, scope, getterArgs);\r\n if (ctx.hasAbort) throw new AbortError();\r\n if (!ctx.hasTimeout) {\r\n if (options.raw) markRaw(computedResult);\r\n afterUpdated.value = computedResult;\r\n // 计算成功时必须清除上一次的错误,否则旧的error会一直残留在状态中\r\n if (hadError) afterUpdated.error = null;\r\n if (timeout.enable) afterUpdated.timeout = 0;\r\n }\r\n } catch (e: any) {\r\n ctx.hasError = true;\r\n ctx.error = e;\r\n if (!ctx.hasTimeout) afterUpdated.error = getError(e).message;\r\n if (isFunction(options.onError)) {\r\n const errValue = options.onError(e);\r\n if (errValue !== undefined) afterUpdated.value = errValue;\r\n }\r\n } finally {\r\n timeout.clear();\r\n if (i === retryCount) {\r\n // 最后一次执行时\r\n if (ctx.hasTimeout) afterUpdated.error = ctx.error;\r\n if (retryCount > 0) afterUpdated.retry = 0;\r\n }\r\n afterUpdated.loading = false;\r\n this.updateComputedValue(afterUpdated);\r\n }\r\n // 出错时重试延迟, 最后一次不延迟\r\n if (ctx.hasError) {\r\n if (retryCount > 0 && retryInterval > 0 && i < retryCount) {\r\n await delay(retryInterval);\r\n }\r\n }\r\n }\r\n // 计算完成后触发事件\r\n if (ctx.hasAbort) {\r\n emitStoreEvent(this.store, `observer/${this.id}/cancel`, {\r\n reason: \"abort\",\r\n observer: this,\r\n });\r\n } else if (ctx.hasError || ctx.hasTimeout) {\r\n this.error = ctx.error;\r\n emitStoreEvent(this.store, `observer/${this.id}/error`, {\r\n error: ctx.error,\r\n observer: this,\r\n });\r\n } else {\r\n emitStoreEvent(this.store, `observer/${this.id}/done`, {\r\n value: computedResult,\r\n observer: this,\r\n });\r\n }\r\n this.onDoneCallback(\r\n options,\r\n ctx.error,\r\n ctx.hasAbort,\r\n ctx.hasTimeout,\r\n scope,\r\n computedResult,\r\n );\r\n } finally {\r\n // 清理 abort 事件监听器,防止内存泄漏\r\n abortController.signal.removeEventListener(\"abort\", abortHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 当计算属性操作完成时的回调函数\r\n *\r\n * 此函数负责在计算属性操作完成后,根据操作的执行状态调用用户定义的回调函数\r\n * 它会传递操作的结果、错误状态、是否中止以及是否超时等信息给回调函数\r\n *\r\n * @param options - 计算属性的运行时选项,被强制转换为Required类型,确保所有选项都是必需的\r\n * @param error - 如果操作过程中发生错误,该错误对象将被传递\r\n * @param abort - 一个布尔值,表示操作是否被中止\r\n * @param timeout - 一个布尔值,表示操作是否因超时而结束\r\n * @param scope - 操作执行的上下文或范围\r\n * @param value - 操作的结果,如果操作成功完成\r\n */\r\n private onDoneCallback(\r\n options: Required<RuntimeComputedOptions>,\r\n error: Error,\r\n abort: boolean,\r\n timeout: boolean,\r\n scope: any,\r\n value: any,\r\n ) {\r\n if (typeof options.onDone !== \"function\") return;\r\n options.onDone.call(this, {\r\n id: this.id,\r\n path: this.path,\r\n value,\r\n error,\r\n abort,\r\n timeout,\r\n scope,\r\n });\r\n }\r\n protected onDependsChange(params: StateOperate) {\r\n this.store.logger.debug(\r\n () =>\r\n `AsyncComputed<${this.id}> is running by depends ${params.type}/${params.path.join(\r\n \".\",\r\n )} operate `,\r\n );\r\n this.run({\r\n operate: params,\r\n first: !this._firstRun,\r\n });\r\n }\r\n /**\r\n *\r\n * 由于异步计算是一个对象,所以我们需要侦听的是对象的变化,而不仅是对象的值\r\n *\r\n */\r\n protected getValueWatchPath() {\r\n const spath = this.path!.join(this.store.options.delimiter);\r\n return [`${spath}.*`, spath];\r\n }\r\n /**\r\n * 由于所有异步计算属性均会被转换为一个AsyncComputedValue<{value,timeout,....}>的形式\r\n * 这样,当我们在指定一个依赖是异步属性时,就需要指定为xxxx.value才可以个侦听到变化\r\n *\r\n * @example\r\n * const store = new AutoStore({\r\n * a0: 1,\r\n * a1: computed(async (scope:any)=>{\r\n * return scope.a0 + 1\r\n * },[\"a0\"],{initial:2}),\r\n * a2: computed(async (scope:any)=>{\r\n * return scope.a1.value + 1\r\n * },[\"a1.value\"],{initial:3})\r\n * });\r\n *\r\n * 以上a2依赖于a1,由于a1是一个异步对象,所以在写依赖时就必须写上[\"a1.value\"]\r\n * 这就有点反直觉了。\r\n *\r\n * 本函数在异步计算对象订阅变更事件时调用,用来返回字符串形式的依赖数组\r\n *\r\n * 本函数的功能就是对所有依赖进行判断如果其是一个异步计算依赖,则自动添加.value,这样就可以如下方式来写依赖了\r\n *\r\n * \tconst store = new AutoStore({\r\n * a0: 1,\r\n * a1: computed(async (scope:any)=>{\r\n * return scope.a0 + 1\r\n * },[\"a0\"],{initial:2}),\r\n * a2: computed(async (scope:any)=>{\r\n * return scope.a1.value + 1\r\n * },[\"a1\"],{initial:3})\r\n * });\r\n *\r\n */\r\n protected getDepends() {\r\n const depends = super.getDepends();\r\n return depends.map((dep) => {\r\n if (dep.length === 0) return dep;\r\n for (const obj of this.store.computedObjects.values()) {\r\n if (isPathEq(obj.path, dep) && obj.async) {\r\n return [`${dep.join(this.store.options.delimiter)}.value`];\r\n }\r\n }\r\n return dep;\r\n }) as unknown as string[][];\r\n }\r\n}\r\n","import {\r\n OBSERVER_DESCRIPTOR_FLAG,\r\n OBSERVER_TYPE_FLAG,\r\n normalizeDeps,\r\n AsyncComputedValue,\r\n getDefaultComputedOptions,\r\n} from \"autostore\";\r\nimport type { ComputedDepends } from \"autostore\";\r\nimport type {\r\n AsyncProComputedGetter,\r\n AsyncProComputedOptions,\r\n AsyncProComputedDescriptorBuilder,\r\n AsyncProComputedDescriptor,\r\n} from \"./types\";\r\n\r\n/**\r\n * 用来封装状态的计算函数,使用计算函数的传入的是当前对象\r\n *\r\n *\r\n * @param getter\r\n * @param depends\r\n * @param options\r\n * @returns\r\n *\r\n */\r\nexport function asyncComputed<Value = any, Scope = any>(\r\n getter: AsyncProComputedGetter<Value, Scope>,\r\n depends: ComputedDepends,\r\n options?: AsyncProComputedOptions<Value, Scope>,\r\n): AsyncProComputedDescriptorBuilder<AsyncComputedValue<Value>, Scope> {\r\n if (typeof getter !== \"function\") throw new Error(\"computed getter must be a function\");\r\n // 解析参数:同时支持同步和异步计算函数两种方式声明\r\n const opts: AsyncProComputedOptions = Object.assign({}, getDefaultComputedOptions(), options, {\r\n async: true,\r\n });\r\n opts.depends = normalizeDeps(depends);\r\n\r\n const descriptorBuilder = () => {\r\n return {\r\n type: \"asyncpro\",\r\n getter,\r\n options: opts,\r\n [OBSERVER_DESCRIPTOR_FLAG]: true,\r\n } as unknown as AsyncProComputedDescriptor<Value, Scope>;\r\n };\r\n descriptorBuilder[OBSERVER_TYPE_FLAG] = \"asyncpro\";\r\n return descriptorBuilder as unknown as AsyncProComputedDescriptorBuilder<\r\n AsyncComputedValue<Value>,\r\n Scope\r\n >;\r\n}\r\n","/**\r\n * shadow 插件\r\n *\r\n * 为 AutoStore 注入影子 store(shadowStore)能力:\r\n * - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法\r\n * - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state\r\n * - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算\r\n * - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)\r\n *\r\n * shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。\r\n * 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT\r\n * (不能是 CURRENT 或相对路径)。\r\n *\r\n * @example\r\n *\r\n * import { AutoStore, computed } from \"autostore\";\r\n * import { shadow } from \"@autostorejs/plugins\";\r\n *\r\n * const store = new AutoStore({ price: 10, count: 3 });\r\n * shadow(store); // 安装插件,挂载 store.shadow 方法\r\n *\r\n * const shadowStore = store.shadow({\r\n * total: computed((scope) => scope.price * scope.count),\r\n * });\r\n *\r\n * shadowStore.state.total; // 30\r\n * store.state.count = 4;\r\n * shadowStore.state.total; // 40\r\n */\r\n\r\nimport { AutoStore } from \"autostore\";\r\nimport type { AnyAutoStore, Dict, AnyObserverDescriptor, ObserverContext } from \"autostore\";\r\nimport { installPlugin } from \"../utils/installPlugin\";\r\nimport { AsyncProComputedObject } from \"./async\";\r\nimport { asyncComputed } from \"./asyncComputed\";\r\n\r\n/**\r\n * shadow 插件入口\r\n *\r\n * 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。\r\n *\r\n * @param store 目标 AutoStore 实例\r\n * @returns 无返回值,副作用是给 store 挂载 shadow 方法\r\n */\r\nexport function asyncpro(store: AnyAutoStore) {\r\n const observers = (store.constructor as typeof AutoStore).observers;\r\n observers[\"asyncpro\"] = (\r\n store: AnyAutoStore,\r\n descriptor: AnyObserverDescriptor,\r\n context?: ObserverContext,\r\n ) => {\r\n const computedObj = new AsyncProComputedObject(store, descriptor, context);\r\n store.computedObjects.set(computedObj.id, computedObj);\r\n return computedObj;\r\n };\r\n\r\n if (!store.options.sandbox) store.options.sandbox = {};\r\n if (!store.options.sandbox.context) store.options.sandbox.context = {};\r\n // 注意:必须追加而非整体覆盖 context\r\n // 否则会丢失用户在 sandbox.context 中自定义注入的变量(如测试中的 data 等)\r\n store.options.sandbox.context.asyncComputed = asyncComputed;\r\n}\r\n\r\ninstallPlugin(asyncpro);\r\n\r\ndeclare module \"autostore\" {\r\n interface AutoStore<State extends Dict, Options = unknown> {}\r\n interface ObserverObjects {\r\n asyncpro: AsyncProComputedObject;\r\n }\r\n interface AsyncComputedObjects {\r\n asyncpro: AsyncProComputedObject;\r\n }\r\n}\r\n\r\nexport * from \"./asyncComputed\";\r\nexport * from \"./async\";\r\nexport * from \"./types\";\r\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var autostore=require('autostore');var P=Object.defineProperty;var n=(s,t)=>P(s,"name",{value:t,configurable:true}),d=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});function m(s){globalThis.__AUTOSTORE_PLUGINS__||(globalThis.__AUTOSTORE_PLUGINS__=[]),globalThis.__AUTOSTORE_PLUGINS__.push(s);}n(m,"installPlugin");function R(s){s.trace=function(t,r){let o;return {stop:n(()=>o?.off(),"stop"),start:n(async i=>{let e=[];return new Promise(a=>{o=this.watch(l=>{e.push(l),i?.(l)&&(o.off(),a(e));},{operates:r}),Promise.resolve(t()).finally(()=>{typeof i!="function"&&(o.off(),a(e));});})},"start")}};}n(R,"trace");m(R);function $(s){s.shadow=function(t,r){let o=new autostore.AutoStore(t,Object.assign({},r,{id:`${s.id}_shadow`,getRootScope:n(()=>s.state,"getRootScope"),getShadowStore:n(()=>s,"getShadowStore"),debug:s.options.debug,shadow:true,onObserverBeforeCreate:n(e=>{let a=e.options.scope;(!a||autostore.isRelPath(a))&&(e.options.scope="ROOT");},"onObserverBeforeCreate")})),i=s.watch(e=>{e.shadow=true,o.operates.emit(e.path.join(autostore.PATH_DELIMITER),e);});return o.once("unload",()=>i.off()),o};}n($,"shadow");m($);async function O(s){return new Promise((t,r)=>setTimeout(t,s))}n(O,"t");(s=>typeof d<"u"?d:typeof Proxy<"u"?new Proxy(s,{get:n((t,r)=>(typeof d<"u"?d:t)[r],"get")}):s)(function(s){if(typeof d<"u")return d.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});function T(s,t,r){let o=s,i=t.length-1;t.forEach((e,a)=>{let l=autostore.isMap(o);if(a===i){let h=l?o.get(e):o[e];typeof h=="object"&&Object.assign(h,r);return}l?(o.has(e)||o.set(e,{}),o=o.get(e)):(e in o||(o[e]={}),o=o[e]);});}n(T,"updateObjectVal");var v=class extends autostore.ComputedObject{static{n(this,"AsyncProComputedObject");}_isRunning=false;_defaultAbortController=null;_userAbortController;_firstRun=false;lite=false;get async(){return true}get value(){return super.value}set value(t){super.value=t;}get running(){return this._isRunning}onInitOptions(t){t.reentry===void 0&&(t.reentry=this.store.options.reentry);}onInitial(){this.initial=this.createAsyncComputedValue(),this.attach(),setTimeout(()=>{(this.options.immediate===true||this.options.immediate==="auto"&&this.options.initial===void 0)&&this.run({first:true});},0);}onDestroy(){try{this._isRunning&&this.getAbortController().abort();}catch{}}createAsyncComputedValue(){return Object.assign({loading:false,timeout:0,retry:0,error:null,value:this.options.initial,progress:0,run:autostore.markRaw(t=>this.store.computedObjects.run(this.id,Object.assign({},t))),cancel:autostore.markRaw(()=>{this.getAbortController().abort();})})}updateComputedValue(t){let r=this.strPath,o=Object.keys(t).length;if(this.associated)this.store.update(i=>{T(i,this.path,t);},{batch:o>1?r:false});else {Object.assign(this.value,t);let i=o>1,e=[];Object.entries(t).forEach(([a,l])=>{let h={type:"set",path:[...this.path,a],value:l,parent:this.value};i&&(h.reply=true),this.store.operates.emit(`${this.strPath}.${a}`,h),e.push(h);}),i&&this.store.operates.emit(this.strPath,{type:"batch",path:this.path,value:e});}}async run(t){let{first:r}=t??{};if(this.isDisable(t?.enable)){this.store.logger.warn(()=>`Async computed <${this.toString()}> is disabled`);return}let o=this.error!==void 0;this.error=void 0,this._firstRun=true,r||this.store.logger.info(()=>`Run async computed for : ${this.toString()}`);let i=t?Object.assign({first:r},this.options,t):this.options,e=autostore.getValueScope(this,"sync",this.context,i),{reentry:a}=i;if(this._isRunning&&!a){this.store.logger.warn(()=>`Async computed: ${this.toString()} is running, can't reentry`),autostore.emitStoreEvent(this.store,`observer/${this.id}/cancel`,{reason:"reentry",observer:this});return}this._isRunning=true;try{return await this.executeGetter(e,i,o)}finally{this._isRunning=false;}}getValue(){return this.value.value}createComputeProgressbar(t){let{max:r=100,min:o=0,value:i=0}=Object.assign({},t);return this.updateComputedValue({progress:i}),{value:n(e=>{e>r&&(e=r),e<o&&(e=o),this.updateComputedValue({progress:e});},"value"),end(){this.value(r);}}}getAbortController(t){if(t&&typeof t.abortController=="function"){let r=t.abortController();r&&r instanceof AbortController&&(this._userAbortController=r);}return this._userAbortController?this._userAbortController:(this._defaultAbortController||(this._defaultAbortController=new AbortController),this._defaultAbortController.signal.aborted&&(this._defaultAbortController=new AbortController),this._defaultAbortController)}setTimeoutControl(t,r,o){let{timeout:i}=o,[e,a]=Array.isArray(i)?i:[i,0],l,h;return e>0&&(r.timeout=a>1?a:e,h=setTimeout(()=>{t.hasTimeout=true,t.hasError=true,t.error="TIMEOUT",typeof t.timeoutCallback=="function"&&t.timeoutCallback(),clearInterval(l),this.updateComputedValue({loading:false,error:"TIMEOUT",timeout:0});},e),a>1&&(l=setInterval(()=>{this.updateComputedValue({timeout:a--}),a===0&&clearInterval(l);},e/(a+1)))),{clear:n(()=>{clearTimeout(h),clearInterval(l);},"clear"),enable:e>0}}async executeGetter(t,r,o=false){let{retry:i}=r,[e,a]=i?Array.isArray(i)?i:[Number(i),0]:[0,0],l,h=this.getAbortController(r),A={onTimeout:n(g=>{l=g;},"onTimeout"),getProgressbar:this.createComputeProgressbar.bind(this),getSnap:n(g=>autostore.getSnap(g),"getSnap"),cancel:h.abort.bind(h),extras:r.extras,operate:r.operate,first:r.first,abortSignal:h.signal},u={error:null,hasError:false,hasTimeout:false,hasAbort:false,timeoutCallback:l},w=n(()=>{u.hasAbort=true;},"abortHandler");h.signal.addEventListener("abort",w),this.error=void 0;let C={clear:n(()=>{},"clear"),enable:false},b;try{let g=n(c=>Object.assign(u,c),"updateCtx");for(let c=0;c<e+1;c++){let f={};try{let p={loading:!0};if(o&&(p.error=null),e>0&&(p.retry=c>0?e-c+1:0),c>0&&g({error:null,hasError:!1,hasTimeout:!1}),C=this.setTimeoutControl(u,p,r),this.updateComputedValue(p),u.hasAbort)throw new autostore.AbortError;if(autostore.emitStoreEvent(this.store,`observer/${this.id}/run`,{args:A,observer:this,scope:t}),b=await this.getter.call(this,t,A),u.hasAbort)throw new autostore.AbortError;u.hasTimeout||(r.raw&&autostore.markRaw(b),f.value=b,o&&(f.error=null),C.enable&&(f.timeout=0));}catch(p){if(u.hasError=!0,u.error=p,u.hasTimeout||(f.error=autostore.getError(p).message),autostore.isFunction(r.onError)){let x=r.onError(p);x!==void 0&&(f.value=x);}}finally{C.clear(),c===e&&(u.hasTimeout&&(f.error=u.error),e>0&&(f.retry=0)),f.loading=!1,this.updateComputedValue(f);}u.hasError&&e>0&&a>0&&c<e&&await O(a);}u.hasAbort?autostore.emitStoreEvent(this.store,`observer/${this.id}/cancel`,{reason:"abort",observer:this}):u.hasError||u.hasTimeout?(this.error=u.error,autostore.emitStoreEvent(this.store,`observer/${this.id}/error`,{error:u.error,observer:this})):autostore.emitStoreEvent(this.store,`observer/${this.id}/done`,{value:b,observer:this}),this.onDoneCallback(r,u.error,u.hasAbort,u.hasTimeout,t,b);}finally{h.signal.removeEventListener("abort",w);}}onDoneCallback(t,r,o,i,e,a){typeof t.onDone=="function"&&t.onDone.call(this,{id:this.id,path:this.path,value:a,error:r,abort:o,timeout:i,scope:e});}onDependsChange(t){this.store.logger.debug(()=>`AsyncComputed<${this.id}> is running by depends ${t.type}/${t.path.join(".")} operate `),this.run({operate:t,first:!this._firstRun});}getValueWatchPath(){let t=this.path.join(this.store.options.delimiter);return [`${t}.*`,t]}getDepends(){return super.getDepends().map(r=>{if(r.length===0)return r;for(let o of this.store.computedObjects.values())if(autostore.isPathEq(o.path,r)&&o.async)return [`${r.join(this.store.options.delimiter)}.value`];return r})}};function E(s,t,r){if(typeof s!="function")throw new Error("computed getter must be a function");let o=Object.assign({},autostore.getDefaultComputedOptions(),r,{async:true});o.depends=autostore.normalizeDeps(t);let i=n(()=>({type:"asyncpro",getter:s,options:o,[autostore.OBSERVER_DESCRIPTOR_FLAG]:true}),"descriptorBuilder");return i[autostore.OBSERVER_TYPE_FLAG]="asyncpro",i}n(E,"asyncComputed");function z(s){let t=s.constructor.observers;t.asyncpro=(r,o,i)=>{let e=new v(r,o,i);return r.computedObjects.set(e.id,e),e},s.options.sandbox||(s.options.sandbox={}),s.options.sandbox.context||(s.options.sandbox.context={}),s.options.sandbox.context.asyncComputed=E;}n(z,"asyncpro");m(z);exports.AsyncProComputedObject=v;exports.asyncComputed=E;exports.asyncpro=z;exports.shadow=$;exports.trace=R;//# sourceMappingURL=index.cjs.map
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/installPlugin.ts","../src/trace.ts","../src/shadow.ts","../../../node_modules/.bun/flex-tools@1.6.6/node_modules/flex-tools/src/async/delay.ts","../../../node_modules/.bun/flex-tools@1.6.6/node_modules/flex-tools/dist/chunk-R42SWOGE.mjs","../src/utils/updateObjectVal.ts","../src/asyncpro/async.ts","../src/asyncpro/asyncComputed.ts","../src/asyncpro/index.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","trace","store","fn","operates","watcher","stop","__name","off","start","isStop","ops","Promise","resolve","watch","operate","finally","shadow","state","options","shadowStore","AutoStore","Object","assign","id","getRootScope","getShadowStore","debug","onObserverBeforeCreate","descriptor","scope","isRelPath","emit","path","join","PATH_DELIMITER","once","delay","ms","reject","o","a","__require","b","c","updateObjectVal","obj","keyPath","val","parent","lastIdx","length","forEach","key","idx","isMapObj","isMap","oldVal","get","has","set","AsyncProComputedObject","ComputedObject","_isRunning","_defaultAbortController","_userAbortController","_firstRun","lite","async","value","running","onInitOptions","reentry","undefined","onInitial","initial","createAsyncComputedValue","attach","setTimeout","immediate","run","first","onDestroy","getAbortController","abort","loading","timeout","retry","error","progress","markRaw","args","computedObjects","cancel","updateComputedValue","values","batchEvent","strPath","updatedCount","keys","associated","update","batch","isBatch","entries","op","type","reply","isDisable","enable","logger","warn","toString","hadError","info","finalComputedOptions","getValueScope","context","emitStoreEvent","reason","observer","executeGetter","getValue","createComputeProgressbar","opts","max","min","num","end","abortController","AbortController","signal","aborted","setTimeoutControl","ctx","initValue","timeoutValue","countdown","Array","isArray","countdownId","tmId","hasTimeout","hasError","timeoutCallback","clearInterval","setInterval","clear","clearTimeout","retryCount","retryInterval","Number","getterArgs","onTimeout","cb","getProgressbar","bind","getSnap","extras","abortSignal","hasAbort","abortHandler","addEventListener","computedResult","updateCtx","i","afterUpdated","AbortError","getter","call","raw","e","getError","message","isFunction","onError","errValue","onDoneCallback","removeEventListener","onDone","onDependsChange","params","getValueWatchPath","spath","delimiter","getDepends","map","dep","isPathEq","asyncComputed","depends","Error","getDefaultComputedOptions","normalizeDeps","descriptorBuilder","OBSERVER_DESCRIPTOR_FLAG","OBSERVER_TYPE_FLAG","asyncpro","observers","computedObj","sandbox"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { IAutoStorePlugin } from \"autostore\";\r\n\r\nexport function installPlugin(plugin: IAutoStorePlugin) {\r\n // @ts-ignore\r\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\r\n // @ts-ignore\r\n globalThis.__AUTOSTORE_PLUGINS__ = [];\r\n }\r\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\r\n}\r\n\r\ndeclare global {\r\n // @ts-ignore\r\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\r\n}\r\n","/**\r\n * 跟踪函数内部的操作\r\n *\r\n * 主要用于调试,跟踪函数内部的操作\r\n *\r\n * 比如我们想要知道执行一个state.xxx=1时,会触发哪些操作,可以通过此方法来跟踪\r\n *\r\n * 注意: 本方法主要用于调试,不要在生产环境中使用\r\n *\r\n * @example\r\n *\r\n * - 跟踪同步函数内部的操作\r\n * trace((state)=>{\r\n * state.xxx.xxx = 1\r\n * },(operate)=>{\r\n * console.log(operate)\r\n * })\r\n *\r\n * - 跟踪异步函数内部的操作???\r\n *\r\n * 注意:\r\n * 由于无法控制异步上下文,特别是在同时运行多个异步trace函数时,不同的trace函数可能会相互干扰,无法区分。\r\n * 因此,异步函数的跟踪难以实现,只能用在调试时且只运行单个异步trace函数时使用\r\n *\r\n * const store= new AutoStore({\r\n * price:10,\r\n * count:2,\r\n * total: async (state)=>{\r\n * await delay(1000)\r\n * return state.price * state.count\r\n * }\r\n * })\r\n *\r\n *\r\n *\r\n * const fn = async ()=>{\r\n * await fetch('xxxx')\r\n * store.state.price = 20\r\n * store.state.count= 3\r\n * }\r\n * 我们想要知道fn执行时会触发哪些操作,可以通过trace来跟踪\r\n * const ops = await trace(fn).start()\r\n *\r\n *\r\n * 我们可以看到,fn执行时,只有显式的对price和count,但是由于total是异步计算属性,所以也会触发total的变化。\r\n * 因此也应该被跟踪,但是由于其是异步计算属性,所以不会被跟踪。\r\n * 因此需要显式的提供一个abort参数来结束包括异步的跟踪过程\r\n *\r\n *\r\n * stateTracker.stop() // 取消跟踪\r\n * const operates = await stateTracker.start((operate)=>{\r\n * return operate.type=='set' && path[0]==='total'\r\n * }) // 开始跟踪\r\n *\r\n *\r\n * @param fn\r\n * @param operates\r\n * @returns\r\n */\r\n\r\nimport type { StateOperate, Watcher, WatchListenerOptions, AnyAutoStore, Dict } from \"autostore\";\r\nimport { installPlugin } from \"./utils/installPlugin\";\r\n\r\nexport type StateTracker = {\r\n stop: () => void;\r\n start(isStop?: (operate: StateOperate) => boolean): Promise<StateOperate[]>;\r\n};\r\n\r\nexport function trace(store: AnyAutoStore) {\r\n store.trace = function (\r\n fn: () => any,\r\n operates?: WatchListenerOptions[\"operates\"],\r\n ): StateTracker {\r\n let watcher: Watcher;\r\n return {\r\n stop: () => watcher?.off(),\r\n start: async (isStop?: (operate: StateOperate) => boolean) => {\r\n const ops: StateOperate[] = [];\r\n return new Promise((resolve) => {\r\n watcher = this.watch(\r\n (operate) => {\r\n ops.push(operate);\r\n if (isStop?.(operate)) {\r\n watcher.off();\r\n resolve(ops);\r\n }\r\n },\r\n { operates },\r\n );\r\n Promise.resolve(fn()).finally(() => {\r\n if (typeof isStop !== \"function\") {\r\n watcher.off();\r\n resolve(ops);\r\n }\r\n });\r\n });\r\n },\r\n };\r\n };\r\n}\r\ndeclare module \"autostore\" {\r\n export interface AutoStore<State extends Dict, Options = unknown> {\r\n trace(fn: () => any, operates?: WatchListenerOptions[\"operates\"]): StateTracker;\r\n }\r\n}\r\ninstallPlugin(trace);\r\n","/**\r\n * shadow 插件\r\n *\r\n * 为 AutoStore 注入影子 store(shadowStore)能力:\r\n * - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法\r\n * - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state\r\n * - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算\r\n * - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)\r\n *\r\n * shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。\r\n * 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT\r\n * (不能是 CURRENT 或相对路径)。\r\n *\r\n * @example\r\n *\r\n * import { AutoStore, computed } from \"autostore\";\r\n * import { shadow } from \"@autostorejs/plugins\";\r\n *\r\n * const store = new AutoStore({ price: 10, count: 3 });\r\n * shadow(store); // 安装插件,挂载 store.shadow 方法\r\n *\r\n * const shadowStore = store.shadow({\r\n * total: computed((scope) => scope.price * scope.count),\r\n * });\r\n *\r\n * shadowStore.state.total; // 30\r\n * store.state.count = 4;\r\n * shadowStore.state.total; // 40\r\n */\r\n\r\nimport { AutoStore, isRelPath, PATH_DELIMITER } from \"autostore\";\r\nimport type { AutoStoreOptions, ObserverDescriptor, AnyAutoStore, Dict } from \"autostore\";\r\nimport { installPlugin } from \"./utils/installPlugin\";\r\n\r\n/**\r\n * shadow 插件入口\r\n *\r\n * 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。\r\n *\r\n * @param store 目标 AutoStore 实例\r\n * @returns 无返回值,副作用是给 store 挂载 shadow 方法\r\n */\r\nexport function shadow(store: AnyAutoStore) {\r\n store.shadow = function <T extends Dict>(state: T, options?: AutoStoreOptions<T>) {\r\n const shadowStore = new AutoStore(\r\n state,\r\n Object.assign({}, options, {\r\n id: `${store.id}_shadow`,\r\n getRootScope: () => store.state,\r\n getShadowStore: () => store,\r\n debug: store.options.debug,\r\n shadow: true,\r\n onObserverBeforeCreate: (descriptor: ObserverDescriptor<any, any, any>) => {\r\n //除非显式指定scope,并且scope不能是CURRENT\r\n // 因为动态创建的observer不能是CURRENT,也不能是相对路径\r\n const scope = descriptor.options.scope;\r\n if (!scope || isRelPath(scope)) {\r\n descriptor.options.scope = \"ROOT\";\r\n }\r\n },\r\n }),\r\n ) as AutoStore<T>;\r\n\r\n // 将操作转到到shadowStore\r\n const watcher = store.watch((operate) => {\r\n operate.shadow = true;\r\n shadowStore.operates.emit(operate.path.join(PATH_DELIMITER), operate);\r\n });\r\n shadowStore.once(\"unload\", () => watcher.off());\r\n return shadowStore;\r\n };\r\n}\r\ndeclare module \"autostore\" {\r\n export interface AutoStore<State extends Dict, Options = unknown> {\r\n /**\r\n * 基于当前 store 创建一个影子 store(shadowStore)\r\n *\r\n * shadowStore 不持有独立业务状态,其计算属性的作用域指向原 store 的 state;\r\n * 原 store 的写操作会转发到 shadowStore 并触发其计算属性重算。\r\n *\r\n * @param state 影子 store 的状态定义(通常只包含 computed 计算属性)\r\n * @param options 额外的 AutoStore 配置,会与内部 shadow 配置合并\r\n * @returns 新建的 shadowStore 实例\r\n */\r\n shadow<T extends Dict>(state: T, options?: AutoStoreOptions<T>): AutoStore<T>;\r\n }\r\n}\r\n\r\ninstallPlugin(shadow);\r\n","export async function delay(ms: number){\n return new Promise((resolve, reject) =>setTimeout(resolve, ms))\n}\n","/**\n* ---=== FlexTools ===---\n* https://zhangfisher.github.com/flex-tools \n*/\nvar i=Object.create;var f=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty;var g=a=>{throw TypeError(a)};var o=(a=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(a,{get:(b,c)=>(typeof require<\"u\"?require:b)[c]}):a)(function(a){if(typeof require<\"u\")return require.apply(this,arguments);throw Error('Dynamic require of \"'+a+'\" is not supported')});var p=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var n=(a,b,c,d)=>{if(b&&typeof b==\"object\"||typeof b==\"function\")for(let e of k(b))!m.call(a,e)&&e!==c&&f(a,e,{get:()=>b[e],enumerable:!(d=j(b,e))||d.enumerable});return a};var q=(a,b,c)=>(c=a!=null?i(l(a)):{},n(b||!a||!a.__esModule?f(c,\"default\",{value:a,enumerable:true}):c,a));var h=(a,b,c)=>b.has(a)||g(\"Cannot \"+c);var r=(a,b,c)=>(h(a,b,\"read from private field\"),c?c.call(a):b.get(a)),s=(a,b,c)=>b.has(a)?g(\"Cannot add the same private member more than once\"):b instanceof WeakSet?b.add(a):b.set(a,c),t=(a,b,c,d)=>(h(a,b,\"write to private field\"),d?d.call(a,c):b.set(a,c),c);export{o as a,p as b,q as c,r as d,s as e,t as f};//# sourceMappingURL=chunk-R42SWOGE.mjs.map\n//# sourceMappingURL=chunk-R42SWOGE.mjs.map","import { isMap } from \"autostore\";\r\n\r\n/**\r\n *\r\n * 用于更新对象的值\r\n * 采用Object.assign()的方式更新对象的值\r\n *\r\n *\r\n * @param obj\r\n * @param keyPath\r\n * @param val\r\n */\r\nexport function updateObjectVal(obj: any, keyPath: string[], val: object) {\r\n let parent = obj;\r\n const lastIdx = keyPath.length - 1;\r\n keyPath.forEach((key, idx) => {\r\n const isMapObj = isMap(parent);\r\n if (idx === lastIdx) {\r\n const oldVal: any = isMapObj ? parent.get(key) : parent[key];\r\n if (typeof oldVal === \"object\") {\r\n Object.assign(oldVal, val);\r\n }\r\n return;\r\n }\r\n if (isMapObj) {\r\n if (!parent.has(key)) {\r\n parent.set(key, {});\r\n }\r\n parent = parent.get(key);\r\n } else {\r\n if (!(key in parent)) {\r\n parent[key] = {};\r\n }\r\n parent = parent[key];\r\n }\r\n });\r\n}\r\n","/**\r\n *\r\n * 异步计算\r\n *\r\n */\r\nimport {\r\n isFunction,\r\n isPathEq,\r\n markRaw,\r\n getSnap,\r\n AbortError,\r\n emitStoreEvent,\r\n ASYNC_COMPUTED_VALUE,\r\n ComputedObject,\r\n getValueScope,\r\n getError,\r\n AsyncComputedValue,\r\n} from \"autostore\";\r\nimport type { Dict, RuntimeComputedOptions, StateOperate } from \"autostore\";\r\nimport { delay } from \"flex-tools/async/delay\";\r\nimport type {\r\n AsyncComputedProgressbar,\r\n AsyncProComputedGetterArgs,\r\n AsyncProRuntimeComputedOptions,\r\n} from \"./types\";\r\nimport { updateObjectVal } from \"../utils/updateObjectVal\";\r\n\r\ntype GetterRunContext = {\r\n error: any;\r\n hasError: boolean;\r\n hasTimeout: boolean;\r\n hasAbort: boolean;\r\n timeoutCallback: (() => void) | undefined;\r\n};\r\n\r\nexport class AsyncProComputedObject<Value = any, Scope = any> extends ComputedObject<\r\n AsyncComputedValue<Value>\r\n> {\r\n private _isRunning: boolean = false;\r\n private _defaultAbortController: AbortController | null = null;\r\n private _userAbortController?: AbortController;\r\n private _firstRun: boolean = false; // 是否已经第一次运行过\r\n /**\r\n * 用于标识这是一个简单计算对象\r\n *\r\n * 不同于全功能异步计算对象\r\n *\r\n */\r\n lite: boolean = false;\r\n override get async() {\r\n return true;\r\n }\r\n override get value() {\r\n return super.value as AsyncComputedValue<Value>;\r\n }\r\n override set value(value: AsyncComputedValue<Value>) {\r\n super.value = value;\r\n }\r\n get running() {\r\n return this._isRunning;\r\n }\r\n /**\r\n * 本方法用来处理配置参数\r\n * 主要\r\n * @param options\r\n */\r\n protected override onInitOptions(options: Required<RuntimeComputedOptions>) {\r\n if (options.reentry === undefined) options.reentry = this.store.options.reentry!;\r\n }\r\n\r\n protected onInitial() {\r\n this.initial = this.createAsyncComputedValue();\r\n this.attach();\r\n // 为什么要延迟执行?\r\n // 因为onInitial函数是在第一次读取时执行的同步操作,此时的依赖项还没有收集完毕,原始的计算函数还没有初始化\r\n // 比如{ total:computed(async()=>{ return 1+2 }) },在第一次读取total时,此时的computed函数还没有初始化\r\n // 如果这时候执行run,则total的值还是一个function,而run执行时会将运行的数据更新到total.value,total.loading 等值,\r\n // 由于total还没有初始化为{loading,value,....}对象,所以会出错\r\n setTimeout(() => {\r\n if (\r\n this.options.immediate === true ||\r\n (this.options.immediate === \"auto\" && this.options.initial === undefined)\r\n ) {\r\n this.run({ first: true });\r\n }\r\n }, 0);\r\n }\r\n /**\r\n * 销毁时取消正在进行的异步计算(复用 AbortController)\r\n */\r\n protected onDestroy() {\r\n try {\r\n if (this._isRunning) this.getAbortController().abort();\r\n } catch {}\r\n }\r\n\r\n private createAsyncComputedValue() {\r\n return Object.assign({\r\n // [ASYNC_COMPUTED_VALUE]: true,\r\n loading: false,\r\n timeout: 0,\r\n retry: 0,\r\n error: null,\r\n value: this.options.initial,\r\n progress: 0,\r\n run: markRaw((args: Dict) => {\r\n return this.store.computedObjects.run(this.id, Object.assign({}, args));\r\n }),\r\n cancel: markRaw(() => {\r\n this.getAbortController().abort();\r\n }),\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * 局部更新计算属性的值\r\n *\r\n */\r\n private updateComputedValue(values: Partial<AsyncComputedValue>) {\r\n const batchEvent = this.strPath;\r\n const updatedCount = Object.keys(values).length;\r\n if (this.associated) {\r\n this.store.update(\r\n (state) => {\r\n updateObjectVal(state, this.path!, values);\r\n },\r\n { batch: updatedCount > 1 ? batchEvent : false },\r\n );\r\n } else {\r\n Object.assign(this.value as object, values);\r\n const isBatch = updatedCount > 1;\r\n const ops: StateOperate[] = [];\r\n Object.entries(values).forEach(([key, value]) => {\r\n const op: StateOperate = {\r\n type: \"set\",\r\n path: [...this.path, key],\r\n value: value,\r\n parent: this.value,\r\n };\r\n if (isBatch) op.reply = true;\r\n this.store.operates.emit(`${this.strPath}.${key}`, op);\r\n ops.push(op);\r\n });\r\n if (isBatch) {\r\n this.store.operates.emit(this.strPath, {\r\n type: \"batch\",\r\n path: this.path,\r\n value: ops,\r\n });\r\n }\r\n }\r\n }\r\n /**\r\n *\r\n * 运行计算函数\r\n *\r\n */\r\n async run(options?: AsyncProRuntimeComputedOptions) {\r\n const { first } = options ?? {};\r\n\r\n // 1. 检查是否计算被禁用, 注意,仅点非初始化时才检查计算开关,因为第一次运行需要收集依赖,这样才能在后续运行时,随时启用/禁用计算属性\r\n if (this.isDisable(options?.enable)) {\r\n this.store.logger.warn(() => `Async computed <${this.toString()}> is disabled`);\r\n return;\r\n }\r\n // 先记录上一次运行是否出错,再清除错误记录\r\n // 用于在重新计算开始时清除状态中残留的旧error(ctx是本次新建的,读不到上次的错误)\r\n const hadError = this.error !== undefined;\r\n this.error = undefined;\r\n this._firstRun = true;\r\n if (!first) {\r\n this.store.logger.info(() => `Run async computed for : ${this.toString()}`);\r\n }\r\n\r\n // 2. 合成最终的配置参数\r\n const finalComputedOptions = (\r\n options ? Object.assign({ first }, this.options, options) : this.options\r\n ) as Required<AsyncProRuntimeComputedOptions>;\r\n\r\n // 3. 根据配置参数获取计算函数的上下文对象\r\n const scope = getValueScope<AsyncComputedValue<Value>, Scope>(\r\n this as any,\r\n \"sync\",\r\n this.context,\r\n finalComputedOptions,\r\n );\r\n // 4. 检查是否有重入\r\n const { reentry } = finalComputedOptions;\r\n if (this._isRunning && !reentry) {\r\n this.store.logger.warn(\r\n () => `Async computed: ${this.toString()} is running, can't reentry`,\r\n );\r\n emitStoreEvent(this.store, `observer/${this.id}/cancel`, {\r\n reason: \"reentry\",\r\n observer: this,\r\n });\r\n return;\r\n }\r\n this._isRunning = true; // 即所依赖项的值\r\n try {\r\n return await this.executeGetter(scope, finalComputedOptions, hadError);\r\n } finally {\r\n this._isRunning = false;\r\n }\r\n }\r\n getValue() {\r\n return this.value.value as any;\r\n }\r\n /**\r\n * computed(async (scope,{getProgressbar})=>{\r\n * const pbar = getProgressbar({max:100,min:0}) // 初始值\r\n * pbar.value(12) // 修改进度值\r\n * pbar.end() // 结束进度条\r\n * })\r\n *\r\n * @param init\r\n * @returns\r\n */\r\n private createComputeProgressbar(opts?: {\r\n max?: number;\r\n min?: number;\r\n value?: number;\r\n }): AsyncComputedProgressbar {\r\n const { max = 100, min = 0, value = 0 } = Object.assign({}, opts);\r\n this.updateComputedValue({ progress: value });\r\n return {\r\n value: (num: number) => {\r\n if (num > max) num = max;\r\n if (num < min) num = min;\r\n this.updateComputedValue({ progress: num });\r\n },\r\n end() {\r\n this.value(max);\r\n },\r\n };\r\n }\r\n /**\r\n *\r\n * AbortController是一个用于控制一个或多个请求的AbortSignal对象的生命周期的对象\r\n *\r\n *\r\n * - 整个异步对象只有一个默认的AbortController对象,仅当用户调用cancel方法时才会使用\r\n *\r\n * ,当用户指定了abortController选项时,会使用用户指定的AbortController对象\r\n *\r\n *\r\n *\r\n * @param options\r\n * @returns\r\n */\r\n private getAbortController(options?: Required<AsyncProRuntimeComputedOptions>) {\r\n if (options && typeof options.abortController === \"function\") {\r\n const abortController = options.abortController();\r\n if (abortController && abortController instanceof AbortController) {\r\n this._userAbortController = abortController;\r\n }\r\n }\r\n if (this._userAbortController) return this._userAbortController;\r\n if (!this._defaultAbortController) this._defaultAbortController = new AbortController();\r\n if (this._defaultAbortController.signal.aborted)\r\n this._defaultAbortController = new AbortController();\r\n return this._defaultAbortController;\r\n }\r\n\r\n /**\r\n * 处理超时\r\n * @param timeoutCallback\r\n * @param options\r\n * @returns\r\n */\r\n private setTimeoutControl(\r\n ctx: GetterRunContext,\r\n initValue: Partial<AsyncComputedValue>,\r\n options: Required<AsyncProRuntimeComputedOptions>,\r\n ) {\r\n const { timeout } = options;\r\n let [timeoutValue, countdown] = Array.isArray(timeout) ? timeout : [timeout, 0];\r\n\r\n let countdownId: any;\r\n let tmId: any;\r\n if (timeoutValue > 0) {\r\n initValue.timeout = countdown > 1 ? countdown : timeoutValue;\r\n tmId = setTimeout(() => {\r\n ctx.hasTimeout = true;\r\n ctx.hasError = true;\r\n ctx.error = \"TIMEOUT\";\r\n if (typeof ctx.timeoutCallback === \"function\") ctx.timeoutCallback();\r\n clearInterval(countdownId);\r\n this.updateComputedValue({\r\n loading: false,\r\n error: \"TIMEOUT\",\r\n timeout: 0,\r\n });\r\n }, timeoutValue);\r\n // 启用设置倒计时: 比如timeout= 6*1000, countdown= 6\r\n if (countdown > 1) {\r\n countdownId = setInterval(\r\n () => {\r\n this.updateComputedValue({\r\n timeout: countdown--,\r\n });\r\n if (countdown === 0) clearInterval(countdownId);\r\n },\r\n timeoutValue / (countdown + 1),\r\n );\r\n }\r\n }\r\n\r\n return {\r\n clear: () => {\r\n clearTimeout(tmId);\r\n clearInterval(countdownId);\r\n },\r\n enable: timeoutValue > 0,\r\n };\r\n }\r\n /**\r\n * 执行计算函数\r\n *\r\n */\r\n private async executeGetter(\r\n scope: any,\r\n options: Required<AsyncProRuntimeComputedOptions>,\r\n hadError = false,\r\n ) {\r\n const { retry } = options;\r\n const [retryCount, retryInterval] = retry\r\n ? Array.isArray(retry)\r\n ? retry\r\n : [Number(retry), 0]\r\n : [0, 0];\r\n\r\n let timeoutCallback: (() => void) | undefined; // 异步计算函数可以在超时时执行的回调函数\r\n\r\n const abortController = this.getAbortController(options);\r\n\r\n const getterArgs: Required<AsyncProComputedGetterArgs> = {\r\n onTimeout: (cb: () => void) => {\r\n timeoutCallback = cb;\r\n },\r\n getProgressbar: this.createComputeProgressbar.bind(this),\r\n getSnap: (scope: any) => getSnap(scope),\r\n cancel: abortController.abort.bind(abortController),\r\n extras: options.extras,\r\n operate: options.operate,\r\n first: options.first,\r\n abortSignal: abortController.signal,\r\n } as any;\r\n\r\n const ctx: GetterRunContext = {\r\n error: null,\r\n hasError: false,\r\n hasTimeout: false,\r\n hasAbort: false,\r\n timeoutCallback,\r\n };\r\n\r\n // 侦听中止信号,以便在中止时能停止\r\n const abortHandler = () => {\r\n ctx.hasAbort = true;\r\n };\r\n abortController.signal.addEventListener(\"abort\", abortHandler);\r\n this.error = undefined;\r\n let timeout = { clear: () => {}, enable: false };\r\n let computedResult: any;\r\n\r\n try {\r\n const updateCtx = (values: Partial<GetterRunContext>) => Object.assign(ctx, values);\r\n for (let i = 0; i < retryCount + 1; i++) {\r\n const afterUpdated: Partial<AsyncComputedValue> = {}; // 保存执行完成后需要更新的内容,以便在最后一次执行后更新状态\r\n try {\r\n // 1. 初始化数据\r\n const initValue: Partial<AsyncComputedValue> = {\r\n loading: true,\r\n };\r\n // 上一次运行出错时,在开始计算前清除状态中残留的旧error\r\n // (ctx是本次新建的读不到上次错误,hadError由run()在清除this.error前捕获)\r\n if (hadError) initValue.error = null;\r\n\r\n if (retryCount > 0) initValue.retry = i > 0 ? retryCount - i + 1 : 0;\r\n\r\n if (i > 0) {\r\n updateCtx({\r\n error: null,\r\n hasError: false,\r\n hasTimeout: false,\r\n });\r\n }\r\n\r\n timeout = this.setTimeoutControl(ctx, initValue, options);\r\n\r\n this.updateComputedValue(initValue);\r\n\r\n // 如果有中止信号,则取消计算\r\n if (ctx.hasAbort) throw new AbortError();\r\n // 执行回调\r\n emitStoreEvent(this.store, `observer/${this.id}/run`, {\r\n args: getterArgs,\r\n observer: this,\r\n scope,\r\n });\r\n // 执行计算函数\r\n computedResult = await this.getter.call(this, scope, getterArgs);\r\n if (ctx.hasAbort) throw new AbortError();\r\n if (!ctx.hasTimeout) {\r\n if (options.raw) markRaw(computedResult);\r\n afterUpdated.value = computedResult;\r\n // 计算成功时必须清除上一次的错误,否则旧的error会一直残留在状态中\r\n if (hadError) afterUpdated.error = null;\r\n if (timeout.enable) afterUpdated.timeout = 0;\r\n }\r\n } catch (e: any) {\r\n ctx.hasError = true;\r\n ctx.error = e;\r\n if (!ctx.hasTimeout) afterUpdated.error = getError(e).message;\r\n if (isFunction(options.onError)) {\r\n const errValue = options.onError(e);\r\n if (errValue !== undefined) afterUpdated.value = errValue;\r\n }\r\n } finally {\r\n timeout.clear();\r\n if (i === retryCount) {\r\n // 最后一次执行时\r\n if (ctx.hasTimeout) afterUpdated.error = ctx.error;\r\n if (retryCount > 0) afterUpdated.retry = 0;\r\n }\r\n afterUpdated.loading = false;\r\n this.updateComputedValue(afterUpdated);\r\n }\r\n // 出错时重试延迟, 最后一次不延迟\r\n if (ctx.hasError) {\r\n if (retryCount > 0 && retryInterval > 0 && i < retryCount) {\r\n await delay(retryInterval);\r\n }\r\n }\r\n }\r\n // 计算完成后触发事件\r\n if (ctx.hasAbort) {\r\n emitStoreEvent(this.store, `observer/${this.id}/cancel`, {\r\n reason: \"abort\",\r\n observer: this,\r\n });\r\n } else if (ctx.hasError || ctx.hasTimeout) {\r\n this.error = ctx.error;\r\n emitStoreEvent(this.store, `observer/${this.id}/error`, {\r\n error: ctx.error,\r\n observer: this,\r\n });\r\n } else {\r\n emitStoreEvent(this.store, `observer/${this.id}/done`, {\r\n value: computedResult,\r\n observer: this,\r\n });\r\n }\r\n this.onDoneCallback(\r\n options,\r\n ctx.error,\r\n ctx.hasAbort,\r\n ctx.hasTimeout,\r\n scope,\r\n computedResult,\r\n );\r\n } finally {\r\n // 清理 abort 事件监听器,防止内存泄漏\r\n abortController.signal.removeEventListener(\"abort\", abortHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 当计算属性操作完成时的回调函数\r\n *\r\n * 此函数负责在计算属性操作完成后,根据操作的执行状态调用用户定义的回调函数\r\n * 它会传递操作的结果、错误状态、是否中止以及是否超时等信息给回调函数\r\n *\r\n * @param options - 计算属性的运行时选项,被强制转换为Required类型,确保所有选项都是必需的\r\n * @param error - 如果操作过程中发生错误,该错误对象将被传递\r\n * @param abort - 一个布尔值,表示操作是否被中止\r\n * @param timeout - 一个布尔值,表示操作是否因超时而结束\r\n * @param scope - 操作执行的上下文或范围\r\n * @param value - 操作的结果,如果操作成功完成\r\n */\r\n private onDoneCallback(\r\n options: Required<RuntimeComputedOptions>,\r\n error: Error,\r\n abort: boolean,\r\n timeout: boolean,\r\n scope: any,\r\n value: any,\r\n ) {\r\n if (typeof options.onDone !== \"function\") return;\r\n options.onDone.call(this, {\r\n id: this.id,\r\n path: this.path,\r\n value,\r\n error,\r\n abort,\r\n timeout,\r\n scope,\r\n });\r\n }\r\n protected onDependsChange(params: StateOperate) {\r\n this.store.logger.debug(\r\n () =>\r\n `AsyncComputed<${this.id}> is running by depends ${params.type}/${params.path.join(\r\n \".\",\r\n )} operate `,\r\n );\r\n this.run({\r\n operate: params,\r\n first: !this._firstRun,\r\n });\r\n }\r\n /**\r\n *\r\n * 由于异步计算是一个对象,所以我们需要侦听的是对象的变化,而不仅是对象的值\r\n *\r\n */\r\n protected getValueWatchPath() {\r\n const spath = this.path!.join(this.store.options.delimiter);\r\n return [`${spath}.*`, spath];\r\n }\r\n /**\r\n * 由于所有异步计算属性均会被转换为一个AsyncComputedValue<{value,timeout,....}>的形式\r\n * 这样,当我们在指定一个依赖是异步属性时,就需要指定为xxxx.value才可以个侦听到变化\r\n *\r\n * @example\r\n * const store = new AutoStore({\r\n * a0: 1,\r\n * a1: computed(async (scope:any)=>{\r\n * return scope.a0 + 1\r\n * },[\"a0\"],{initial:2}),\r\n * a2: computed(async (scope:any)=>{\r\n * return scope.a1.value + 1\r\n * },[\"a1.value\"],{initial:3})\r\n * });\r\n *\r\n * 以上a2依赖于a1,由于a1是一个异步对象,所以在写依赖时就必须写上[\"a1.value\"]\r\n * 这就有点反直觉了。\r\n *\r\n * 本函数在异步计算对象订阅变更事件时调用,用来返回字符串形式的依赖数组\r\n *\r\n * 本函数的功能就是对所有依赖进行判断如果其是一个异步计算依赖,则自动添加.value,这样就可以如下方式来写依赖了\r\n *\r\n * \tconst store = new AutoStore({\r\n * a0: 1,\r\n * a1: computed(async (scope:any)=>{\r\n * return scope.a0 + 1\r\n * },[\"a0\"],{initial:2}),\r\n * a2: computed(async (scope:any)=>{\r\n * return scope.a1.value + 1\r\n * },[\"a1\"],{initial:3})\r\n * });\r\n *\r\n */\r\n protected getDepends() {\r\n const depends = super.getDepends();\r\n return depends.map((dep) => {\r\n if (dep.length === 0) return dep;\r\n for (const obj of this.store.computedObjects.values()) {\r\n if (isPathEq(obj.path, dep) && obj.async) {\r\n return [`${dep.join(this.store.options.delimiter)}.value`];\r\n }\r\n }\r\n return dep;\r\n }) as unknown as string[][];\r\n }\r\n}\r\n","import {\r\n OBSERVER_DESCRIPTOR_FLAG,\r\n OBSERVER_TYPE_FLAG,\r\n normalizeDeps,\r\n AsyncComputedValue,\r\n getDefaultComputedOptions,\r\n} from \"autostore\";\r\nimport type { ComputedDepends } from \"autostore\";\r\nimport type {\r\n AsyncProComputedGetter,\r\n AsyncProComputedOptions,\r\n AsyncProComputedDescriptorBuilder,\r\n AsyncProComputedDescriptor,\r\n} from \"./types\";\r\n\r\n/**\r\n * 用来封装状态的计算函数,使用计算函数的传入的是当前对象\r\n *\r\n *\r\n * @param getter\r\n * @param depends\r\n * @param options\r\n * @returns\r\n *\r\n */\r\nexport function asyncComputed<Value = any, Scope = any>(\r\n getter: AsyncProComputedGetter<Value, Scope>,\r\n depends: ComputedDepends,\r\n options?: AsyncProComputedOptions<Value, Scope>,\r\n): AsyncProComputedDescriptorBuilder<AsyncComputedValue<Value>, Scope> {\r\n if (typeof getter !== \"function\") throw new Error(\"computed getter must be a function\");\r\n // 解析参数:同时支持同步和异步计算函数两种方式声明\r\n const opts: AsyncProComputedOptions = Object.assign({}, getDefaultComputedOptions(), options, {\r\n async: true,\r\n });\r\n opts.depends = normalizeDeps(depends);\r\n\r\n const descriptorBuilder = () => {\r\n return {\r\n type: \"asyncpro\",\r\n getter,\r\n options: opts,\r\n [OBSERVER_DESCRIPTOR_FLAG]: true,\r\n } as unknown as AsyncProComputedDescriptor<Value, Scope>;\r\n };\r\n descriptorBuilder[OBSERVER_TYPE_FLAG] = \"asyncpro\";\r\n return descriptorBuilder as unknown as AsyncProComputedDescriptorBuilder<\r\n AsyncComputedValue<Value>,\r\n Scope\r\n >;\r\n}\r\n","/**\r\n * shadow 插件\r\n *\r\n * 为 AutoStore 注入影子 store(shadowStore)能力:\r\n * - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法\r\n * - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state\r\n * - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算\r\n * - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)\r\n *\r\n * shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。\r\n * 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT\r\n * (不能是 CURRENT 或相对路径)。\r\n *\r\n * @example\r\n *\r\n * import { AutoStore, computed } from \"autostore\";\r\n * import { shadow } from \"@autostorejs/plugins\";\r\n *\r\n * const store = new AutoStore({ price: 10, count: 3 });\r\n * shadow(store); // 安装插件,挂载 store.shadow 方法\r\n *\r\n * const shadowStore = store.shadow({\r\n * total: computed((scope) => scope.price * scope.count),\r\n * });\r\n *\r\n * shadowStore.state.total; // 30\r\n * store.state.count = 4;\r\n * shadowStore.state.total; // 40\r\n */\r\n\r\nimport { AutoStore } from \"autostore\";\r\nimport type { AnyAutoStore, Dict, AnyObserverDescriptor, ObserverContext } from \"autostore\";\r\nimport { installPlugin } from \"../utils/installPlugin\";\r\nimport { AsyncProComputedObject } from \"./async\";\r\nimport { asyncComputed } from \"./asyncComputed\";\r\n\r\n/**\r\n * shadow 插件入口\r\n *\r\n * 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。\r\n *\r\n * @param store 目标 AutoStore 实例\r\n * @returns 无返回值,副作用是给 store 挂载 shadow 方法\r\n */\r\nexport function asyncpro(store: AnyAutoStore) {\r\n const observers = (store.constructor as typeof AutoStore).observers;\r\n observers[\"asyncpro\"] = (\r\n store: AnyAutoStore,\r\n descriptor: AnyObserverDescriptor,\r\n context?: ObserverContext,\r\n ) => {\r\n const computedObj = new AsyncProComputedObject(store, descriptor, context);\r\n store.computedObjects.set(computedObj.id, computedObj);\r\n return computedObj;\r\n };\r\n\r\n if (!store.options.sandbox) store.options.sandbox = {};\r\n if (!store.options.sandbox.context) store.options.sandbox.context = {};\r\n // 注意:必须追加而非整体覆盖 context\r\n // 否则会丢失用户在 sandbox.context 中自定义注入的变量(如测试中的 data 等)\r\n store.options.sandbox.context.asyncComputed = asyncComputed;\r\n}\r\n\r\ninstallPlugin(asyncpro);\r\n\r\ndeclare module \"autostore\" {\r\n interface AutoStore<State extends Dict, Options = unknown> {}\r\n interface ObserverObjects {\r\n asyncpro: AsyncProComputedObject;\r\n }\r\n interface AsyncComputedObjects {\r\n asyncpro: AsyncProComputedObject;\r\n }\r\n}\r\n\r\nexport * from \"./asyncComputed\";\r\nexport * from \"./async\";\r\nexport * from \"./types\";\r\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { StateTracker, trace } from './trace.cjs';
|
|
2
|
+
export { shadow } from './shadow.cjs';
|
|
3
|
+
export { AsyncComputedProgressbar, AsyncProComputedDescriptor, AsyncProComputedDescriptorBuilder, AsyncProComputedGetter, AsyncProComputedGetterArgs, AsyncProComputedObject, AsyncProComputedOptions, AsyncProRuntimeComputedOptions, asyncComputed, asyncpro } from './asyncpro.cjs';
|
|
4
|
+
import 'autostore';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { StateTracker, trace } from './trace.js';
|
|
2
|
+
export { shadow } from './shadow.js';
|
|
3
|
+
export { AsyncComputedProgressbar, AsyncProComputedDescriptor, AsyncProComputedDescriptorBuilder, AsyncProComputedGetter, AsyncProComputedGetterArgs, AsyncProComputedObject, AsyncProComputedOptions, AsyncProRuntimeComputedOptions, asyncComputed, asyncpro } from './asyncpro.js';
|
|
4
|
+
import 'autostore';
|