scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
84 lines (65 loc) • 2.2 kB
text/typescript
import { ObjSpaceId } from 'scrivito_sdk/client';
import { InternalError, onReset } from 'scrivito_sdk/common';
import { ObjReplication } from 'scrivito_sdk/data/obj_replication';
import { ReplicationCache } from 'scrivito_sdk/data/replication_cache';
type WriteCallback = (p: Promise<void>) => void;
class ObjReplicationPool {
private replicationCache: ReplicationCache<ObjReplication>;
private writeCallbacks: {
[key: string]: WriteCallback;
};
private subscriptionToken: number;
constructor() {
this.replicationCache = new ReplicationCache(() => {
// forgot to set a strategy?
throw new InternalError();
});
this.writeCallbacks = {};
this.subscriptionToken = 0;
}
setReplicationStrategy(Strategy: ObjReplicationStrategy) {
this.replicationCache = new ReplicationCache(
(objSpaceId, objId) => new Strategy(objSpaceId, objId)
);
}
get(objSpaceId: ObjSpaceId, objId: string): ObjReplication {
return this.replicationCache.get(objSpaceId, objId);
}
subscribeWrites(callback: WriteCallback): number {
this.subscriptionToken += 1;
this.writeCallbacks[this.subscriptionToken] = callback;
return this.subscriptionToken;
}
unsubscribeWrites(token: number): void {
delete this.writeCallbacks[token];
}
writeStarted(promise: Promise<void>): void {
Object.keys(this.writeCallbacks).forEach((key) => {
const callback = this.writeCallbacks[key];
callback(promise);
});
}
// For test purpose only.
clearWriteCallbacks(): void {
this.writeCallbacks = {};
}
// For test purpose only.
clearCache(): void {
this.replicationCache.clear();
}
}
export const objReplicationPool = new ObjReplicationPool();
/* An ObjReplicationStrategy can be any class that has a specific constructor
* and implements the ObjReplication interface.
*/
type ObjReplicationStrategy = new (
objSpaceId: ObjSpaceId,
objId: string
) => ObjReplication;
export function useReplicationStrategy(Strategy: ObjReplicationStrategy) {
objReplicationPool.setReplicationStrategy(Strategy);
}
onReset(() => {
objReplicationPool.clearCache();
objReplicationPool.clearWriteCallbacks();
});