ar_sync 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +53 -0
- data/LICENSE.txt +21 -0
- data/README.md +128 -0
- data/Rakefile +10 -0
- data/ar_sync.gemspec +28 -0
- data/bin/console +12 -0
- data/bin/setup +8 -0
- data/core/ActioncableAdapter.d.ts +10 -0
- data/core/ActioncableAdapter.js +29 -0
- data/core/ArSyncApi.d.ts +5 -0
- data/core/ArSyncApi.js +74 -0
- data/core/ArSyncModelBase.d.ts +71 -0
- data/core/ArSyncModelBase.js +110 -0
- data/core/ConnectionAdapter.d.ts +7 -0
- data/core/ConnectionAdapter.js +2 -0
- data/core/ConnectionManager.d.ts +19 -0
- data/core/ConnectionManager.js +75 -0
- data/core/DataType.d.ts +60 -0
- data/core/DataType.js +2 -0
- data/core/hooksBase.d.ts +29 -0
- data/core/hooksBase.js +80 -0
- data/graph/ArSyncModel.d.ts +10 -0
- data/graph/ArSyncModel.js +22 -0
- data/graph/ArSyncStore.d.ts +28 -0
- data/graph/ArSyncStore.js +593 -0
- data/graph/hooks.d.ts +3 -0
- data/graph/hooks.js +10 -0
- data/graph/index.d.ts +2 -0
- data/graph/index.js +4 -0
- data/lib/ar_sync.rb +25 -0
- data/lib/ar_sync/class_methods.rb +215 -0
- data/lib/ar_sync/collection.rb +83 -0
- data/lib/ar_sync/config.rb +18 -0
- data/lib/ar_sync/core.rb +138 -0
- data/lib/ar_sync/field.rb +96 -0
- data/lib/ar_sync/instance_methods.rb +130 -0
- data/lib/ar_sync/rails.rb +155 -0
- data/lib/ar_sync/type_script.rb +80 -0
- data/lib/ar_sync/version.rb +3 -0
- data/lib/generators/ar_sync/install/install_generator.rb +87 -0
- data/lib/generators/ar_sync/types/types_generator.rb +11 -0
- data/package-lock.json +1115 -0
- data/package.json +19 -0
- data/src/core/ActioncableAdapter.ts +30 -0
- data/src/core/ArSyncApi.ts +75 -0
- data/src/core/ArSyncModelBase.ts +126 -0
- data/src/core/ConnectionAdapter.ts +5 -0
- data/src/core/ConnectionManager.ts +69 -0
- data/src/core/DataType.ts +73 -0
- data/src/core/hooksBase.ts +86 -0
- data/src/graph/ArSyncModel.ts +21 -0
- data/src/graph/ArSyncStore.ts +567 -0
- data/src/graph/hooks.ts +7 -0
- data/src/graph/index.ts +2 -0
- data/src/tree/ArSyncModel.ts +145 -0
- data/src/tree/ArSyncStore.ts +323 -0
- data/src/tree/hooks.ts +7 -0
- data/src/tree/index.ts +2 -0
- data/tree/ArSyncModel.d.ts +39 -0
- data/tree/ArSyncModel.js +143 -0
- data/tree/ArSyncStore.d.ts +21 -0
- data/tree/ArSyncStore.js +365 -0
- data/tree/hooks.d.ts +3 -0
- data/tree/hooks.js +10 -0
- data/tree/index.d.ts +2 -0
- data/tree/index.js +4 -0
- data/tsconfig.json +15 -0
- data/vendor/assets/javascripts/ar_sync_actioncable_adapter.js.erb +7 -0
- data/vendor/assets/javascripts/ar_sync_graph.js.erb +17 -0
- data/vendor/assets/javascripts/ar_sync_tree.js.erb +17 -0
- metadata +187 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
class ArSyncModelBase {
|
4
|
+
constructor(request, option) {
|
5
|
+
this._ref = this.refManagerClass().retrieveRef(request, option);
|
6
|
+
this._listenerSerial = 0;
|
7
|
+
this._listeners = {};
|
8
|
+
this.complete = false;
|
9
|
+
this.connected = this.connectionManager().networkStatus;
|
10
|
+
const setData = () => {
|
11
|
+
this.data = this._ref.model.data;
|
12
|
+
this.complete = this._ref.model.complete;
|
13
|
+
this.notfound = this._ref.model.notfound;
|
14
|
+
};
|
15
|
+
setData();
|
16
|
+
this.subscribe('load', setData);
|
17
|
+
this.subscribe('change', setData);
|
18
|
+
this.subscribe('connection', (status) => {
|
19
|
+
this.connected = status;
|
20
|
+
});
|
21
|
+
}
|
22
|
+
onload(callback) {
|
23
|
+
this.subscribeOnce('load', callback);
|
24
|
+
}
|
25
|
+
subscribeOnce(event, callback) {
|
26
|
+
const subscription = this.subscribe(event, (arg) => {
|
27
|
+
callback(arg);
|
28
|
+
subscription.unsubscribe();
|
29
|
+
});
|
30
|
+
return subscription;
|
31
|
+
}
|
32
|
+
subscribe(event, callback) {
|
33
|
+
const id = this._listenerSerial++;
|
34
|
+
const subscription = this._ref.model.subscribe(event, callback);
|
35
|
+
let unsubscribed = false;
|
36
|
+
const unsubscribe = () => {
|
37
|
+
unsubscribed = true;
|
38
|
+
subscription.unsubscribe();
|
39
|
+
delete this._listeners[id];
|
40
|
+
};
|
41
|
+
if (this.complete) {
|
42
|
+
if (event === 'load')
|
43
|
+
setTimeout(() => {
|
44
|
+
if (!unsubscribed)
|
45
|
+
callback();
|
46
|
+
}, 0);
|
47
|
+
if (event === 'change')
|
48
|
+
setTimeout(() => {
|
49
|
+
if (!unsubscribed)
|
50
|
+
callback({ path: [], value: this.data });
|
51
|
+
}, 0);
|
52
|
+
}
|
53
|
+
return this._listeners[id] = { unsubscribe };
|
54
|
+
}
|
55
|
+
release() {
|
56
|
+
for (const id in this._listeners)
|
57
|
+
this._listeners[id].unsubscribe();
|
58
|
+
this._listeners = {};
|
59
|
+
this.refManagerClass()._detach(this._ref);
|
60
|
+
this._ref = null;
|
61
|
+
}
|
62
|
+
static retrieveRef(request, option) {
|
63
|
+
const key = JSON.stringify([request, option]);
|
64
|
+
let ref = this._cache[key];
|
65
|
+
if (!ref) {
|
66
|
+
const model = this.createRefModel(request, option);
|
67
|
+
ref = this._cache[key] = { key, count: 0, timer: null, model };
|
68
|
+
}
|
69
|
+
this._attach(ref);
|
70
|
+
return ref;
|
71
|
+
}
|
72
|
+
static createRefModel(_request, _option) {
|
73
|
+
throw 'abstract method';
|
74
|
+
}
|
75
|
+
static _detach(ref) {
|
76
|
+
ref.count--;
|
77
|
+
const timeout = this.cacheTimeout;
|
78
|
+
if (ref.count !== 0)
|
79
|
+
return;
|
80
|
+
const timedout = () => {
|
81
|
+
ref.model.release();
|
82
|
+
delete this._cache[ref.key];
|
83
|
+
};
|
84
|
+
if (timeout) {
|
85
|
+
ref.timer = setTimeout(timedout, timeout);
|
86
|
+
}
|
87
|
+
else {
|
88
|
+
timedout();
|
89
|
+
}
|
90
|
+
}
|
91
|
+
static _attach(ref) {
|
92
|
+
ref.count++;
|
93
|
+
if (ref.timer)
|
94
|
+
clearTimeout(ref.timer);
|
95
|
+
}
|
96
|
+
static setConnectionAdapter(_adapter) { }
|
97
|
+
static waitForLoad(...models) {
|
98
|
+
return new Promise((resolve) => {
|
99
|
+
let count = 0;
|
100
|
+
for (const model of models) {
|
101
|
+
model.onload(() => {
|
102
|
+
count++;
|
103
|
+
if (models.length == count)
|
104
|
+
resolve(models);
|
105
|
+
});
|
106
|
+
}
|
107
|
+
});
|
108
|
+
}
|
109
|
+
}
|
110
|
+
exports.default = ArSyncModelBase;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
export default class ConnectionManager {
|
2
|
+
subscriptions: any;
|
3
|
+
adapter: any;
|
4
|
+
networkListeners: any;
|
5
|
+
networkListenerSerial: any;
|
6
|
+
networkStatus: any;
|
7
|
+
constructor(adapter: any);
|
8
|
+
triggerNetworkChange(status: any): void;
|
9
|
+
unsubscribeAll(): void;
|
10
|
+
subscribeNetwork(func: any): {
|
11
|
+
unsubscribe: () => void;
|
12
|
+
};
|
13
|
+
subscribe(key: any, func: any): {
|
14
|
+
unsubscribe: () => void;
|
15
|
+
};
|
16
|
+
connect(key: any): any;
|
17
|
+
disconnect(key: any): void;
|
18
|
+
received(key: any, data: any): void;
|
19
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
class ConnectionManager {
|
4
|
+
constructor(adapter) {
|
5
|
+
this.subscriptions = {};
|
6
|
+
this.adapter = adapter;
|
7
|
+
this.networkListeners = {};
|
8
|
+
this.networkListenerSerial = 0;
|
9
|
+
this.networkStatus = true;
|
10
|
+
adapter.ondisconnect = () => {
|
11
|
+
this.unsubscribeAll();
|
12
|
+
this.triggerNetworkChange(false);
|
13
|
+
};
|
14
|
+
adapter.onreconnect = () => this.triggerNetworkChange(true);
|
15
|
+
}
|
16
|
+
triggerNetworkChange(status) {
|
17
|
+
if (this.networkStatus == status)
|
18
|
+
return;
|
19
|
+
this.networkStatus = status;
|
20
|
+
for (const id in this.networkListeners)
|
21
|
+
this.networkListeners[id](status);
|
22
|
+
}
|
23
|
+
unsubscribeAll() {
|
24
|
+
for (const id in this.subscriptions) {
|
25
|
+
const subscription = this.subscriptions[id];
|
26
|
+
subscription.listeners = {};
|
27
|
+
subscription.connection.unsubscribe();
|
28
|
+
}
|
29
|
+
this.subscriptions = {};
|
30
|
+
}
|
31
|
+
subscribeNetwork(func) {
|
32
|
+
const id = this.networkListenerSerial++;
|
33
|
+
this.networkListeners[id] = func;
|
34
|
+
const unsubscribe = () => {
|
35
|
+
delete this.networkListeners[id];
|
36
|
+
};
|
37
|
+
return { unsubscribe };
|
38
|
+
}
|
39
|
+
subscribe(key, func) {
|
40
|
+
const subscription = this.connect(key);
|
41
|
+
const id = subscription.serial++;
|
42
|
+
subscription.ref++;
|
43
|
+
subscription.listeners[id] = func;
|
44
|
+
const unsubscribe = () => {
|
45
|
+
if (!subscription.listeners[id])
|
46
|
+
return;
|
47
|
+
delete subscription.listeners[id];
|
48
|
+
subscription.ref--;
|
49
|
+
if (subscription.ref === 0)
|
50
|
+
this.disconnect(key);
|
51
|
+
};
|
52
|
+
return { unsubscribe };
|
53
|
+
}
|
54
|
+
connect(key) {
|
55
|
+
if (this.subscriptions[key])
|
56
|
+
return this.subscriptions[key];
|
57
|
+
const connection = this.adapter.subscribe(key, data => this.received(key, data));
|
58
|
+
return this.subscriptions[key] = { connection, listeners: {}, ref: 0, serial: 0 };
|
59
|
+
}
|
60
|
+
disconnect(key) {
|
61
|
+
const subscription = this.subscriptions[key];
|
62
|
+
if (!subscription || subscription.ref !== 0)
|
63
|
+
return;
|
64
|
+
delete this.subscriptions[key];
|
65
|
+
subscription.connection.unsubscribe();
|
66
|
+
}
|
67
|
+
received(key, data) {
|
68
|
+
const subscription = this.subscriptions[key];
|
69
|
+
if (!subscription)
|
70
|
+
return;
|
71
|
+
for (const id in subscription.listeners)
|
72
|
+
subscription.listeners[id](data);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
exports.default = ConnectionManager;
|
data/core/DataType.d.ts
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
declare type RecordType = {
|
2
|
+
_meta?: {
|
3
|
+
query: any;
|
4
|
+
};
|
5
|
+
};
|
6
|
+
declare type Values<T> = T extends {
|
7
|
+
[K in keyof T]: infer U;
|
8
|
+
} ? U : never;
|
9
|
+
declare type DataTypeExtractField<BaseType, Key extends keyof BaseType> = BaseType[Key] extends RecordType ? (null extends BaseType[Key] ? {} | null : {}) : BaseType[Key] extends RecordType[] ? {}[] : BaseType[Key];
|
10
|
+
declare type DataTypeExtractFieldsFromQuery<BaseType, Fields> = '*' extends Fields ? {
|
11
|
+
[key in Exclude<keyof BaseType, '_meta'>]: DataTypeExtractField<BaseType, key>;
|
12
|
+
} : {
|
13
|
+
[key in Fields & keyof (BaseType)]: DataTypeExtractField<BaseType, key>;
|
14
|
+
};
|
15
|
+
interface ExtraFieldErrorType {
|
16
|
+
error: 'extraFieldError';
|
17
|
+
}
|
18
|
+
declare type DataTypeExtractFromQueryHash<BaseType, QueryType> = '*' extends keyof QueryType ? {
|
19
|
+
[key in Exclude<(keyof BaseType) | (keyof QueryType), '_meta' | '_params' | '*'>]: (key extends keyof BaseType ? (key extends keyof QueryType ? (QueryType[key] extends true ? DataTypeExtractField<BaseType, key> : DataTypeFromQuery<BaseType[key] & {}, QueryType[key]>) : DataTypeExtractField<BaseType, key>) : ExtraFieldErrorType);
|
20
|
+
} : {
|
21
|
+
[key in keyof QueryType]: (key extends keyof BaseType ? (QueryType[key] extends true ? DataTypeExtractField<BaseType, key> : DataTypeFromQuery<BaseType[key] & {}, QueryType[key]>) : ExtraFieldErrorType);
|
22
|
+
};
|
23
|
+
declare type _DataTypeFromQuery<BaseType, QueryType> = QueryType extends keyof BaseType | '*' ? DataTypeExtractFieldsFromQuery<BaseType, QueryType> : QueryType extends Readonly<(keyof BaseType | '*')[]> ? DataTypeExtractFieldsFromQuery<BaseType, Values<QueryType>> : QueryType extends {
|
24
|
+
as: string;
|
25
|
+
} ? {
|
26
|
+
error: 'type for alias field is not supported';
|
27
|
+
} | undefined : DataTypeExtractFromQueryHash<BaseType, QueryType>;
|
28
|
+
export declare type DataTypeFromQuery<BaseType, QueryType> = BaseType extends any[] ? CheckAttributesField<BaseType[0], QueryType>[] : null extends BaseType ? CheckAttributesField<BaseType & {}, QueryType> | null : CheckAttributesField<BaseType & {}, QueryType>;
|
29
|
+
declare type CheckAttributesField<P, Q> = Q extends {
|
30
|
+
attributes: infer R;
|
31
|
+
} ? _DataTypeFromQuery<P, R> : _DataTypeFromQuery<P, Q>;
|
32
|
+
declare type IsAnyCompareLeftType = {
|
33
|
+
__any: never;
|
34
|
+
};
|
35
|
+
declare type CollectExtraFields<Type, Path> = IsAnyCompareLeftType extends Type ? null : Type extends ExtraFieldErrorType ? Path : Type extends (infer R)[] ? _CollectExtraFields<R> : Type extends object ? _CollectExtraFields<Type> : null;
|
36
|
+
declare type _CollectExtraFields<Type> = keyof (Type) extends never ? null : Values<{
|
37
|
+
[key in keyof Type]: CollectExtraFields<Type[key], [key]>;
|
38
|
+
}>;
|
39
|
+
declare type SelectString<T> = T extends string ? T : never;
|
40
|
+
declare type _ValidateDataTypeExtraFileds<Extra, Type> = SelectString<Values<Extra>> extends never ? Type : {
|
41
|
+
error: {
|
42
|
+
extraFields: SelectString<Values<Extra>>;
|
43
|
+
};
|
44
|
+
};
|
45
|
+
declare type ValidateDataTypeExtraFileds<Type> = _ValidateDataTypeExtraFileds<CollectExtraFields<Type, []>, Type>;
|
46
|
+
declare type RequestBase = {
|
47
|
+
api: string;
|
48
|
+
query: any;
|
49
|
+
params?: any;
|
50
|
+
_meta?: {
|
51
|
+
data: any;
|
52
|
+
};
|
53
|
+
};
|
54
|
+
declare type DataTypeBaseFromRequestType<R> = R extends {
|
55
|
+
_meta?: {
|
56
|
+
data: infer DataType;
|
57
|
+
};
|
58
|
+
} ? DataType : never;
|
59
|
+
export declare type DataTypeFromRequest<Req extends RequestBase, R extends RequestBase> = ValidateDataTypeExtraFileds<DataTypeFromQuery<DataTypeBaseFromRequestType<Req>, R['query']>>;
|
60
|
+
export {};
|
data/core/DataType.js
ADDED
data/core/hooksBase.d.ts
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
interface ModelStatus {
|
2
|
+
complete: boolean;
|
3
|
+
notfound?: boolean;
|
4
|
+
connected: boolean;
|
5
|
+
}
|
6
|
+
export declare type DataAndStatus<T> = [T | null, ModelStatus];
|
7
|
+
export interface Request {
|
8
|
+
api: string;
|
9
|
+
params?: any;
|
10
|
+
query: any;
|
11
|
+
}
|
12
|
+
interface ArSyncModel<T> {
|
13
|
+
data: T | null;
|
14
|
+
complete: boolean;
|
15
|
+
connected: boolean;
|
16
|
+
notfound?: boolean;
|
17
|
+
release(): void;
|
18
|
+
subscribe(type: any, callback: any): any;
|
19
|
+
}
|
20
|
+
export declare function useArSyncModelWithClass<T>(modelClass: {
|
21
|
+
new <T>(req: Request, option?: any): ArSyncModel<T>;
|
22
|
+
}, request: Request | null): DataAndStatus<T>;
|
23
|
+
interface FetchStatus {
|
24
|
+
complete: boolean;
|
25
|
+
notfound?: boolean;
|
26
|
+
}
|
27
|
+
declare type DataAndStatusAndUpdater<T> = [T | null, FetchStatus, () => void];
|
28
|
+
export declare function useArSyncFetch<T>(request: Request | null): DataAndStatusAndUpdater<T>;
|
29
|
+
export {};
|
data/core/hooksBase.js
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const react_1 = require("react");
|
4
|
+
const ArSyncApi_1 = require("./ArSyncApi");
|
5
|
+
function useArSyncModelWithClass(modelClass, request) {
|
6
|
+
const [data, setData] = react_1.useState(null);
|
7
|
+
const [status, setStatus] = react_1.useState({ complete: false, connected: true });
|
8
|
+
const updateStatus = (complete, notfound, connected) => {
|
9
|
+
if (complete === status.complete || notfound === status.notfound || connected === status.notfound)
|
10
|
+
return;
|
11
|
+
setStatus({ complete, notfound, connected });
|
12
|
+
};
|
13
|
+
react_1.useEffect(() => {
|
14
|
+
if (!request)
|
15
|
+
return () => { };
|
16
|
+
const model = new modelClass(request, { immutable: true });
|
17
|
+
if (model.complete)
|
18
|
+
setData(model.data);
|
19
|
+
updateStatus(model.complete, model.notfound, model.connected);
|
20
|
+
model.subscribe('change', () => {
|
21
|
+
updateStatus(model.complete, model.notfound, model.connected);
|
22
|
+
setData(model.data);
|
23
|
+
});
|
24
|
+
model.subscribe('connection', () => {
|
25
|
+
updateStatus(model.complete, model.notfound, model.connected);
|
26
|
+
});
|
27
|
+
return () => model.release();
|
28
|
+
}, [JSON.stringify(request && request.params)]);
|
29
|
+
return [data, status];
|
30
|
+
}
|
31
|
+
exports.useArSyncModelWithClass = useArSyncModelWithClass;
|
32
|
+
function useArSyncFetch(request) {
|
33
|
+
const [response, setResponse] = react_1.useState(null);
|
34
|
+
const [status, setStatus] = react_1.useState({ complete: false });
|
35
|
+
const requestString = JSON.stringify(request && request.params);
|
36
|
+
let canceled = false;
|
37
|
+
let timer = null;
|
38
|
+
const update = react_1.useCallback(() => {
|
39
|
+
if (!request) {
|
40
|
+
setStatus({ complete: false, notfound: undefined });
|
41
|
+
return () => { };
|
42
|
+
}
|
43
|
+
canceled = false;
|
44
|
+
timer = null;
|
45
|
+
const fetch = (count) => {
|
46
|
+
if (timer)
|
47
|
+
clearTimeout(timer);
|
48
|
+
timer = null;
|
49
|
+
ArSyncApi_1.default.fetch(request)
|
50
|
+
.then((response) => {
|
51
|
+
if (canceled)
|
52
|
+
return;
|
53
|
+
setResponse(response);
|
54
|
+
setStatus({ complete: true, notfound: false });
|
55
|
+
})
|
56
|
+
.catch(e => {
|
57
|
+
if (canceled)
|
58
|
+
return;
|
59
|
+
if (!e.retry) {
|
60
|
+
setResponse(null);
|
61
|
+
setStatus({ complete: true, notfound: true });
|
62
|
+
return;
|
63
|
+
}
|
64
|
+
timer = setTimeout(() => fetch(count + 1), 1000 * Math.min(4 ** count, 30));
|
65
|
+
});
|
66
|
+
};
|
67
|
+
fetch(0);
|
68
|
+
}, [requestString]);
|
69
|
+
react_1.useEffect(() => {
|
70
|
+
update();
|
71
|
+
return () => {
|
72
|
+
canceled = true;
|
73
|
+
if (timer)
|
74
|
+
clearTimeout(timer);
|
75
|
+
timer = null;
|
76
|
+
};
|
77
|
+
}, [requestString]);
|
78
|
+
return [response, status, update];
|
79
|
+
}
|
80
|
+
exports.useArSyncFetch = useArSyncFetch;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import ArSyncModelBase from '../core/ArSyncModelBase';
|
2
|
+
import ConnectionAdapter from '../core/ConnectionAdapter';
|
3
|
+
export default class ArSyncModel<T> extends ArSyncModelBase<T> {
|
4
|
+
static setConnectionAdapter(adapter: ConnectionAdapter): void;
|
5
|
+
static createRefModel(request: any, option: any): any;
|
6
|
+
refManagerClass(): typeof ArSyncModel;
|
7
|
+
connectionManager(): any;
|
8
|
+
static _cache: {};
|
9
|
+
static cacheTimeout: number;
|
10
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const ArSyncStore_1 = require("./ArSyncStore");
|
4
|
+
const ConnectionManager_1 = require("../core/ConnectionManager");
|
5
|
+
const ArSyncModelBase_1 = require("../core/ArSyncModelBase");
|
6
|
+
class ArSyncModel extends ArSyncModelBase_1.default {
|
7
|
+
static setConnectionAdapter(adapter) {
|
8
|
+
ArSyncStore_1.default.connectionManager = new ConnectionManager_1.default(adapter);
|
9
|
+
}
|
10
|
+
static createRefModel(request, option) {
|
11
|
+
return new ArSyncStore_1.default(request, option);
|
12
|
+
}
|
13
|
+
refManagerClass() {
|
14
|
+
return ArSyncModel;
|
15
|
+
}
|
16
|
+
connectionManager() {
|
17
|
+
return ArSyncStore_1.default.connectionManager;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
ArSyncModel._cache = {};
|
21
|
+
ArSyncModel.cacheTimeout = 10 * 1000;
|
22
|
+
exports.default = ArSyncModel;
|
@@ -0,0 +1,28 @@
|
|
1
|
+
export default class ArSyncStore {
|
2
|
+
immutable: any;
|
3
|
+
markedForFreezeObjects: any;
|
4
|
+
changes: any;
|
5
|
+
eventListeners: any;
|
6
|
+
markForRelease: any;
|
7
|
+
container: any;
|
8
|
+
request: any;
|
9
|
+
complete: boolean;
|
10
|
+
notfound?: boolean;
|
11
|
+
data: any;
|
12
|
+
changesBufferTimer: number | undefined | null;
|
13
|
+
retryLoadTimer: number | undefined | null;
|
14
|
+
static connectionManager: any;
|
15
|
+
constructor(request: any, { immutable }?: {
|
16
|
+
immutable?: boolean | undefined;
|
17
|
+
});
|
18
|
+
load(retryCount: number): void;
|
19
|
+
setChangesBufferTimer(): void;
|
20
|
+
subscribe(event: any, callback: any): {
|
21
|
+
unsubscribe: () => void;
|
22
|
+
};
|
23
|
+
trigger(event: any, arg?: any): void;
|
24
|
+
mark(object: any): void;
|
25
|
+
freezeRecursive(obj: any): any;
|
26
|
+
freezeMarked(): void;
|
27
|
+
release(): void;
|
28
|
+
}
|