Files
hereconnect/packages/lib-service-seq-tracker/src/serviceSeqTracker.ts
T

58 lines
1.3 KiB
TypeScript
Raw Normal View History

2024-12-10 13:21:38 +02:00
import { type defaults as PouchDB } from "pouchdb-core";
export interface ServiceSeqTrackerDocument {
lastSeq: string | number;
}
export type ServiceSeqTrackerDatabase =
PouchDB.Database<ServiceSeqTrackerDocument>;
2024-11-27 15:57:11 +02:00
export class ServiceSeqTracker {
/**
* @param _id
2024-12-10 13:21:38 +02:00
* @param serviceSeqTrackerDb
* @constructor
*/
2024-12-10 13:21:38 +02:00
static async Init(
_id: string,
serviceSeqTrackerDb: ServiceSeqTrackerDatabase,
) {
2024-12-03 11:11:44 +02:00
const doc = await serviceSeqTrackerDb.get(_id).catch((error) => {
2024-11-27 15:57:11 +02:00
if (error.name === "not_found") {
return {
_id,
2024-11-27 15:57:11 +02:00
lastSeq: "0",
};
}
throw error; // Re-throw other errors
});
2024-12-10 13:21:38 +02:00
return new ServiceSeqTracker(doc, serviceSeqTrackerDb);
}
2024-11-27 15:57:11 +02:00
2024-12-10 13:21:38 +02:00
private constructor(
private doc: ServiceSeqTrackerDocument,
private serviceSeqTrackerDb: ServiceSeqTrackerDatabase,
) {}
2024-11-27 15:57:11 +02:00
get lastSeq() {
2024-12-03 11:11:44 +02:00
return this.doc.lastSeq;
2024-11-27 15:57:11 +02:00
}
checkNextSeq(seq: number | string) {
2024-12-03 11:11:44 +02:00
if (!this.doc) {
}
2024-11-27 15:57:11 +02:00
const next = parseInt(seq as string, 10);
2024-12-03 11:11:44 +02:00
const current = parseInt(this.doc.lastSeq as string, 10);
2024-11-27 15:57:11 +02:00
if (next < current) {
throw new Error(
`Sequence number is too old: ${seq} (${next} < ${current})`,
);
}
}
saveSeq(seq: number | string) {
2024-12-03 11:11:44 +02:00
this.doc.lastSeq = seq;
2024-12-10 13:21:38 +02:00
return this.serviceSeqTrackerDb.put(this.doc);
2024-11-27 15:57:11 +02:00
}
}