-
Notifications
You must be signed in to change notification settings - Fork 1
/
GdprSavior.ts
136 lines (109 loc) · 3 KB
/
GdprSavior.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import { GdprManager, GdprManagerRaw } from "../GdprManager";
/**
* Factory function for a GdprManager
* @typedef GdprManagerFactory
* @export
*/
export type GdprManagerFactory = () => Promise<GdprManager>;
/**
* Handle saving/restoring/checking semantics
* @interface GdprSavior
* @export
*/
export interface GdprSavior {
/**
* Restore the manager (saved state)
* @param shouldUpdate - Whether it should update its savior internals (should default to true)
*/
restore(shouldUpdate?: boolean): Promise<GdprManager | null>;
/**
* Determine whether there is already an existing manager (saved state)
* @param shouldUpdate - Whether it should update its savior internals (should default to true)
*/
exists(shouldUpdate?: boolean): Promise<boolean>;
/**
* Restore the manager or create one using the factory
* @param factory - Factory to create a manager (default manager state)
* @warning This should not store/save the manager before returning it
*/
restoreOrCreate(factory: GdprManagerFactory): Promise<GdprManager>;
/**
* Overwrite the saved state of the manager
* @param manager - The manager to store (state to save)
*/
store(manager: GdprManagerRaw): Promise<boolean>;
/**
* Store the manager state if none is already save
* @param manager - The manager to store (state to save)
*/
storeIfNotExists(manager: GdprManagerRaw): Promise<boolean>;
/**
* Handle shared state updates
* @param manager - The new manager to use
*/
updateSharedManager(manager: GdprManager): Promise<void>;
/**
* Check if there is an existing manager state (should rely on GdprSavior#exists)
*/
check(): Promise<void>;
}
export abstract class GdprSaviorAdapter implements GdprSavior {
/**
* @inheritDoc
* @override
*/
public abstract restore(shouldUpdate?: boolean): Promise<GdprManager | null>;
/**
* @inheritDoc
* @override
*/
public abstract store(manager: GdprManagerRaw): Promise<boolean>;
/**
* @inheritDoc
* @override
*/
public abstract updateSharedManager(manager: GdprManager): Promise<void>;
/**
* @inheritDoc
* @override
*/
public async exists(shouldUpdate: boolean = true): Promise<boolean> {
const restored = await this.restore(shouldUpdate);
return restored !== null;
}
/**
* @inheritDoc
* @override
*/
public async storeIfNotExists(manager: GdprManagerRaw): Promise<boolean> {
const exists = await this.exists();
return exists ? true : this.store(manager);
}
/**
* @inheritDoc
* @override
*/
public async restoreOrCreate(factory: GdprManagerFactory): Promise<GdprManager> {
const restored = await this.restore();
if (!restored) {
const generated = await factory();
this.updateSharedManager(generated);
if (generated.bannerWasShown) {
generated.closeBanner();
}
return generated;
}
if (restored.bannerWasShown) {
restored.closeBanner();
}
return restored;
}
/**
* @inheritDoc
* @override
*/
public async check(): Promise<void> {
await Promise.resolve();
await this.exists(true);
}
}