CoreManager.js 15 KB

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