Skip to content

Commit 230f8f8

Browse files
committed
Implement UniqueInstanceState
1 parent 8a7b2f4 commit 230f8f8

File tree

2 files changed

+538
-0
lines changed

2 files changed

+538
-0
lines changed

src/UniqueInstanceState.js

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/**
2+
* Copyright (c) 2015-present, Parse, LLC.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree. An additional grant
7+
* of patent rights can be found in the PATENTS file in the same directory.
8+
*
9+
* @flow
10+
*/
11+
12+
import * as ObjectState from './ObjectState';
13+
import TaskQueue from './TaskQueue';
14+
15+
import type ParseObject from './ParseObject';
16+
17+
let objectState = new WeakMap();
18+
19+
export function getState(obj: ParseObject): ?State {
20+
let classData = objectState.get(obj);
21+
return classData || null;
22+
}
23+
24+
export function initializeState(obj: ParseObject, initial?: State): State {
25+
let state = getState(obj);
26+
if (state) {
27+
return state;
28+
}
29+
if (!initial) {
30+
initial = {
31+
serverData: {},
32+
pendingOps: [{}],
33+
objectCache: {},
34+
tasks: new TaskQueue(),
35+
existed: false
36+
};
37+
}
38+
state = initial;
39+
objectState.set(obj, state);
40+
return state;
41+
}
42+
43+
export function removeState(obj: ParseObject): ?State {
44+
let state = getState(obj);
45+
if (state === null) {
46+
return null;
47+
}
48+
objectState.delete(obj);
49+
return state;
50+
}
51+
52+
export function getServerData(obj: ParseObject): AttributeMap {
53+
let state = getState(obj);
54+
if (state) {
55+
return state.serverData;
56+
}
57+
return {};
58+
}
59+
60+
export function setServerData(obj: ParseObject, attributes: AttributeMap) {
61+
let serverData = initializeState(obj).serverData;
62+
ObjectState.setServerData(serverData, attributes);
63+
}
64+
65+
export function getPendingOps(obj: ParseObject): Array<OpsMap> {
66+
let state = getState(obj);
67+
if (state) {
68+
return state.pendingOps;
69+
}
70+
return [{}];
71+
}
72+
73+
export function setPendingOp(obj: ParseObject, attr: string, op: ?Op) {
74+
let pendingOps = initializeState(obj).pendingOps;
75+
ObjectState.setPendingOp(pendingOps, attr, op);
76+
}
77+
78+
export function pushPendingState(obj: ParseObject) {
79+
let pendingOps = initializeState(obj).pendingOps;
80+
ObjectState.pushPendingState(pendingOps);
81+
}
82+
83+
export function popPendingState(obj: ParseObject): OpsMap {
84+
let pendingOps = initializeState(obj).pendingOps;
85+
return ObjectState.popPendingState(pendingOps);
86+
}
87+
88+
export function mergeFirstPendingState(obj: ParseObject) {
89+
let pendingOps = getPendingOps(obj);
90+
ObjectState.mergeFirstPendingState(pendingOps);
91+
}
92+
93+
export function getObjectCache(obj: ParseObject): ObjectCache {
94+
let state = getState(obj);
95+
if (state) {
96+
return state.objectCache;
97+
}
98+
return {};
99+
}
100+
101+
export function estimateAttribute(obj: ParseObject, attr: string): mixed {
102+
let serverData = getServerData(obj);
103+
let pendingOps = getPendingOps(obj);
104+
return ObjectState.estimateAttribute(serverData, pendingOps, obj.className, obj.id, attr);
105+
}
106+
107+
export function estimateAttributes(obj: ParseObject): AttributeMap {
108+
let serverData = getServerData(obj);
109+
let pendingOps = getPendingOps(obj);
110+
return ObjectState.estimateAttributes(serverData, pendingOps, obj.className, obj.id);
111+
}
112+
113+
export function commitServerChanges(obj: ParseObject, changes: AttributeMap) {
114+
let state = initializeState(obj);
115+
ObjectState.commitServerChanges(state.serverData, state.objectCache, changes);
116+
}
117+
118+
export function enqueueTask(obj: ParseObject, task: () => ParsePromise) {
119+
let state = initializeState(obj);
120+
return state.tasks.enqueue(task);
121+
}
122+
123+
export function _clearAllState() {
124+
objectState = new WeakMap();
125+
}

0 commit comments

Comments
 (0)