mirror of
https://github.com/logos-messaging/js-waku.git
synced 2026-01-08 00:33:12 +00:00
53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import { Logger } from "@waku/utils";
|
|
|
|
import { ContentMessage } from "../message.js";
|
|
|
|
import {
|
|
MessageSerializer,
|
|
StoredContentMessage
|
|
} from "./message_serializer.js";
|
|
|
|
const log = new Logger("sds:storage");
|
|
|
|
const STORAGE_PREFIX = "waku:sds:storage:";
|
|
|
|
/**
|
|
* Browser localStorage wrapper for message persistence.
|
|
*/
|
|
export class Storage {
|
|
private readonly storageKey: string;
|
|
|
|
public constructor(storagePrefix: string) {
|
|
this.storageKey = `${STORAGE_PREFIX}${storagePrefix}`;
|
|
}
|
|
|
|
public save(messages: ContentMessage[]): void {
|
|
try {
|
|
const payload = JSON.stringify(
|
|
messages.map((msg) => MessageSerializer.serializeContentMessage(msg))
|
|
);
|
|
localStorage.setItem(this.storageKey, payload);
|
|
} catch (error) {
|
|
log.error("Failed to save messages to storage:", error);
|
|
}
|
|
}
|
|
|
|
public load(): ContentMessage[] {
|
|
try {
|
|
const raw = localStorage.getItem(this.storageKey);
|
|
if (!raw) {
|
|
return [];
|
|
}
|
|
|
|
const stored = JSON.parse(raw) as StoredContentMessage[];
|
|
return stored
|
|
.map((record) => MessageSerializer.deserializeContentMessage(record))
|
|
.filter((message): message is ContentMessage => Boolean(message));
|
|
} catch (error) {
|
|
log.error("Failed to load messages from storage:", error);
|
|
localStorage.removeItem(this.storageKey);
|
|
return [];
|
|
}
|
|
}
|
|
}
|