All files / src/storage ISubscribableStorageProvider.ts

100% Statements 2/2
100% Branches 0/0
100% Functions 1/1
100% Lines 2/2

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39                                                                  1x     62x    
import { IStorageProvider } from './IStorageProvider';
import { IAgedValue } from '../queue/IAgedQueue';
 
/**
 * A function to execute when a IStorageProvider key/value changes. Used with subscribe/unsubscribe
 * @param key The key that was set/delete
 * @param value The value that was set or undefined if it was a delete
 */
export type StorageProviderUpdateHandler<TKey, TValue> = (
  key: TKey,
  value?: IAgedValue<TValue>
) => void;
 
/**
 * A storage provider that can propogate changes through the cluster. In a distributed system where
 * data is partially stored at the node level, some systems require a mechanism to sychronize writes.
 */
export interface ISubscribableStorageProvider<TKey, TValue> extends IStorageProvider<TKey, TValue> {
  /**
   * Whenever a key/value changes, the storage provider can notify observers, so that
   * they can react accordingly. This will add the observer until an unsubscribe() is called
   * @param handler The function that will execute when a key/value changes
   * @return If subscribing to changes was successful
   */
  subscribe(handler: StorageProviderUpdateHandler<TKey, TValue>): boolean;
 
  /**
   * @param handler The function to remove
   * @return If unsubscribing to changes was successful
   */
  unsubscribe(handler: StorageProviderUpdateHandler<TKey, TValue>): boolean;
}
 
export function isISubscribableStorageProvider<TKey, TValue>(
  provider: IStorageProvider<TKey, TValue>
): provider is ISubscribableStorageProvider<TKey, TValue> {
  return (provider as ISubscribableStorageProvider<TKey, TValue>).subscribe !== undefined;
}