CoreManager.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. "use strict";
  2. /*
  3. * @flow
  4. */
  5. /*:: import type { AttributeMap, ObjectCache, OpsMap, State } from './ObjectStateMutations';*/
  6. /*:: import type ParseFile from './ParseFile';*/
  7. /*:: import type { FileSource } from './ParseFile';*/
  8. /*:: import type { Op } from './ParseOp';*/
  9. /*:: import type ParseObject from './ParseObject';*/
  10. /*:: import type { QueryJSON } from './ParseQuery';*/
  11. /*:: import type ParseUser from './ParseUser';*/
  12. /*:: import type { AuthData } from './ParseUser';*/
  13. /*:: import type { PushData } from './Push';*/
  14. /*:: import type { RequestOptions, FullOptions } from './RESTController';*/
  15. /*:: type AnalyticsController = {
  16. track: (name: string, dimensions: { [key: string]: string }) => Promise,
  17. };*/
  18. /*:: type CloudController = {
  19. run: (name: string, data: mixed, options: RequestOptions) => Promise,
  20. getJobsData: (options: RequestOptions) => Promise,
  21. startJob: (name: string, data: mixed, options: RequestOptions) => Promise,
  22. };*/
  23. /*:: type ConfigController = {
  24. current: () => Promise,
  25. get: () => Promise,
  26. save: (attrs: { [key: string]: any }) => Promise,
  27. };*/
  28. /*:: type CryptoController = {
  29. encrypt: (obj: any, secretKey: string) => string,
  30. decrypt: (encryptedText: string, secretKey: any) => string,
  31. };*/
  32. /*:: type FileController = {
  33. saveFile: (name: string, source: FileSource, options: FullOptions) => Promise,
  34. saveBase64: (name: string, source: FileSource, options: FullOptions) => Promise,
  35. download: (uri: string) => Promise,
  36. };*/
  37. /*:: type InstallationController = {
  38. currentInstallationId: () => Promise,
  39. };*/
  40. /*:: type ObjectController = {
  41. fetch: (
  42. object: ParseObject | Array<ParseObject>,
  43. forceFetch: boolean,
  44. options: RequestOptions
  45. ) => Promise,
  46. save: (object: ParseObject | Array<ParseObject | ParseFile>, options: RequestOptions) => Promise,
  47. destroy: (object: ParseObject | Array<ParseObject>, options: RequestOptions) => Promise,
  48. };*/
  49. /*:: type ObjectStateController = {
  50. getState: (obj: any) => ?State,
  51. initializeState: (obj: any, initial?: State) => State,
  52. removeState: (obj: any) => ?State,
  53. getServerData: (obj: any) => AttributeMap,
  54. setServerData: (obj: any, attributes: AttributeMap) => void,
  55. getPendingOps: (obj: any) => Array<OpsMap>,
  56. setPendingOp: (obj: any, attr: string, op: ?Op) => void,
  57. pushPendingState: (obj: any) => void,
  58. popPendingState: (obj: any) => OpsMap,
  59. mergeFirstPendingState: (obj: any) => void,
  60. getObjectCache: (obj: any) => ObjectCache,
  61. estimateAttribute: (obj: any, attr: string) => mixed,
  62. estimateAttributes: (obj: any) => AttributeMap,
  63. commitServerChanges: (obj: any, changes: AttributeMap) => void,
  64. enqueueTask: (obj: any, task: () => Promise) => Promise,
  65. clearAllState: () => void,
  66. duplicateState: (source: any, dest: any) => void,
  67. };*/
  68. /*:: type PushController = {
  69. send: (data: PushData) => Promise,
  70. };*/
  71. /*:: type QueryController = {
  72. find: (className: string, params: QueryJSON, options: RequestOptions) => Promise,
  73. aggregate: (className: string, params: any, options: RequestOptions) => Promise,
  74. };*/
  75. /*:: type RESTController = {
  76. request: (method: string, path: string, data: mixed, options: RequestOptions) => Promise,
  77. ajax: (method: string, url: string, data: any, headers?: any, options: FullOptions) => Promise,
  78. };*/
  79. /*:: type SchemaController = {
  80. purge: (className: string) => Promise,
  81. get: (className: string, options: RequestOptions) => Promise,
  82. delete: (className: string, options: RequestOptions) => Promise,
  83. create: (className: string, params: any, options: RequestOptions) => Promise,
  84. update: (className: string, params: any, options: RequestOptions) => Promise,
  85. send(className: string, method: string, params: any, options: RequestOptions): Promise,
  86. };*/
  87. /*:: type SessionController = {
  88. getSession: (token: RequestOptions) => Promise,
  89. };*/
  90. /*:: type StorageController =
  91. | {
  92. async: 0,
  93. getItem: (path: string) => ?string,
  94. setItem: (path: string, value: string) => void,
  95. removeItem: (path: string) => void,
  96. getItemAsync?: (path: string) => Promise,
  97. setItemAsync?: (path: string, value: string) => Promise,
  98. removeItemAsync?: (path: string) => Promise,
  99. clear: () => void,
  100. }
  101. | {
  102. async: 1,
  103. getItem?: (path: string) => ?string,
  104. setItem?: (path: string, value: string) => void,
  105. removeItem?: (path: string) => void,
  106. getItemAsync: (path: string) => Promise,
  107. setItemAsync: (path: string, value: string) => Promise,
  108. removeItemAsync: (path: string) => Promise,
  109. clear: () => void,
  110. };*/
  111. /*:: type LocalDatastoreController = {
  112. fromPinWithName: (name: string) => ?any,
  113. pinWithName: (name: string, objects: any) => void,
  114. unPinWithName: (name: string) => void,
  115. getAllContents: () => ?any,
  116. clear: () => void,
  117. };*/
  118. /*:: type UserController = {
  119. setCurrentUser: (user: ParseUser) => Promise,
  120. currentUser: () => ?ParseUser,
  121. currentUserAsync: () => Promise,
  122. signUp: (user: ParseUser, attrs: AttributeMap, options: RequestOptions) => Promise,
  123. logIn: (user: ParseUser, options: RequestOptions) => Promise,
  124. become: (options: RequestOptions) => Promise,
  125. hydrate: (userJSON: AttributeMap) => Promise,
  126. logOut: (options: RequestOptions) => Promise,
  127. me: (options: RequestOptions) => Promise,
  128. requestPasswordReset: (email: string, options: RequestOptions) => Promise,
  129. updateUserOnDisk: (user: ParseUser) => Promise,
  130. upgradeToRevocableSession: (user: ParseUser, options: RequestOptions) => Promise,
  131. linkWith: (user: ParseUser, authData: AuthData) => Promise,
  132. removeUserFromDisk: () => Promise,
  133. verifyPassword: (username: string, password: string, options: RequestOptions) => Promise,
  134. requestEmailVerification: (email: string, options: RequestOptions) => Promise,
  135. };*/
  136. /*:: type HooksController = {
  137. get: (type: string, functionName?: string, triggerName?: string) => Promise,
  138. create: (hook: mixed) => Promise,
  139. delete: (hook: mixed) => Promise,
  140. update: (hook: mixed) => Promise,
  141. send: (method: string, path: string, body?: mixed) => Promise,
  142. };*/
  143. /*:: type WebSocketController = {
  144. onopen: () => void,
  145. onmessage: (message: any) => void,
  146. onclose: () => void,
  147. onerror: (error: any) => void,
  148. send: (data: any) => void,
  149. close: () => void,
  150. };*/
  151. /*:: type Config = {
  152. AnalyticsController?: AnalyticsController,
  153. CloudController?: CloudController,
  154. ConfigController?: ConfigController,
  155. FileController?: FileController,
  156. InstallationController?: InstallationController,
  157. ObjectController?: ObjectController,
  158. ObjectStateController?: ObjectStateController,
  159. PushController?: PushController,
  160. QueryController?: QueryController,
  161. RESTController?: RESTController,
  162. SchemaController?: SchemaController,
  163. SessionController?: SessionController,
  164. StorageController?: StorageController,
  165. LocalDatastoreController?: LocalDatastoreController,
  166. UserController?: UserController,
  167. HooksController?: HooksController,
  168. WebSocketController?: WebSocketController,
  169. };*/
  170. const config /*: Config & { [key: string]: mixed }*/ = {
  171. // Defaults
  172. IS_NODE: typeof process !== 'undefined' && !!process.versions && !!process.versions.node && !process.versions.electron,
  173. REQUEST_ATTEMPT_LIMIT: 5,
  174. REQUEST_BATCH_SIZE: 20,
  175. REQUEST_HEADERS: {},
  176. SERVER_URL: 'https://api.parse.com/1',
  177. SERVER_AUTH_TYPE: null,
  178. SERVER_AUTH_TOKEN: null,
  179. LIVEQUERY_SERVER_URL: null,
  180. ENCRYPTED_KEY: null,
  181. VERSION: 'js' + "4.2.0",
  182. APPLICATION_ID: null,
  183. JAVASCRIPT_KEY: null,
  184. MASTER_KEY: null,
  185. USE_MASTER_KEY: false,
  186. PERFORM_USER_REWRITE: true,
  187. FORCE_REVOCABLE_SESSION: false,
  188. ENCRYPTED_USER: false,
  189. IDEMPOTENCY: false,
  190. ALLOW_CUSTOM_OBJECT_ID: false
  191. };
  192. function requireMethods(name /*: string*/, methods /*: Array<string>*/, controller /*: any*/) {
  193. methods.forEach(func => {
  194. if (typeof controller[func] !== 'function') {
  195. throw new Error(`${name} must implement ${func}()`);
  196. }
  197. });
  198. }
  199. module.exports = {
  200. get: function (key /*: string*/) /*: any*/{
  201. if (config.hasOwnProperty(key)) {
  202. return config[key];
  203. }
  204. throw new Error('Configuration key not found: ' + key);
  205. },
  206. set: function (key /*: string*/, value /*: any*/) /*: void*/{
  207. config[key] = value;
  208. },
  209. /* Specialized Controller Setters/Getters */
  210. setAnalyticsController(controller /*: AnalyticsController*/) {
  211. requireMethods('AnalyticsController', ['track'], controller);
  212. config['AnalyticsController'] = controller;
  213. },
  214. getAnalyticsController() /*: AnalyticsController*/{
  215. return config['AnalyticsController'];
  216. },
  217. setCloudController(controller /*: CloudController*/) {
  218. requireMethods('CloudController', ['run', 'getJobsData', 'startJob'], controller);
  219. config['CloudController'] = controller;
  220. },
  221. getCloudController() /*: CloudController*/{
  222. return config['CloudController'];
  223. },
  224. setConfigController(controller /*: ConfigController*/) {
  225. requireMethods('ConfigController', ['current', 'get', 'save'], controller);
  226. config['ConfigController'] = controller;
  227. },
  228. getConfigController() /*: ConfigController*/{
  229. return config['ConfigController'];
  230. },
  231. setCryptoController(controller /*: CryptoController*/) {
  232. requireMethods('CryptoController', ['encrypt', 'decrypt'], controller);
  233. config['CryptoController'] = controller;
  234. },
  235. getCryptoController() /*: CryptoController*/{
  236. return config['CryptoController'];
  237. },
  238. setFileController(controller /*: FileController*/) {
  239. requireMethods('FileController', ['saveFile', 'saveBase64'], controller);
  240. config['FileController'] = controller;
  241. },
  242. getFileController() /*: FileController*/{
  243. return config['FileController'];
  244. },
  245. setInstallationController(controller /*: InstallationController*/) {
  246. requireMethods('InstallationController', ['currentInstallationId'], controller);
  247. config['InstallationController'] = controller;
  248. },
  249. getInstallationController() /*: InstallationController*/{
  250. return config['InstallationController'];
  251. },
  252. setObjectController(controller /*: ObjectController*/) {
  253. requireMethods('ObjectController', ['save', 'fetch', 'destroy'], controller);
  254. config['ObjectController'] = controller;
  255. },
  256. getObjectController() /*: ObjectController*/{
  257. return config['ObjectController'];
  258. },
  259. setObjectStateController(controller /*: ObjectStateController*/) {
  260. requireMethods('ObjectStateController', ['getState', 'initializeState', 'removeState', 'getServerData', 'setServerData', 'getPendingOps', 'setPendingOp', 'pushPendingState', 'popPendingState', 'mergeFirstPendingState', 'getObjectCache', 'estimateAttribute', 'estimateAttributes', 'commitServerChanges', 'enqueueTask', 'clearAllState'], controller);
  261. config['ObjectStateController'] = controller;
  262. },
  263. getObjectStateController() /*: ObjectStateController*/{
  264. return config['ObjectStateController'];
  265. },
  266. setPushController(controller /*: PushController*/) {
  267. requireMethods('PushController', ['send'], controller);
  268. config['PushController'] = controller;
  269. },
  270. getPushController() /*: PushController*/{
  271. return config['PushController'];
  272. },
  273. setQueryController(controller /*: QueryController*/) {
  274. requireMethods('QueryController', ['find', 'aggregate'], controller);
  275. config['QueryController'] = controller;
  276. },
  277. getQueryController() /*: QueryController*/{
  278. return config['QueryController'];
  279. },
  280. setRESTController(controller /*: RESTController*/) {
  281. requireMethods('RESTController', ['request', 'ajax'], controller);
  282. config['RESTController'] = controller;
  283. },
  284. getRESTController() /*: RESTController*/{
  285. return config['RESTController'];
  286. },
  287. setSchemaController(controller /*: SchemaController*/) {
  288. requireMethods('SchemaController', ['get', 'create', 'update', 'delete', 'send', 'purge'], controller);
  289. config['SchemaController'] = controller;
  290. },
  291. getSchemaController() /*: SchemaController*/{
  292. return config['SchemaController'];
  293. },
  294. setSessionController(controller /*: SessionController*/) {
  295. requireMethods('SessionController', ['getSession'], controller);
  296. config['SessionController'] = controller;
  297. },
  298. getSessionController() /*: SessionController*/{
  299. return config['SessionController'];
  300. },
  301. setStorageController(controller /*: StorageController*/) {
  302. if (controller.async) {
  303. requireMethods('An async StorageController', ['getItemAsync', 'setItemAsync', 'removeItemAsync', 'getAllKeysAsync'], controller);
  304. } else {
  305. requireMethods('A synchronous StorageController', ['getItem', 'setItem', 'removeItem', 'getAllKeys'], controller);
  306. }
  307. config['StorageController'] = controller;
  308. },
  309. setLocalDatastoreController(controller /*: LocalDatastoreController*/) {
  310. requireMethods('LocalDatastoreController', ['pinWithName', 'fromPinWithName', 'unPinWithName', 'getAllContents', 'clear'], controller);
  311. config['LocalDatastoreController'] = controller;
  312. },
  313. getLocalDatastoreController() /*: LocalDatastoreController*/{
  314. return config['LocalDatastoreController'];
  315. },
  316. setLocalDatastore(store /*: any*/) {
  317. config['LocalDatastore'] = store;
  318. },
  319. getLocalDatastore() {
  320. return config['LocalDatastore'];
  321. },
  322. getStorageController() /*: StorageController*/{
  323. return config['StorageController'];
  324. },
  325. setAsyncStorage(storage /*: any*/) {
  326. config['AsyncStorage'] = storage;
  327. },
  328. getAsyncStorage() {
  329. return config['AsyncStorage'];
  330. },
  331. setWebSocketController(controller /*: WebSocketController*/) {
  332. config['WebSocketController'] = controller;
  333. },
  334. getWebSocketController() /*: WebSocketController*/{
  335. return config['WebSocketController'];
  336. },
  337. setUserController(controller /*: UserController*/) {
  338. requireMethods('UserController', ['setCurrentUser', 'currentUser', 'currentUserAsync', 'signUp', 'logIn', 'become', 'logOut', 'me', 'requestPasswordReset', 'upgradeToRevocableSession', 'requestEmailVerification', 'verifyPassword', 'linkWith'], controller);
  339. config['UserController'] = controller;
  340. },
  341. getUserController() /*: UserController*/{
  342. return config['UserController'];
  343. },
  344. setLiveQueryController(controller /*: any*/) {
  345. requireMethods('LiveQueryController', ['setDefaultLiveQueryClient', 'getDefaultLiveQueryClient', '_clearCachedDefaultClient'], controller);
  346. config['LiveQueryController'] = controller;
  347. },
  348. getLiveQueryController() /*: any*/{
  349. return config['LiveQueryController'];
  350. },
  351. setHooksController(controller /*: HooksController*/) {
  352. requireMethods('HooksController', ['create', 'get', 'update', 'remove'], controller);
  353. config['HooksController'] = controller;
  354. },
  355. getHooksController() /*: HooksController*/{
  356. return config['HooksController'];
  357. }
  358. };