Skip to content

Commit ff944bf

Browse files
committed
feat(async-storage): windows impl
1 parent be2473b commit ff944bf

File tree

2 files changed

+136
-15
lines changed

2 files changed

+136
-15
lines changed

packages/async-storage/src/createAsyncStorage.windows.ts

Lines changed: 135 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,18 @@ class LegacyAsyncStorageImpl implements AsyncStorage {
3232

3333
getItem = async (key: string): Promise<string | null> => {
3434
try {
35-
return await new Promise((resolve, reject) => {
35+
return await new Promise<string | null>((resolve, reject) => {
3636
this.db.multiGet([key], (errors, result) => {
37-
if (errors?.length) {
38-
const error = errors[0]!;
39-
reject(
37+
const error = this.getError(errors);
38+
if (error) {
39+
return reject(
4040
AsyncStorageError.jsError(
4141
error.message,
4242
AsyncStorageError.Type.OtherStorageError
4343
)
4444
);
45-
} else {
46-
resolve(result?.[0]?.[1] ?? null);
4745
}
46+
resolve(result?.[0]?.[1] ?? null);
4847
});
4948
});
5049
} catch (e) {
@@ -54,59 +53,181 @@ class LegacyAsyncStorageImpl implements AsyncStorage {
5453

5554
setItem = async (key: string, value: string): Promise<void> => {
5655
try {
57-
throw new Error("todo");
56+
await new Promise<void>((resolve, reject) => {
57+
this.db.multiSet([[key, value]], (errors) => {
58+
const error = this.getError(errors);
59+
if (error) {
60+
return reject(
61+
AsyncStorageError.jsError(
62+
error.message,
63+
AsyncStorageError.Type.OtherStorageError
64+
)
65+
);
66+
}
67+
resolve();
68+
});
69+
});
5870
} catch (e) {
5971
throw AsyncStorageError.nativeError(e);
6072
}
6173
};
6274

6375
removeItem = async (key: string): Promise<void> => {
6476
try {
65-
throw new Error("todo");
77+
await new Promise<void>((resolve, reject) => {
78+
this.db.multiRemove([key], (errors) => {
79+
const error = this.getError(errors);
80+
if (error) {
81+
return reject(
82+
AsyncStorageError.jsError(
83+
error.message,
84+
AsyncStorageError.Type.OtherStorageError
85+
)
86+
);
87+
}
88+
resolve();
89+
});
90+
});
6691
} catch (e) {
6792
throw AsyncStorageError.nativeError(e);
6893
}
6994
};
7095

7196
getMany = async (keys: string[]): Promise<Record<string, string | null>> => {
7297
try {
73-
throw new Error("todo");
98+
return await new Promise((resolve, reject) => {
99+
this.db.multiGet(keys, (errors, result) => {
100+
const error = this.getError(errors);
101+
if (error) {
102+
return reject(
103+
AsyncStorageError.jsError(
104+
error.message,
105+
AsyncStorageError.Type.OtherStorageError
106+
)
107+
);
108+
}
109+
const resultMap = new Map(result);
110+
const entries: Record<string, string | null> = {};
111+
for (const key of keys) {
112+
entries[key] = resultMap.get(key) ?? null;
113+
}
114+
resolve(entries);
115+
});
116+
});
74117
} catch (e) {
75118
throw AsyncStorageError.nativeError(e);
76119
}
77120
};
78121

79122
setMany = async (entries: Record<string, string>): Promise<void> => {
80123
try {
81-
throw new Error("todo");
124+
await new Promise<void>((resolve, reject) => {
125+
this.db.multiSet(Object.entries(entries), (errors) => {
126+
const error = this.getError(errors);
127+
if (error) {
128+
return reject(
129+
AsyncStorageError.jsError(
130+
error.message,
131+
AsyncStorageError.Type.OtherStorageError
132+
)
133+
);
134+
}
135+
resolve();
136+
});
137+
});
82138
} catch (e) {
83139
throw AsyncStorageError.nativeError(e);
84140
}
85141
};
86142

87143
removeMany = async (keys: string[]): Promise<void> => {
88144
try {
89-
throw new Error("todo");
145+
await new Promise<void>((resolve, reject) => {
146+
this.db.multiRemove(keys, (errors) => {
147+
const error = this.getError(errors);
148+
if (error) {
149+
return reject(
150+
AsyncStorageError.jsError(
151+
error.message,
152+
AsyncStorageError.Type.OtherStorageError
153+
)
154+
);
155+
}
156+
resolve();
157+
});
158+
});
90159
} catch (e) {
91160
throw AsyncStorageError.nativeError(e);
92161
}
93162
};
94163

95164
getAllKeys = async (): Promise<string[]> => {
96165
try {
97-
throw new Error("todo");
166+
return await new Promise((resolve, reject) => {
167+
this.db.getAllKeys((errors, result) => {
168+
const error = this.getError(errors);
169+
if (error) {
170+
return reject(
171+
AsyncStorageError.jsError(
172+
error.message,
173+
AsyncStorageError.Type.OtherStorageError
174+
)
175+
);
176+
}
177+
if (!result) {
178+
return reject(
179+
AsyncStorageError.jsError(
180+
"Invalid state, no error and no values returned",
181+
AsyncStorageError.Type.UnknownError
182+
)
183+
);
184+
}
185+
186+
resolve(result);
187+
});
188+
});
98189
} catch (e) {
99190
throw AsyncStorageError.nativeError(e);
100191
}
101192
};
102193

103194
clear = async (): Promise<void> => {
104195
try {
105-
throw new Error("todo");
196+
await new Promise<void>((resolve, reject) => {
197+
this.db.clear((errors) => {
198+
const error = this.getError(errors);
199+
if (error) {
200+
return reject(
201+
AsyncStorageError.jsError(
202+
error.message,
203+
AsyncStorageError.Type.OtherStorageError
204+
)
205+
);
206+
}
207+
resolve();
208+
});
209+
});
106210
} catch (e) {
107211
throw AsyncStorageError.nativeError(e);
108212
}
109213
};
214+
215+
private getError = (potentialError: any): ErrorLike | null => {
216+
if (!potentialError) {
217+
return null;
218+
}
219+
220+
if (Array.isArray(potentialError) && potentialError.length) {
221+
const firstError = potentialError.find((e): e is ErrorLike => e?.message);
222+
if (firstError) {
223+
return firstError;
224+
}
225+
return null;
226+
} else if (potentialError?.message) {
227+
return potentialError;
228+
}
229+
return null;
230+
};
110231
}
111232

112233
/**
@@ -141,7 +262,7 @@ interface NativeAsyncStorageSpec extends TurboModule {
141262
callback: (error?: ErrorLike[]) => void
142263
) => void;
143264
getAllKeys: (
144-
callback: (error?: ErrorLike[], result?: [string, string][]) => void
265+
callback: (error?: ErrorLike[], result?: string[]) => void
145266
) => void;
146267
clear: (callback: (error?: ErrorLike[]) => void) => void;
147268
}

packages/async-storage/windows/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ Ankh.NoLoad
3939

4040
#Files generated by the VS build
4141
**/Generated Files/**
42-
ReactNativeAsyncStorage/packages.json.lock
42+
./ReactNativeAsyncStorage/packages.lock.json

0 commit comments

Comments
 (0)