@polymorfa/store 0.1.0-dev.20260922094209
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +326 -0
- package/dist/backend.d.ts +89 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +341 -0
- package/dist/backend.js.map +1 -0
- package/dist/conversation-source.d.ts +28 -0
- package/dist/conversation-source.d.ts.map +1 -0
- package/dist/conversation-source.js +160 -0
- package/dist/conversation-source.js.map +1 -0
- package/dist/inbox-source.d.ts +19 -0
- package/dist/inbox-source.d.ts.map +1 -0
- package/dist/inbox-source.js +90 -0
- package/dist/inbox-source.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +13 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +45 -0
- package/dist/react.js.map +1 -0
- package/dist/reducers.d.ts +48 -0
- package/dist/reducers.d.ts.map +1 -0
- package/dist/reducers.js +821 -0
- package/dist/reducers.js.map +1 -0
- package/dist/sources.d.ts +170 -0
- package/dist/sources.d.ts.map +1 -0
- package/dist/sources.js +510 -0
- package/dist/sources.js.map +1 -0
- package/dist/store.d.ts +168 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +619 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +212 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { type StoreReducer } from "./reducers.js";
|
|
2
|
+
import { type Checkpoint, type DataStoreName, type PolymorfaEvent, type StoreChangeListener, type StoredAttachment, type StoredCall, type StoredContact, type StoredConversation, type StoredEvent, type StoredLabel, type StoredMessage, type StoredMessageStatus, type StoredPresence, type StoredSession, type StoredTemplate } from "./types.js";
|
|
3
|
+
export interface RetentionRule {
|
|
4
|
+
/** Rows whose newest event is older than this are removed. */
|
|
5
|
+
readonly maxAgeMs?: number;
|
|
6
|
+
/** Oldest rows beyond this count are removed. */
|
|
7
|
+
readonly maxRows?: number;
|
|
8
|
+
}
|
|
9
|
+
export type RetentionOptions = Partial<Record<DataStoreName, RetentionRule | false>>;
|
|
10
|
+
export declare const DEFAULT_RETENTION: Readonly<Record<DataStoreName, RetentionRule>>;
|
|
11
|
+
/** Fields sealed by `encrypt` in each store. */
|
|
12
|
+
export declare const SENSITIVE_FIELDS: Readonly<Record<DataStoreName, readonly string[]>>;
|
|
13
|
+
export interface SealContext {
|
|
14
|
+
readonly store: DataStoreName;
|
|
15
|
+
readonly id: string;
|
|
16
|
+
}
|
|
17
|
+
export interface RedactRule {
|
|
18
|
+
/** Exact event type, a `prefix.*` pattern, or `*`. */
|
|
19
|
+
readonly events: string;
|
|
20
|
+
/** Dotted payload paths to remove, for example `text` or `conversation.phoneNumber`. */
|
|
21
|
+
readonly paths: readonly string[];
|
|
22
|
+
}
|
|
23
|
+
export interface BroadcastChannelLike {
|
|
24
|
+
postMessage(message: unknown): void;
|
|
25
|
+
close(): void;
|
|
26
|
+
onmessage: ((event: MessageEvent) => void) | null;
|
|
27
|
+
}
|
|
28
|
+
export interface PolymorfaStoreOptions {
|
|
29
|
+
/**
|
|
30
|
+
* Database name. Include the signed-in user and session so data never
|
|
31
|
+
* crosses accounts, for example `support:user_123`.
|
|
32
|
+
*/
|
|
33
|
+
readonly name: string;
|
|
34
|
+
/**
|
|
35
|
+
* Application data version. When it changes, stored data is wiped on
|
|
36
|
+
* open, because it is a cache of events the backend still holds.
|
|
37
|
+
*/
|
|
38
|
+
readonly version?: number;
|
|
39
|
+
/** Only events for this session are stored. */
|
|
40
|
+
readonly session?: string;
|
|
41
|
+
readonly retention?: RetentionOptions;
|
|
42
|
+
/** How often to sweep, in milliseconds. `0` sweeps only on open. */
|
|
43
|
+
readonly sweepIntervalMs?: number;
|
|
44
|
+
/** Defaults to `globalThis.indexedDB`; `null` forces memory mode. */
|
|
45
|
+
readonly indexedDB?: IDBFactory | null;
|
|
46
|
+
/** Defaults to `globalThis.BroadcastChannel`; `null` disables tab sync. */
|
|
47
|
+
readonly broadcastChannel?: ((name: string) => BroadcastChannelLike) | null;
|
|
48
|
+
/** Seals `SENSITIVE_FIELDS` before they are written. Needs `decrypt`. */
|
|
49
|
+
readonly encrypt?: (fields: Record<string, unknown>, context: SealContext) => unknown;
|
|
50
|
+
readonly decrypt?: (sealed: unknown, context: SealContext) => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
51
|
+
/** Payload fields removed before an event is reduced or logged. */
|
|
52
|
+
readonly redact?: readonly RedactRule[];
|
|
53
|
+
/** Maximum events per write transaction. */
|
|
54
|
+
readonly batchSize?: number;
|
|
55
|
+
readonly now?: () => number;
|
|
56
|
+
/** Reports a failed background sweep. */
|
|
57
|
+
readonly onError?: (error: unknown) => void;
|
|
58
|
+
}
|
|
59
|
+
export interface IngestResult {
|
|
60
|
+
readonly accepted: number;
|
|
61
|
+
readonly duplicates: number;
|
|
62
|
+
/** Events dropped for a different session or a malformed envelope. */
|
|
63
|
+
readonly ignored: number;
|
|
64
|
+
}
|
|
65
|
+
export interface MessageListQuery {
|
|
66
|
+
readonly conversationId: string;
|
|
67
|
+
/** Only messages created before this epoch-millisecond time. */
|
|
68
|
+
readonly before?: number;
|
|
69
|
+
/**
|
|
70
|
+
* With `before`, also returns messages created exactly at `before` whose
|
|
71
|
+
* ID sorts before this one. Pass the oldest row of the previous page to
|
|
72
|
+
* page through messages that share a timestamp.
|
|
73
|
+
*/
|
|
74
|
+
readonly beforeId?: string;
|
|
75
|
+
readonly limit?: number;
|
|
76
|
+
/** Include deleted and revoked messages. */
|
|
77
|
+
readonly includeDeleted?: boolean;
|
|
78
|
+
}
|
|
79
|
+
export interface MessageInput {
|
|
80
|
+
readonly id: string;
|
|
81
|
+
readonly conversationId: string;
|
|
82
|
+
readonly createdAt: number;
|
|
83
|
+
readonly fromMe: boolean;
|
|
84
|
+
readonly text?: string;
|
|
85
|
+
readonly clientId?: string;
|
|
86
|
+
/** ID of the message this one replies to. */
|
|
87
|
+
readonly replyTo?: string;
|
|
88
|
+
readonly status?: StoredMessageStatus;
|
|
89
|
+
readonly attachments?: readonly StoredAttachment[];
|
|
90
|
+
}
|
|
91
|
+
export interface ListOptions {
|
|
92
|
+
readonly limit?: number;
|
|
93
|
+
}
|
|
94
|
+
export interface EventListQuery {
|
|
95
|
+
readonly types?: readonly string[];
|
|
96
|
+
/** Epoch milliseconds, inclusive. */
|
|
97
|
+
readonly since?: number;
|
|
98
|
+
readonly limit?: number;
|
|
99
|
+
}
|
|
100
|
+
export interface StoreUsage {
|
|
101
|
+
readonly usage?: number;
|
|
102
|
+
readonly quota?: number;
|
|
103
|
+
}
|
|
104
|
+
export type StoreMode = "indexeddb" | "memory";
|
|
105
|
+
export interface PolymorfaStore {
|
|
106
|
+
readonly name: string;
|
|
107
|
+
/** `memory` when IndexedDB was unavailable; data then lasts for the page. */
|
|
108
|
+
readonly mode: StoreMode;
|
|
109
|
+
/** Why the store fell back to memory. */
|
|
110
|
+
readonly fallbackReason?: string;
|
|
111
|
+
ingest(events: PolymorfaEvent | readonly PolymorfaEvent[]): Promise<IngestResult>;
|
|
112
|
+
/** Adds a reducer for `type`. It runs after any built-in reducer. */
|
|
113
|
+
registerReducer(type: string, reducer: StoreReducer): () => void;
|
|
114
|
+
readonly conversations: {
|
|
115
|
+
get(id: string): Promise<StoredConversation | undefined>;
|
|
116
|
+
/** Most recent activity first. */
|
|
117
|
+
list(query?: ListOptions & {
|
|
118
|
+
readonly unreadOnly?: boolean;
|
|
119
|
+
}): Promise<StoredConversation[]>;
|
|
120
|
+
};
|
|
121
|
+
readonly messages: {
|
|
122
|
+
get(id: string): Promise<StoredMessage | undefined>;
|
|
123
|
+
/** Newest first. */
|
|
124
|
+
list(query: MessageListQuery): Promise<StoredMessage[]>;
|
|
125
|
+
/** Writes messages from a backend history read; newer state wins. */
|
|
126
|
+
upsert(messages: readonly MessageInput[], options?: {
|
|
127
|
+
readonly session?: string;
|
|
128
|
+
}): Promise<void>;
|
|
129
|
+
};
|
|
130
|
+
readonly contacts: StoreReader<StoredContact>;
|
|
131
|
+
readonly presence: StoreReader<StoredPresence>;
|
|
132
|
+
readonly calls: StoreReader<StoredCall>;
|
|
133
|
+
readonly labels: StoreReader<StoredLabel>;
|
|
134
|
+
readonly sessions: StoreReader<StoredSession>;
|
|
135
|
+
readonly templates: StoreReader<StoredTemplate>;
|
|
136
|
+
readonly events: {
|
|
137
|
+
get(id: string): Promise<StoredEvent | undefined>;
|
|
138
|
+
/** Oldest first. */
|
|
139
|
+
list(query?: EventListQuery): Promise<StoredEvent[]>;
|
|
140
|
+
};
|
|
141
|
+
readonly custom: {
|
|
142
|
+
get(id: string): Promise<StoredEvent | undefined>;
|
|
143
|
+
list(query?: EventListQuery): Promise<StoredEvent[]>;
|
|
144
|
+
};
|
|
145
|
+
readonly checkpoints: {
|
|
146
|
+
get(id: string): Promise<Checkpoint | undefined>;
|
|
147
|
+
set(id: string, cursor: string): Promise<void>;
|
|
148
|
+
};
|
|
149
|
+
/** Listens for committed changes in this tab and other tabs. */
|
|
150
|
+
subscribe(store: DataStoreName | "*", listener: StoreChangeListener): () => void;
|
|
151
|
+
/** Applies retention now. */
|
|
152
|
+
sweep(): Promise<void>;
|
|
153
|
+
/** Removes all stored data, for example on sign-out. */
|
|
154
|
+
clear(): Promise<void>;
|
|
155
|
+
close(): void;
|
|
156
|
+
estimateUsage(): Promise<StoreUsage | undefined>;
|
|
157
|
+
/** Asks the browser not to evict this origin's storage. */
|
|
158
|
+
persist(): Promise<boolean>;
|
|
159
|
+
}
|
|
160
|
+
export interface StoreReader<T> {
|
|
161
|
+
get(id: string): Promise<T | undefined>;
|
|
162
|
+
/** Most recently updated first. */
|
|
163
|
+
list(options?: ListOptions): Promise<T[]>;
|
|
164
|
+
}
|
|
165
|
+
/** Removes token-like fields and values anywhere in a payload. */
|
|
166
|
+
export declare function stripSecrets(value: unknown, depth?: number): unknown;
|
|
167
|
+
export declare function createPolymorfaStore(options: PolymorfaStoreOptions): Promise<PolymorfaStore>;
|
|
168
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|