@acoustic-content-sdk/redux-store

Implementation of a Redux store with support for adding feature modules, dynamically.

Usage no npm install needed!

<script type="module">
  import acousticContentSdkReduxStore from 'https://cdn.skypack.dev/@acoustic-content-sdk/redux-store';
</script>

README

npm

Implementation of a Redux store with support for adding feature modules, dynamically.

Providing a feature module

Create and export an instance of ReduxFeatureModule for your module.

Example

import {
  ReduxFeatureModule,
  createReduxFeatureModule
} from '@acoustic-content-sdk/redux-store';

import { sampleEpic } from './feature.epics';
import { sampleReducer } from './feature.reducer';
import { SampleFeatureState } from './feature.state';

export const sampleFeature = createReduxFeatureModule(
  'SAMPLE_FEATURE',
  sampleReducer,
  sampleEpic
);

In some cases a feature module depends on the existence on other feature modules, e.g. because an epic might require it. In this case list the modules the feature modules depends on in the dependencies parameter:

import {
  ReduxFeatureModule,
  createReduxFeatureModule
} from '@acoustic-content-sdk/redux-store';

import { sampleEpic } from './feature.epics';
import { sampleReducer } from './feature.reducer';
import { SampleFeatureState } from './feature.state';

export const sampleFeature = createReduxFeatureModule(
  'SAMPLE_FEATURE',
  sampleReducer,
  sampleEpic,
  [depModule1, depModule2, depModule3]
);

Registering a feature module

Register the feature module with the root store using the addFeatureModule method. This will also register all dependent modules in topology order.

import {
  ReduxRootStore
} from '@acoustic-content-sdk/redux-store';

const store: ReduxRootStore = ...;

store.addFeatureModule(sampleFeature);

Consuming a feature module

Use the selectFeature method to create a selector for the desired feature.

Example

import { selectFeature } from '@acoustic-content-sdk/redux-store';

const selectSample = selectFeature(sampleFeature);

Side effects in Feature Modules

Feature modules may provide side effects (Epics) for asynchronous processing. Sometimes such epics require an initialization event to execute bootstrapping logic. The store sends an initialization event for this purpose, after a feature module has been initialized. Use the ofInitFeature method to subscribe to this event.

Example

import { ofInitFeature } from '@acoustic-content-sdk/redux-store';

const initEpic: Epic = (actions$) =>
  actions$.pipe(ofInitFeature(sampleFeature), map(...));

API Documentation

API Documentation

Home > @acoustic-content-sdk/redux-store

redux-store package

Implementation of a Redux store with support for adding feature modules, dynamically.

Functions

Function Description
createIdentifier(idOrModuleId, aValue) Scopes the given ID with a feature prefix to make it unique
createReduxFeatureModule(idOrModuleId, reducer, epic, dependencies) Convenience method to create a feature module
createReduxMetaModule(dependencies) Convenience method to create a meta module, i.e. a module that bundles other modules
createReduxRootStore(aDependencies, aPreLoadedState) Constructs a new store that can handle feature modules.
featureModuleId(id) Constructs a feature module ID that carries type information
ofInitFeature(idOrModuleId) Returns an operator function that filters the initialization actions for a particular feature. This is typically used in feature epics. Since we know that an initialization can occur at most once, the operator also terminates automatically after the first emission.
rxSelectFeature(idOrModuleId) Returns a selector that selects the given feature from the store and returns an observable to that feature state.
rxStore(aStore) Exposes the store as an Observable.

Interfaces

Interface Description
PayloadAction Base class for actions that carry a payload. Use the selectPayload method to extract the payload.
ReduxFeatureModule Defines the feature module. The ID identifies the section in the state and is also used to globally discriminate features.After instantiating a feature store the store will fire an initialization action for that feature. Use ofInitFeature() to register for these initialization actions.
ReduxFeatureModuleId Feature module identifier. This wrapper around an ID is useful, because it carries type information.
ReduxRootStore Implementation of a store that manages sub-state as features. Features are added to the store automatically, when required by the select method.
ReduxRootStoreDependencies Dependencies object available for epics

Variables

Variable Description
rxDispatch Binds the dispatch method
rxSelect Exposes a memoized selector function
selectFeature Returns a selector that selects the given feature
selectPayload Selects the payload from a PayloadAction instance
STORE_ID Exposes the namespace of this store. This constant can e.g. be used to prefix actions.
VERSION Version and build number of the package

Type Aliases

Type Alias Description
ReduxRootState Root state for the reducer, this is a mapping from feature ID to feature.

Home > @acoustic-content-sdk/redux-store > createIdentifier

createIdentifier() function

Scopes the given ID with a feature prefix to make it unique

Signature:

export declare function createIdentifier(idOrModuleId: string | ReduxFeatureModuleId<any, any>, aValue?: string): string;

Parameters

Parameter Type Description
idOrModuleId string | ReduxFeatureModuleId<any, any> the module
aValue string optionally a identifier, will create a random identifier otherwise

Returns:

string

the new identifier

Home > @acoustic-content-sdk/redux-store > createReduxFeatureModule

createReduxFeatureModule() function

Convenience method to create a feature module

Signature:

export declare function createReduxFeatureModule<S, FS = any, Input extends Action = AnyAction, Output extends Input = Input, Dependencies = any>(idOrModuleId?: string | ReduxFeatureModuleId<S, FS>, reducer?: Reducer<S>, epic?: Epic<Input, Output, ReduxRootState, Dependencies>, dependencies?: ArrayLike<ReduxFeatureModule<any>>): ReduxFeatureModule<S, FS>;

Parameters

Parameter Type Description
idOrModuleId string | ReduxFeatureModuleId<S, FS> ID of the store, if not set, generate a random identifier
reducer Reducer<S> optionally the reducer
epic Epic<Input, Output, ReduxRootState, Dependencies> optionally the epic
dependencies ArrayLike<ReduxFeatureModule<any>> optionally the dependencies on other modules

Returns:

ReduxFeatureModule<S, FS>

a ReduxFeatureModule instance

Home > @acoustic-content-sdk/redux-store > createReduxMetaModule

createReduxMetaModule() function

Convenience method to create a meta module, i.e. a module that bundles other modules

Signature:

export declare function createReduxMetaModule<FS = any>(dependencies: ArrayLike<ReduxFeatureModule<any>>): ReduxFeatureModule<any, FS>;

Parameters

Parameter Type Description
dependencies ArrayLike<ReduxFeatureModule<any>> dependencies on other modules

Returns:

ReduxFeatureModule<any, FS>

a ReduxFeatureModule instance

Home > @acoustic-content-sdk/redux-store > createReduxRootStore

createReduxRootStore() function

Constructs a new store that can handle feature modules.

Signature:

export declare function createReduxRootStore(aDependencies: any, aPreLoadedState?: ReduxRootState): ReduxRootStore;

Parameters

Parameter Type Description
aDependencies any the dependencies that will be injected into the epics
aPreLoadedState ReduxRootState optionally an initial state object

Returns:

ReduxRootStore

the store. Use the ReduxRootStore.addFeatureModule() method to register a feature module.

Home > @acoustic-content-sdk/redux-store > featureModuleId

featureModuleId() function

Constructs a feature module ID that carries type information

Signature:

export declare function featureModuleId<S, FS = any>(id?: string): ReduxFeatureModuleId<S, FS>;

Parameters

Parameter Type Description
id string the module identifier or empty to create a random identifier

Returns:

ReduxFeatureModuleId<S, FS>

the ID

Home > @acoustic-content-sdk/redux-store > ofInitFeature

ofInitFeature() function

Returns an operator function that filters the initialization actions for a particular feature. This is typically used in feature epics. Since we know that an initialization can occur at most once, the operator also terminates automatically after the first emission.

Signature:

export declare function ofInitFeature<A = AnyAction>(idOrModuleId: string | ReduxFeatureModuleId<any, any>): OperatorFunction<A, string>;

Parameters

Parameter Type Description
idOrModuleId string | ReduxFeatureModuleId<any, any> the feature ID to filter for

Returns:

OperatorFunction<A, string>

the operator function that filters for the initialization action and resolves to the ID of the feature

Home > @acoustic-content-sdk/redux-store > rxSelectFeature

rxSelectFeature() function

Returns a selector that selects the given feature from the store and returns an observable to that feature state.

Signature:

export declare function rxSelectFeature<S, FS = any>(idOrModuleId: string | ReduxFeatureModuleId<S, FS>): UnaryFunction<ReduxRootStore, Observable<S>>;

Parameters

Parameter Type Description
idOrModuleId string | ReduxFeatureModuleId<S, FS> ID of the module

Returns:

UnaryFunction<ReduxRootStore, Observable<S>>

an observable with the feature selected

Home > @acoustic-content-sdk/redux-store > rxStore

rxStore() function

Exposes the store as an Observable.

Signature:

export declare function rxStore<S>(aStore: Store<S>): Observable<S>;

Parameters

Parameter Type Description
aStore Store<S> the store

Returns:

Observable<S>

the store as an Observable

Home > @acoustic-content-sdk/redux-store > PayloadAction

PayloadAction interface

Base class for actions that carry a payload. Use the selectPayload method to extract the payload.

Signature:

export interface PayloadAction<T> extends Action 

Properties

Property Type Description
payload T

Home > @acoustic-content-sdk/redux-store > selectPayload

selectPayload variable

Selects the payload from a PayloadAction instance

Signature:

selectPayload: <T>(aAction: PayloadAction<T>) => T

Home > @acoustic-content-sdk/redux-store > ReduxFeatureModule

ReduxFeatureModule interface

Defines the feature module. The ID identifies the section in the state and is also used to globally discriminate features.

After instantiating a feature store the store will fire an initialization action for that feature. Use ofInitFeature() to register for these initialization actions.

Signature:

export interface ReduxFeatureModule<S, FS = any, Input extends Action = AnyAction, Output extends Input = Input, Dependencies = any> extends ReduxFeatureModuleId<S, FS> 

Properties

Property Type Description
dependencies ArrayLike<ReduxFeatureModule<any>> Dependencies on other modules
epic Epic<Input, Output, ReduxRootState, Dependencies> The epic for side effects
id string ID of the feature module, will also be used as the key to the state
reducer Reducer<S> The reducer for the module.

Home > @acoustic-content-sdk/redux-store > ReduxFeatureModuleId

ReduxFeatureModuleId interface

Feature module identifier. This wrapper around an ID is useful, because it carries type information.

Signature:

export interface ReduxFeatureModuleId<S, FS = any> 

Properties

Property Type Description
id string ID of the feature module, will also be used as the key to the state

Home > @acoustic-content-sdk/redux-store > ReduxRootStore

ReduxRootStore interface

Implementation of a store that manages sub-state as features. Features are added to the store automatically, when required by the select method.

Signature:

export interface ReduxRootStore<S = ReduxRootState, A extends Action = AnyAction> extends Store<S, A> 

Methods

Method Description
addFeatureModule(aFeature) Registers a feature module with the root store

Home > @acoustic-content-sdk/redux-store > ReduxRootStoreDependencies

ReduxRootStoreDependencies interface

Dependencies object available for epics

Signature:

export interface ReduxRootStoreDependencies 

Properties

Property Type Description
logSvc LoggerService Service that allows to create logger instances
rootStore ReduxRootStore The root store dependencies

Home > @acoustic-content-sdk/redux-store > rxDispatch

rxDispatch variable

Binds the dispatch method

Signature:

rxDispatch: <S>(aStore: Store<S>) => Consumer<AnyAction>

Home > @acoustic-content-sdk/redux-store > rxSelect

rxSelect variable

Exposes a memoized selector function

Signature:

rxSelect: <T, R>(aSelector: UnaryFunction<T, R>, aCmp?: EqualsPredicate<R>) => OperatorFunction<T, R>

Home > @acoustic-content-sdk/redux-store > selectFeature

selectFeature variable

Returns a selector that selects the given feature

Signature:

selectFeature: <S, FS = any>(idOrModuleId: string | ReduxFeatureModuleId<S, FS>, aDefaultState?: S) => UnaryFunction<ReduxRootState, S>

Home > @acoustic-content-sdk/redux-store > STORE_ID

STORE_ID variable

Exposes the namespace of this store. This constant can e.g. be used to prefix actions.

Signature:

STORE_ID = "@acoustic-content-sdk/redux-store"

Home > @acoustic-content-sdk/redux-store > VERSION

VERSION variable

Version and build number of the package

Signature:

VERSION: {
    version: {
        major: string;
        minor: string;
        patch: string;
        branch: string;
    };
    build: Date;
}

Home > @acoustic-content-sdk/redux-store > ReduxRootState

ReduxRootState type

Root state for the reducer, this is a mapping from feature ID to feature.

Signature:

export declare type ReduxRootState = Record<string, any>;

Home > @acoustic-content-sdk/redux-store > ReduxRootStore > addFeatureModule

ReduxRootStore.addFeatureModule() method

Registers a feature module with the root store

Signature:

addFeatureModule<RFS = any, FS = any>(aFeature: ReduxFeatureModule<RFS, FS>): ReduxRootStore<FS, A>;

Parameters

Parameter Type Description
aFeature ReduxFeatureModule<RFS, FS> the feature model

Returns:

ReduxRootStore<FS, A>

Home > @acoustic-content-sdk/redux-store > PayloadAction > payload

PayloadAction.payload property

Signature:

[ACTION_PAYLOAD]: T;

Home > @acoustic-content-sdk/redux-store > ReduxFeatureModuleId > id

ReduxFeatureModuleId.id property

ID of the feature module, will also be used as the key to the state

Signature:

id: string;

Home > @acoustic-content-sdk/redux-store > ReduxFeatureModule > dependencies

ReduxFeatureModule.dependencies property

Dependencies on other modules

Signature:

dependencies?: ArrayLike<ReduxFeatureModule<any>>;

Home > @acoustic-content-sdk/redux-store > ReduxFeatureModule > epic

ReduxFeatureModule.epic property

The epic for side effects

Signature:

epic?: Epic<Input, Output, ReduxRootState, Dependencies>;

Home > @acoustic-content-sdk/redux-store > ReduxFeatureModule > id

ReduxFeatureModule.id property

ID of the feature module, will also be used as the key to the state

Signature:

id: string;

Home > @acoustic-content-sdk/redux-store > ReduxFeatureModule > reducer

ReduxFeatureModule.reducer property

The reducer for the module.

Signature:

reducer?: Reducer<S>;

Home > @acoustic-content-sdk/redux-store > ReduxRootStoreDependencies > logSvc

ReduxRootStoreDependencies.logSvc property

Service that allows to create logger instances

Signature:

logSvc: LoggerService;

Home > @acoustic-content-sdk/redux-store > ReduxRootStoreDependencies > rootStore

ReduxRootStoreDependencies.rootStore property

The root store dependencies

Signature:

rootStore: ReduxRootStore;