relay-runtime
Version:
A core runtime for building GraphQL-driven applications.
68 lines (57 loc) • 1.74 kB
Flow
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall relay
*/
;
import type {ConcreteRequest} from '../util/RelayConcreteNode';
import type {Disposable} from '../util/RelayRuntimeTypes';
type Callback = (concreteRequest: ConcreteRequest) => void;
class PreloadableQueryRegistry {
_preloadableQueries: Map<string, ConcreteRequest>;
_callbacks: Map<string, Set<Callback>>;
constructor() {
this._preloadableQueries = new Map();
this._callbacks = new Map();
}
set(key: string, value: ConcreteRequest) {
this._preloadableQueries.set(key, value);
const callbacks = this._callbacks.get(key);
if (callbacks != null) {
callbacks.forEach(cb => {
try {
cb(value);
} catch (e) {
// We do *not* want to throw in this tick, as this callback is executed
// while a query is required for the very first time.
setTimeout(() => {
throw e;
}, 0);
}
});
}
}
get(key: string): ?ConcreteRequest {
return this._preloadableQueries.get(key);
}
onLoad(key: string, callback: Callback): Disposable {
const callbacks = this._callbacks.get(key) ?? new Set();
callbacks.add(callback);
const dispose = () => {
callbacks.delete(callback);
};
this._callbacks.set(key, callbacks);
return {dispose};
}
clear() {
this._preloadableQueries.clear();
}
}
const preloadableQueryRegistry: PreloadableQueryRegistry =
new PreloadableQueryRegistry();
module.exports = preloadableQueryRegistry;