delta-store
Version:
An API for a store with change records
67 lines (57 loc) • 1.84 kB
text/typescript
/**
* Created by Papa on 1/10/2016.
*/
import {SharedChangeList} from '../RepositoryApi';
import {GoogleChangeListShareInfo} from './GoogleSharingModel';
import {DocumentHandle} from './realtime/DocumentHandle';
import {ChangeError, ChangeRecord, ChangeRecordIterator} from '../ChangeModel';
import {Subject} from 'rxjs';
import {ArrayChangeRecordIterator} from '../RepositoryApi';
import {SharingPlatformSetupInfo} from "../SharingAdaptor";
export class GoogleSharedChangeList implements SharedChangeList {
constructor(
public platformInfo: SharingPlatformSetupInfo,
public shareInfo: GoogleChangeListShareInfo,
private handle: DocumentHandle
) {
}
loadFromRecord(
changeRecord: ChangeRecord
): Promise<ChangeRecordIterator> {
return new Promise((
resolve,
reject
) => {
let allCurrentChangeRecords = this.handle.changeList.asArray();
if (!changeRecord) {
resolve(new ArrayChangeRecordIterator(allCurrentChangeRecords));
}
let id = this.platformInfo.recordIdField;
for (let i = 0; i < allCurrentChangeRecords.length; i++) {
let currentRecord = allCurrentChangeRecords[i];
if (currentRecord[id] === changeRecord[id]) {
resolve(new ArrayChangeRecordIterator(allCurrentChangeRecords, i + 1));
}
}
reject(`Change record not found. ID: ${changeRecord[id]}.`);
});
}
async addChanges(
changeRecords: ChangeRecord[]
): Promise<void> {
await this.handle.addChangeRecords(changeRecords);
}
errorSubject(): Subject<ChangeError> {
let errorSubject = new Subject<ChangeError>();
this.handle.otherChangesSubject.subscribe(( otherChange ) => {
errorSubject.next({
fatal: true,
message: otherChange.message
});
});
return errorSubject;
}
changesAddedRemotelySubject(): Subject<ChangeRecordIterator> {
return this.handle.valuesAddedSubject;
}
}