@orbit/coordinator
Version:
A coordinator and set of coordination strategies for managing data flow and keeping @orbit/data sources in sync.
79 lines (71 loc) • 2.41 kB
text/typescript
import {
ConnectionStrategy,
ConnectionStrategyOptions
} from './connection-strategy';
import {
FullResponse,
NamedFullResponse,
Operation,
Query,
QueryExpression,
ResponseHints,
Transform
} from '@orbit/data';
export interface RequestStrategyOptions extends ConnectionStrategyOptions {
/**
* Should results returned from calling `action` on the `target` source be
* passed as hint data back to the `source`?
*
* This can allow hints to inform the processing of subsequent actions on the
* source. For instance, a `beforeQuery` event might invoke `query` on a
* target, and those results could inform how the originating source performs
* `_query`. This might allow a target source's sorting and filtering of
* results to affect how the originating source processes the query.
*
* This setting is only effective for `blocking` strategies, since only in
* those scenarios is processing delayed.
*/
passHints?: boolean;
}
export class RequestStrategy extends ConnectionStrategy {
public passHints: boolean;
constructor(options: RequestStrategyOptions) {
super(options);
this.passHints = !!options.passHints;
}
protected invokeAction(
request: Query<QueryExpression> | Transform<Operation>
): Promise<NamedFullResponse<unknown, unknown, Operation>> {
if (typeof this._action === 'string') {
return (this.target as any)[this._action](request, {
fullResponse: true
});
} else {
return super.invokeAction(...arguments) as Promise<
NamedFullResponse<unknown, unknown, Operation>
>;
}
}
protected async handleBlockingResponse(
result: Promise<FullResponse<unknown, unknown, Operation>>,
request: Query<QueryExpression> | Transform<Operation>,
hints?: ResponseHints<unknown, unknown>
): Promise<NamedFullResponse<unknown, unknown, Operation>> {
const fullResponse = await result;
if (this.passHints && hints) {
this.assignHints(hints, fullResponse);
}
return [this.target.name as string, fullResponse];
}
protected assignHints(
hints: ResponseHints<unknown, unknown>,
fullResponse: FullResponse<unknown, unknown, Operation>
): void {
if (fullResponse.data !== undefined) {
hints.data = fullResponse.data;
}
if (fullResponse.details !== undefined) {
hints.details = fullResponse.details;
}
}
}