Skip to content

Commit 3971f41

Browse files
committed
Add onBeforeWakeUp and onAfterWakeUp callbacks
1 parent 830980a commit 3971f41

File tree

5 files changed

+71
-30
lines changed

5 files changed

+71
-30
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 0.8.0 (2024-07-22)
4+
5+
- Add: `onBeforeWakeUp` and `onAfterWakeUp` callback options.
6+
37
## 0.7.0 (2023-12-17)
48

59
- Fix: Both `withPersistent()` and `withPersistentMap()`, when `wakeUp` options

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ interface WithPersistentOptions<
146146
| `onFlushFinally` | `EventCallable<WithPersistentFlushEvent>` | `undefined` | An Event to trigger before flushing to driver. This al always triggering after either `onFlushDone` or `onFlushFail`. An `id` in payload refers to `id` from appropriate `onFlushStart` payload. |
147147
| `readOnly` | `EventCallable<boolean>` | `undefined` | A `filter` Store to disable writes to Driver. |
148148
| `wakeUp` | <code>StoreWritable&lt;State&gt; &#124; ((state: State) =&gt; void)</code> | `undefined` | Alternative target which will receive initial state read from driver on initialization. When `undefined`, the source StoreWritable will be used. |
149+
| `onBeforeWakeUp` | `() => void` | `undefined` | A callback to be called before "wake up" prodecure. |
150+
| `onAfterWakeUp` | `() => void` | `undefined` | A callback to be called after "wake up" prodecure. |
149151
| `serialize` | <code>(input: Value) =&gt; Serialized &#124; Promise&lt;Serialized&gt;</code> | `undefined` | Serialization before writing data to driver. |
150152
| `unserialize` | <code>(output: Serialized) =&gt; Value &#124; Promise&lt;Value&gt;</code> | `undefined` | Unserialization after reading data from driver. |
151153

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@cubux/effector-persistent",
3-
"version": "0.7.0",
3+
"version": "0.8.0",
44
"description": "Persist data in effector store.",
55
"keywords": [
66
"effector",

src/internal.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ export interface CommonOptions<State = any, Value = State, Serialized = Value> {
6060
* A `filter` Store to disable writes to Driver.
6161
*/
6262
readOnly?: Store<boolean>;
63+
/**
64+
* A callback to call before the "wake up" procedure.
65+
*/
66+
onBeforeWakeUp?: () => void;
67+
/**
68+
* A callback to call after the "wake up" procedure.
69+
*/
70+
onAfterWakeUp?: () => void;
6371
}
6472

6573
export interface OptionsWithWakeUp<

src/lib/initialize.ts

Lines changed: 56 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,54 @@ import { noopSerialize } from './noopSerialize';
1414

1515
const isStore = is.store;
1616

17-
function initWakeUp<Driver, Value, Serialized>(
18-
driver: Driver,
19-
unserialize: (output: Serialized) => Promise<Value> | Value,
20-
wakeUp: StoreWritable<Value> | ((state: Value) => void),
21-
read: (driver: Driver) => Promise<Serialized | undefined>
22-
) {
17+
function initWakeUp<Driver, Value, Serialized>({
18+
driver,
19+
read,
20+
unserialize,
21+
wakeUp,
22+
onBeforeWakeUp,
23+
onAfterWakeUp,
24+
}: {
25+
driver: Driver;
26+
read: (driver: Driver) => Promise<Serialized | undefined>;
27+
unserialize: (output: Serialized) => Promise<Value> | Value;
28+
wakeUp: StoreWritable<Value> | ((state: Value) => void);
29+
onBeforeWakeUp?: () => void;
30+
onAfterWakeUp?: () => void;
31+
}) {
2332
const setWakingUp = createEvent<boolean>();
2433
const $isWritable = createStore(true).on(setWakingUp, (_, b) => !b);
2534

2635
read(driver).then(
2736
(s) => {
28-
if (s !== undefined) {
29-
return Promise.resolve(unserialize(s)).then(
30-
(v) => {
31-
setWakingUp(true);
32-
try {
33-
if (isStore(wakeUp)) {
34-
const init = createEvent<Value>();
35-
wakeUp.on(init, (_, v) => v);
36-
init(v);
37-
} else {
38-
wakeUp(v);
39-
}
40-
} finally {
41-
setWakingUp(false);
42-
}
43-
},
44-
(e) =>
45-
console.error(
46-
'Failed to unserialize output from persistent driver',
47-
e
48-
)
49-
);
37+
if (s === undefined) {
38+
onBeforeWakeUp?.();
39+
onAfterWakeUp?.();
40+
return;
5041
}
42+
return Promise.resolve(unserialize(s)).then(
43+
(v) => {
44+
onBeforeWakeUp?.();
45+
setWakingUp(true);
46+
try {
47+
if (isStore(wakeUp)) {
48+
const init = createEvent<Value>();
49+
wakeUp.on(init, (_, v) => v);
50+
init(v);
51+
} else {
52+
wakeUp(v);
53+
}
54+
} finally {
55+
setWakingUp(false);
56+
onAfterWakeUp?.();
57+
}
58+
},
59+
(e) =>
60+
console.error(
61+
'Failed to unserialize output from persistent driver',
62+
e
63+
)
64+
);
5165
},
5266
(e) => console.error('Failed to read value from persistent driver', e)
5367
);
@@ -115,13 +129,26 @@ export function initialize<Driver, Value, Serialized = Value>(
115129
readOnly,
116130
unserialize = noopSerialize,
117131
wakeUp = store,
132+
onBeforeWakeUp,
133+
onAfterWakeUp,
118134
}: Omit<WithPersistentOptions<Value, Value, Serialized>, 'serialize'>,
119135
read: (driver: Driver) => Promise<Serialized | undefined>,
120136
write: (driver: Driver, value: Value, prev: Value) => Promise<void>
121137
) {
122138
function setup(driver: Driver) {
123139
addFlush(
124-
initFlush(store, readOnly, initWakeUp(driver, unserialize, wakeUp, read)),
140+
initFlush(
141+
store,
142+
readOnly,
143+
initWakeUp({
144+
driver,
145+
read,
146+
unserialize,
147+
wakeUp,
148+
onBeforeWakeUp,
149+
onAfterWakeUp,
150+
})
151+
),
125152
flushDelay,
126153
({ next, prev }) => {
127154
const id = Symbol();

0 commit comments

Comments
 (0)