repo_description: A fast, local first, reactive Database for JavaScript Applications https://rxdb.info/
repo_topics: angular browser-database couchdb crdt database firebase graphql indexeddb ionic local-first localstorage nodejs nosql postgres pouchdb react-native realtime realtime-database rxdb sqlite
code: 
  /**
   * hook-functions that can be extended by the plugin
   */
  export const HOOKS = {
      /**
       * Runs before a plugin is added.
       * Use this to block the usage of non-compatible plugins.
       */
      preAddRxPlugin: [],
      /**
       * functions that run before the database is created
       */
      preCreateRxDatabase: [],
      /**
       * runs after the database is created and prepared
       * but before the instance is returned to the user
       * @async
       */
      createRxDatabase: [],
      preCreateRxCollection: [],
      createRxCollection: [],
      createRxState: [],
      /**
      * runs at the end of the close-process of a collection
      * @async
      */
      postCloseRxCollection: [],
      /**
       * Runs after a collection is removed.
       * @async
       */
      postRemoveRxCollection: [],
      /**
        * functions that get the json-schema as input
        * to do additionally checks/manipulation
        */
      preCreateRxSchema: [],
      /**
       * functions that run after the RxSchema is created
       * gets RxSchema as attribute
       */
      createRxSchema: [],
      prePrepareRxQuery: [],
      preCreateRxQuery: [],
      /**
       * Runs before a query is sent to the
       * prepareQuery function of the storage engine.
       */
      prePrepareQuery: [],
      createRxDocument: [],
      /**
       * runs after a RxDocument is created,
       * cannot be async
       */
      postCreateRxDocument: [],
      /**
       * Runs before a RxStorageInstance is created
       * gets the params of createStorageInstance()
       * as attribute so you can manipulate them.
       * Notice that you have to clone stuff before mutating the inputs.
       */
      preCreateRxStorageInstance: [],
      preStorageWrite: [],
      /**
       * runs on the document-data before the document is migrated
       * {
       *   doc: Object, // original doc-data
       *   migrated: // migrated doc-data after run through migration-strategies
       * }
       */
      preMigrateDocument: [],
      /**
       * runs after the migration of a document has been done
       */
      postMigrateDocument: [],
      /**
       * runs at the beginning of the close-process of a database
       */
      preCloseRxDatabase: [],
      /**
       * runs after a database has been removed
       * @async
       */
      postRemoveRxDatabase: [],
  
  
      postCleanup: [],
  
      /**
       * runs before the replication writes the rows to master
       * but before the rows have been modified
       * @async
       */
      preReplicationMasterWrite: [],
  
      /**
       * runs after the replication has been sent to the server
       * but before the new documents have been handled
       * @async
       */
      preReplicationMasterWriteDocumentsHandle: [],
  };
  
  export function runPluginHooks(hookKey: keyof typeof HOOKS, obj: any) {
      if (HOOKS[hookKey].length > 0) {
          HOOKS[hookKey].forEach(fun => (fun as any)(obj));
      }
  }
  
  
  /**
   * We do intentionally not run the hooks in parallel
   * because that makes stuff unpredictable and we use runAsyncPluginHooks()
   * only in places that are not that relevant for performance.
   */
  export async function runAsyncPluginHooks(hookKey: keyof typeof HOOKS, obj: any): Promise<any> {
      for (const fn of HOOKS[hookKey]) {
          await (fn as any)(obj);
      }
  }
  
  /**
   * used in tests to remove hooks
   */
  export function _clearHook(type: keyof typeof HOOKS, fun: Function) {
      HOOKS[type] = HOOKS[type].filter(h => h !== fun);
  }
  