datastore-api 1.1.0 → 1.3.0
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/CHANGELOG.md +22 -0
- package/README.md +3 -2
- package/build/main/lib/dstore-api.d.ts +63 -47
- package/build/main/lib/dstore-api.js +71 -56
- package/build/main/lib/dstore-api.spec.js +65 -99
- package/build/module/lib/dstore-api.d.ts +63 -47
- package/build/module/lib/dstore-api.js +67 -55
- package/build/module/lib/dstore-api.spec.js +64 -99
- package/package.json +4 -3
|
@@ -2,59 +2,54 @@
|
|
|
2
2
|
/*
|
|
3
3
|
* dstore-api.test.ts
|
|
4
4
|
*
|
|
5
|
-
* Created by Dr.
|
|
6
|
-
* Copyright (c) 2021
|
|
5
|
+
* Created by Dr. Maximilian Dornseif 2021-12-10 in huwawi3backend 11.10.0
|
|
6
|
+
* Copyright (c) 2021 Dr. Maximilian Dornseif
|
|
7
7
|
*/
|
|
8
8
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
9
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const datastore_1 = require("@google-cloud/datastore");
|
|
13
|
-
// import { assertIsObject, isNumber } from 'assertate';
|
|
14
13
|
const ava_1 = __importDefault(require("ava"));
|
|
14
|
+
const google_datastore_emulator_1 = __importDefault(require("google-datastore-emulator"));
|
|
15
15
|
const dstore_api_1 = require("./dstore-api");
|
|
16
|
+
process.env.GCLOUD_PROJECT = 'project-id'; // Set the datastore project Id globally
|
|
17
|
+
let emulator;
|
|
18
|
+
ava_1.default.before(async (_t) => {
|
|
19
|
+
emulator = new google_datastore_emulator_1.default({ useDocker: false, debug: false });
|
|
20
|
+
await emulator.start();
|
|
21
|
+
});
|
|
22
|
+
ava_1.default.after('cleanup', async (_t) => {
|
|
23
|
+
await emulator.stop();
|
|
24
|
+
});
|
|
16
25
|
function getDstore(projectId) {
|
|
17
26
|
return new dstore_api_1.Dstore(new datastore_1.Datastore({ projectId }));
|
|
18
27
|
}
|
|
19
28
|
(0, ava_1.default)('keySerialize', async (t) => {
|
|
20
|
-
const kvStore = getDstore('
|
|
21
|
-
t.deepEqual(kvStore.key(['testYodel', 123]),
|
|
29
|
+
const kvStore = getDstore('test');
|
|
30
|
+
t.deepEqual(kvStore.key(['testYodel', 123]).path, ['testYodel', 123]);
|
|
31
|
+
t.deepEqual(JSON.parse(JSON.stringify(kvStore.key(['testYodel', 123]))), {
|
|
22
32
|
id: 123,
|
|
23
33
|
kind: 'testYodel',
|
|
24
|
-
namespace: undefined,
|
|
25
34
|
path: ['testYodel', 123],
|
|
26
35
|
});
|
|
27
|
-
t.deepEqual(kvStore.key(['testYodel', 123]).path, ['testYodel', 123]);
|
|
28
|
-
t.deepEqual(kvStore.key(['testYodel', 123]).serialized, {
|
|
29
|
-
namespace: 'undefined',
|
|
30
|
-
path: [
|
|
31
|
-
'testYodel',
|
|
32
|
-
{
|
|
33
|
-
type: 'DatastoreInt',
|
|
34
|
-
value: '123',
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
});
|
|
38
36
|
const ser = kvStore.keySerialize(kvStore.key(['testYodel', 123]));
|
|
39
|
-
t.deepEqual(ser, '
|
|
40
|
-
t.deepEqual(kvStore.keyFromSerialized(ser), {
|
|
37
|
+
t.deepEqual(ser, 'agByDwsSCXRlc3RZb2RlbBh7DA');
|
|
38
|
+
t.deepEqual(JSON.parse(JSON.stringify(kvStore.keyFromSerialized(ser))), {
|
|
41
39
|
id: '123',
|
|
42
40
|
kind: 'testYodel',
|
|
43
|
-
namespace: 'undefined',
|
|
44
41
|
path: ['testYodel', '123'],
|
|
45
42
|
});
|
|
46
43
|
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
// describe("Lesen", () => {
|
|
55
|
-
// it("get numid", async () => {
|
|
44
|
+
(0, ava_1.default)('allocation', async (t) => {
|
|
45
|
+
const kvStore = getDstore('test');
|
|
46
|
+
const id = await kvStore.allocateOneId();
|
|
47
|
+
t.regex(id, /\d+/);
|
|
48
|
+
});
|
|
49
|
+
// describe("Read", () => {
|
|
50
|
+
// it("get num_id", async () => {
|
|
56
51
|
// expect.assertions(10);
|
|
57
|
-
// const kvStore = getDstore("
|
|
52
|
+
// const kvStore = getDstore("test");
|
|
58
53
|
// const entity = { key: kvStore.key(["testYodel", 2]), data: { foo: "bar" } };
|
|
59
54
|
// const entity2 = { key: kvStore.key(["testYodel", 3]), data: { foo: "bar" } };
|
|
60
55
|
// const commitResponse = await kvStore.save([entity, entity2]);
|
|
@@ -110,7 +105,7 @@ function getDstore(projectId) {
|
|
|
110
105
|
// assertIsObject(result);
|
|
111
106
|
// expect(kvStore.readKey(result)).toBeInstanceOf(Key);
|
|
112
107
|
// const result2 = await kvStore.getMulti([entity.key]);
|
|
113
|
-
// // getMulti returns a Array even
|
|
108
|
+
// // getMulti returns a Array even for single keys
|
|
114
109
|
// expect(result2).toMatchInlineSnapshot(`
|
|
115
110
|
// Array [
|
|
116
111
|
// Object {
|
|
@@ -197,8 +192,8 @@ function getDstore(projectId) {
|
|
|
197
192
|
// },
|
|
198
193
|
// ]
|
|
199
194
|
// `);
|
|
200
|
-
// const result5 = await kvStore.getMulti([entity.key, kvStore.key(["
|
|
201
|
-
// // getMulti returns a Array but
|
|
195
|
+
// const result5 = await kvStore.getMulti([entity.key, kvStore.key(["YodelNotThere", 3])]);
|
|
196
|
+
// // getMulti returns a Array but omits unknown keys
|
|
202
197
|
// // expect(Array.isArray(result)).toBeTruthy();
|
|
203
198
|
// expect(result5).toMatchInlineSnapshot(`
|
|
204
199
|
// Array [
|
|
@@ -225,7 +220,7 @@ function getDstore(projectId) {
|
|
|
225
220
|
// it("get name", async () => {
|
|
226
221
|
// expect.assertions(3);
|
|
227
222
|
// const kvStore = getDstore("huwawi3Datastore");
|
|
228
|
-
// const entity = { key: kvStore.key(["testYodel", "
|
|
223
|
+
// const entity = { key: kvStore.key(["testYodel", "two"]), data: { foo: "bar" } };
|
|
229
224
|
// const commitResponse = await kvStore.save([entity]);
|
|
230
225
|
// expect(commitResponse?.[0]?.indexUpdates).toBe(3);
|
|
231
226
|
// // expect(commitResponse).toMatchInlineSnapshot(`
|
|
@@ -249,11 +244,11 @@ function getDstore(projectId) {
|
|
|
249
244
|
// },
|
|
250
245
|
// "key": Key {
|
|
251
246
|
// "kind": "testYodel",
|
|
252
|
-
// "name": "
|
|
247
|
+
// "name": "two",
|
|
253
248
|
// "namespace": "test",
|
|
254
249
|
// "path": Array [
|
|
255
250
|
// "testYodel",
|
|
256
|
-
// "
|
|
251
|
+
// "two",
|
|
257
252
|
// ],
|
|
258
253
|
// },
|
|
259
254
|
// }
|
|
@@ -265,71 +260,42 @@ function getDstore(projectId) {
|
|
|
265
260
|
// "foo": "bar",
|
|
266
261
|
// Symbol(KEY): Key {
|
|
267
262
|
// "kind": "testYodel",
|
|
268
|
-
// "name": "
|
|
263
|
+
// "name": "two",
|
|
269
264
|
// "namespace": "test",
|
|
270
265
|
// "path": Array [
|
|
271
266
|
// "testYodel",
|
|
272
|
-
// "
|
|
267
|
+
// "two",
|
|
273
268
|
// ],
|
|
274
269
|
// },
|
|
275
270
|
// }
|
|
276
271
|
// `);
|
|
277
272
|
// });
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
//
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
//
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
//
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
// // `);
|
|
305
|
-
// expect(runQueryInfo).toMatchInlineSnapshot(
|
|
306
|
-
// { endCursor: expect.any(String) },
|
|
307
|
-
// `
|
|
308
|
-
// Object {
|
|
309
|
-
// "endCursor": Any<String>,
|
|
310
|
-
// "moreResults": "MORE_RESULTS_AFTER_LIMIT",
|
|
311
|
-
// }
|
|
312
|
-
// `
|
|
313
|
-
// );
|
|
314
|
-
// const result2 = await kvStore.query("testYodel", [], 1);
|
|
315
|
-
// expect(result2[0]).toMatchInlineSnapshot(`
|
|
316
|
-
// Array [
|
|
317
|
-
// Object {
|
|
318
|
-
// "foo": "bar",
|
|
319
|
-
// Symbol(KEY): Key {
|
|
320
|
-
// "id": "2",
|
|
321
|
-
// "kind": "testYodel",
|
|
322
|
-
// "namespace": "test",
|
|
323
|
-
// "path": Array [
|
|
324
|
-
// "testYodel",
|
|
325
|
-
// "2",
|
|
326
|
-
// ],
|
|
327
|
-
// },
|
|
328
|
-
// },
|
|
329
|
-
// ]
|
|
330
|
-
// `);
|
|
331
|
-
// });
|
|
332
|
-
// });
|
|
273
|
+
(0, ava_1.default)('query', async (t) => {
|
|
274
|
+
var _a, _b, _c;
|
|
275
|
+
const kvStore = getDstore('test');
|
|
276
|
+
const entity = {
|
|
277
|
+
key: kvStore.key(['testYodel', '3']),
|
|
278
|
+
data: { foo: 'bar', baz: 'baz' },
|
|
279
|
+
};
|
|
280
|
+
// legacy interface
|
|
281
|
+
await kvStore.save([entity]);
|
|
282
|
+
const query = kvStore.createQuery('testYodel');
|
|
283
|
+
query.limit(1);
|
|
284
|
+
const [entities, runQueryInfo] = await kvStore.runQuery(query);
|
|
285
|
+
t.is(entities.length, 1);
|
|
286
|
+
t.is((_a = entities === null || entities === void 0 ? void 0 : entities[0]) === null || _a === void 0 ? void 0 : _a.foo, 'bar');
|
|
287
|
+
t.is((_c = (_b = entities === null || entities === void 0 ? void 0 : entities[0]) === null || _b === void 0 ? void 0 : _b[datastore_1.Datastore.KEY]) === null || _c === void 0 ? void 0 : _c.kind, 'testYodel');
|
|
288
|
+
t.is(runQueryInfo === null || runQueryInfo === void 0 ? void 0 : runQueryInfo.moreResults, 'MORE_RESULTS_AFTER_LIMIT');
|
|
289
|
+
// modern interface
|
|
290
|
+
const [result2] = await kvStore.query('testYodel', [], 1, [], ['baz']);
|
|
291
|
+
t.is(result2.length, 1);
|
|
292
|
+
// foo is removed by selection
|
|
293
|
+
t.deepEqual(JSON.parse(JSON.stringify(result2 === null || result2 === void 0 ? void 0 : result2[0])), {
|
|
294
|
+
baz: 'baz',
|
|
295
|
+
});
|
|
296
|
+
const key = kvStore.readKey(result2 === null || result2 === void 0 ? void 0 : result2[0]);
|
|
297
|
+
t.is(key.id, entity.key.id);
|
|
298
|
+
});
|
|
333
299
|
// describe("Writing", () => {
|
|
334
300
|
// it("save / upsert", async () => {
|
|
335
301
|
// expect.assertions(2);
|
|
@@ -357,8 +323,8 @@ function getDstore(projectId) {
|
|
|
357
323
|
// it("update", async () => {
|
|
358
324
|
// expect.assertions(3);
|
|
359
325
|
// const kvStore = getDstore("huwawi3Datastore");
|
|
360
|
-
// const
|
|
361
|
-
// const entity = { key: kvStore.key(["testYodel",
|
|
326
|
+
// const keyName = `4insert${Math.random()}`;
|
|
327
|
+
// const entity = { key: kvStore.key(["testYodel", keyName]), data: { foo: "bar" } };
|
|
362
328
|
// // const request = kvStore.update([entity]);
|
|
363
329
|
// // await expect(request).rejects.toThrowError(Error);
|
|
364
330
|
// const commitResponse = await kvStore.save([entity]);
|
|
@@ -402,8 +368,8 @@ function getDstore(projectId) {
|
|
|
402
368
|
// it("insert", async () => {
|
|
403
369
|
// expect.assertions(4);
|
|
404
370
|
// const kvStore = getDstore("huwawi3Datastore");
|
|
405
|
-
// const
|
|
406
|
-
// const entity = { key: kvStore.key(["testYodel",
|
|
371
|
+
// const keyName = `3insert${Math.random()}`;
|
|
372
|
+
// const entity = { key: kvStore.key(["testYodel", keyName]), data: { foo: "bar" } };
|
|
407
373
|
// const commitResponse = await kvStore.insert([entity]);
|
|
408
374
|
// if (commitResponse?.[0]?.mutationResults?.[0]?.version) {
|
|
409
375
|
// commitResponse[0].mutationResults[0].version = 2;
|
|
@@ -423,7 +389,7 @@ function getDstore(projectId) {
|
|
|
423
389
|
// }
|
|
424
390
|
// `
|
|
425
391
|
// );
|
|
426
|
-
// expect(entity.key.name).toMatch(
|
|
392
|
+
// expect(entity.key.name).toMatch(keyName);
|
|
427
393
|
// expect(entity.key.kind).toMatchInlineSnapshot(`"testYodel"`);
|
|
428
394
|
// const request = kvStore.insert([entity]);
|
|
429
395
|
// await expect(request).rejects.toThrowError(Error);
|
|
@@ -484,4 +450,4 @@ function getDstore(projectId) {
|
|
|
484
450
|
// expect(t).toThrow(DstoreError);
|
|
485
451
|
// });
|
|
486
452
|
// });
|
|
487
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHN0b3JlLWFwaS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kc3RvcmUtYXBpLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7OztBQUVILHVEQUFvRDtBQUNwRCx3REFBd0Q7QUFDeEQsOENBQXVCO0FBRXZCLDZDQUFzQztBQUV0QyxTQUFTLFNBQVMsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sSUFBSSxtQkFBTSxDQUFDLElBQUkscUJBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsSUFBQSxhQUFJLEVBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUMvQixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUMzQyxFQUFFLEVBQUUsR0FBVTtRQUNkLElBQUksRUFBRSxXQUFXO1FBQ2pCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUM7S0FDbEIsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO1FBQ3RELFNBQVMsRUFBRSxXQUFXO1FBQ3RCLElBQUksRUFBRTtZQUNKLFdBQVc7WUFDWDtnQkFDRSxJQUFJLEVBQUUsY0FB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
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHN0b3JlLWFwaS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kc3RvcmUtYXBpLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7OztBQUVILHVEQUFvRDtBQUNwRCw4Q0FBdUI7QUFDdkIsMEZBQWlEO0FBRWpELDZDQUFzQztBQUV0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUMsQ0FBQyx3Q0FBd0M7QUFDbkYsSUFBSSxRQUFRLENBQUM7QUFFYixhQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUN2QixRQUFRLEdBQUcsSUFBSSxtQ0FBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1RCxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN6QixDQUFDLENBQUMsQ0FBQztBQUVILGFBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUNqQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN4QixDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsU0FBUyxDQUFDLFNBQVM7SUFDMUIsT0FBTyxJQUFJLG1CQUFNLENBQUMsSUFBSSxxQkFBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRCxJQUFBLGFBQUksRUFBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQy9CLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFX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
|
|
@@ -4,57 +4,58 @@ import { Operator, RunQueryResponse } from '@google-cloud/datastore/build/src/qu
|
|
|
4
4
|
import { CommitResponse } from '@google-cloud/datastore/build/src/request';
|
|
5
5
|
/** @ignore */
|
|
6
6
|
export { Datastore, Key, PathType, Query, Transaction, } from '@google-cloud/datastore';
|
|
7
|
+
export declare const KEYSYM: symbol;
|
|
7
8
|
export declare type IGqlFilterTypes = boolean | string | number;
|
|
8
9
|
export declare type IGqlFilterSpec = {
|
|
9
10
|
readonly eq: IGqlFilterTypes;
|
|
10
11
|
};
|
|
11
12
|
export declare type TGqlFilterList = Array<[string, Operator, DstorePropertyValues]>;
|
|
12
13
|
/** Define what can be written into the Datastore */
|
|
13
|
-
export declare type DstorePropertyValues = number | string | Date | boolean | null | undefined | Buffer | Key |
|
|
14
|
-
|
|
14
|
+
export declare type DstorePropertyValues = number | string | Date | boolean | null | undefined | Buffer | Key | DstorePropertyValues[] | {
|
|
15
|
+
[key: string]: DstorePropertyValues;
|
|
15
16
|
};
|
|
16
|
-
export interface
|
|
17
|
+
export interface IDstoreEntryWithoutKey {
|
|
17
18
|
/** All User Data stored in the Datastore */
|
|
18
|
-
|
|
19
|
+
[key: string]: DstorePropertyValues;
|
|
19
20
|
}
|
|
20
21
|
/** Represents what is actually stored inside the Datastore, called "Entity" by Google
|
|
21
22
|
[@google-cloud/datastore](https://github.com/googleapis/nodejs-datastore#readme) adds `[Datastore.KEY]`. Using ES6 Symbols presents all kinds of hurdles, especially when you try to serialize into a cache. So we add the property _keyStr which contains the encoded code. It is automatically used
|
|
22
23
|
to reconstruct `[Datastore.KEY]`, if you use [[Dstore.readKey]].
|
|
23
24
|
*/
|
|
24
|
-
export interface
|
|
25
|
+
export interface IDstoreEntry extends IDstoreEntryWithoutKey {
|
|
25
26
|
readonly [Datastore.KEY]?: Key;
|
|
26
27
|
/** [Datastore.KEY] key */
|
|
27
28
|
_keyStr: string;
|
|
28
29
|
/** All User Data stored in the Datastore */
|
|
29
|
-
|
|
30
|
+
[key: string]: DstorePropertyValues;
|
|
30
31
|
}
|
|
31
32
|
/** Represents the thing you pass to the save method. Also called "Entity" by Google */
|
|
32
33
|
export declare type DstoreSaveEntity = {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
key: Key;
|
|
35
|
+
data: Omit<IDstoreEntry, '_keyStr' | Datastore['KEY']>;
|
|
36
|
+
method?: 'insert' | 'update' | 'upsert';
|
|
37
|
+
excludeLargeProperties?: boolean;
|
|
38
|
+
excludeFromIndexes?: readonly string[];
|
|
38
39
|
};
|
|
39
40
|
declare type IDstore = {
|
|
40
41
|
/** Accessible by Users of the library. Keep in mind that you will access outside transactions created by [[runInTransaction]]. */
|
|
41
42
|
readonly datastore: Datastore;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
43
|
+
key: (path: ReadonlyArray<PathType>) => Key;
|
|
44
|
+
keyFromSerialized: (text: string) => Key;
|
|
45
|
+
keySerialize: (key: Key) => string;
|
|
46
|
+
readKey: (entry: IDstoreEntry) => Key;
|
|
47
|
+
get: (key: Key) => Promise<IDstoreEntry | null>;
|
|
48
|
+
getMulti: (keys: ReadonlyArray<Key>) => Promise<ReadonlyArray<IDstoreEntry | undefined>>;
|
|
49
|
+
set: (key: Key, entry: IDstoreEntry) => Promise<Key>;
|
|
50
|
+
save: (entities: readonly DstoreSaveEntity[]) => Promise<CommitResponse | undefined>;
|
|
51
|
+
insert: (entities: readonly DstoreSaveEntity[]) => Promise<CommitResponse | undefined>;
|
|
52
|
+
update: (entities: readonly DstoreSaveEntity[]) => Promise<CommitResponse | undefined>;
|
|
53
|
+
delete: (keys: readonly Key[]) => Promise<CommitResponse | undefined>;
|
|
54
|
+
createQuery: (kind: string) => Query;
|
|
55
|
+
query: (kind: string, filters?: TGqlFilterList, limit?: number, ordering?: readonly string[], selection?: readonly string[], cursor?: string) => Promise<RunQueryResponse>;
|
|
56
|
+
runQuery: (query: Query | Omit<Query, 'run'>) => Promise<RunQueryResponse>;
|
|
57
|
+
allocateOneId: (kindName: string) => Promise<string>;
|
|
58
|
+
runInTransaction: <T>(func: {
|
|
58
59
|
(): Promise<T>;
|
|
59
60
|
(): T;
|
|
60
61
|
}) => Promise<T>;
|
|
@@ -64,18 +65,18 @@ declare type IDstore = {
|
|
|
64
65
|
[@google-cloud/datastore](https://github.com/googleapis/nodejs-datastore#readme) is a strange beast: [The documentation is auto generated](https://cloud.google.com/nodejs/docs/reference/datastore/latest) and completely shy of documenting any advanced concepts.
|
|
65
66
|
(Example: If you ask the datastore to auto-generate keys during save: how do you retrieve the generated key?) Generally I suggest to look at the Python 2.x [db](https://cloud.google.com/appengine/docs/standard/python/datastore/api-overview) and [ndb](https://cloud.google.com/appengine/docs/standard/python/ndb) documentation to get a better explanation of the workings of the datastore.
|
|
66
67
|
|
|
67
|
-
Also the typings are strange. The Google provided type `Entities` can be the on disk representation, the same but including a key reference (`Datastore.KEY` - [[
|
|
68
|
+
Also the typings are strange. The Google provided type `Entities` can be the on disk representation, the same but including a key reference (`Datastore.KEY` - [[IDstoreEntry]]), a list of these or a structured object containing the on disk representation under the `data` property and a `key` property and maybe some configuration like `excludeFromIndexes` ([[DstoreSaveEntity]]) or a list of these.
|
|
68
69
|
|
|
69
70
|
KvStore tries to abstract away most surprises the datastore provides to you but als tries to stay as API compatible as possible to [@google-cloud/datastore](https://github.com/googleapis/nodejs-datastore).
|
|
70
71
|
|
|
71
72
|
Main differences:
|
|
72
73
|
|
|
73
74
|
- Everything asynchronous is Promise-based - no callbacks.
|
|
74
|
-
- [[get]] always returns a single [[
|
|
75
|
-
- [[getMulti]] always returns an Array<[[
|
|
75
|
+
- [[get]] always returns a single [[IDstoreEntry]].
|
|
76
|
+
- [[getMulti]] always returns an Array<[[IDstoreEntry]]> of the same length as the input Array. Items not found are represented by null.
|
|
76
77
|
- [[set]] is called with `(key, value)` and always returns the complete [[Key]] of the entity being written. Keys are normalized, numeric IDs are always encoded as strings.
|
|
77
78
|
- [[key]] handles [[Key]] object instantiation for you.
|
|
78
|
-
- [[readKey]] extracts the key from an [[
|
|
79
|
+
- [[readKey]] extracts the key from an [[IDstoreEntry]] you have read without the need of fancy `Symbol`-based access to `entity[Datastore.KEY]`. If needed, it tries to deserialize `_keyStr` to create `entity[Datastore.KEY]`. This ist important when rehydrating an [[IDstoreEntry]] from a serializing cache.
|
|
79
80
|
- [[allocateOneId]] returns a single numeric string encoded unique datastore id without the need of fancy unpacking.
|
|
80
81
|
- [[runInTransaction]] allows you to provide a function to be executed inside an transaction without the need of passing around the transaction object. This is modelled after Python 2.7 [ndb's `@ndb.transactional` feature](https://cloud.google.com/appengine/docs/standard/python/ndb/transactions). This is implemented via node's [AsyncLocalStorage](https://nodejs.org/docs/latest-v14.x/api/async_hooks.html).
|
|
81
82
|
- [[keySerialize]] is synchronous.
|
|
@@ -130,24 +131,24 @@ export declare class Dstore implements IDstore {
|
|
|
130
131
|
* @category Datastore Drop-In
|
|
131
132
|
*/
|
|
132
133
|
keyFromSerialized(text: string): Key;
|
|
133
|
-
/** `readKey()` extracts the [[Key]] from an [[
|
|
134
|
+
/** `readKey()` extracts the [[Key]] from an [[IDstoreEntry]].
|
|
134
135
|
*
|
|
135
136
|
* Is is an alternative to `entity[Datastore.KEY]` which tends to fail in various contexts and also confuses older Typescript compilers.
|
|
136
|
-
* It can extract the [[Key]] form a [[
|
|
137
|
+
* It can extract the [[Key]] form a [[IDstoreEntry]] which has been serialized to JSON by leveraging the property `_keyStr`.
|
|
137
138
|
*
|
|
138
139
|
* @category Additional
|
|
139
140
|
*/
|
|
140
|
-
readKey(ent:
|
|
141
|
-
/** `fixKeys()` is called for all [[
|
|
141
|
+
readKey(ent: IDstoreEntry): Key;
|
|
142
|
+
/** `fixKeys()` is called for all [[IDstoreEntry]]sa returned from [[Dstore]].
|
|
142
143
|
*
|
|
143
144
|
* Is ensures that besides `entity[Datastore.KEY]` there is `_keyStr` to be leveraged by [[readKey]].
|
|
144
145
|
*
|
|
145
146
|
* @internal
|
|
146
147
|
*/
|
|
147
148
|
private fixKeys;
|
|
148
|
-
/** `get()` reads a [[
|
|
149
|
+
/** `get()` reads a [[IDstoreEntry]] from the Datastore.
|
|
149
150
|
*
|
|
150
|
-
* It returns [[
|
|
151
|
+
* It returns [[IDstoreEntry]] or `null` if not found.
|
|
151
152
|
|
|
152
153
|
* The underlying Datastore API Call is [lookup](https://cloud.google.com/datastore/docs/reference/data/rest/v1/projects/lookup).
|
|
153
154
|
*
|
|
@@ -156,14 +157,14 @@ export declare class Dstore implements IDstore {
|
|
|
156
157
|
* Differences between [[Dstore.get]] and [[Datastore.get]]:
|
|
157
158
|
*
|
|
158
159
|
* - [Dstore.get]] takes a single [[Key]] as Parameter, no Array. Check [[getMulti]] if you want Arrays.
|
|
159
|
-
* - [Dstore.get]] returns a single [[
|
|
160
|
+
* - [Dstore.get]] returns a single [[IDstoreEntry]], no Array.
|
|
160
161
|
*
|
|
161
162
|
* @category Datastore Drop-In
|
|
162
163
|
*/
|
|
163
|
-
get(key: Key): Promise<
|
|
164
|
-
/** `getMulti()` reads several [[
|
|
164
|
+
get(key: Key): Promise<IDstoreEntry | null>;
|
|
165
|
+
/** `getMulti()` reads several [[IDstoreEntry]]s from the Datastore.
|
|
165
166
|
*
|
|
166
|
-
* It returns a list of [[
|
|
167
|
+
* It returns a list of [[IDstoreEntry]]s or `null` if not found.
|
|
167
168
|
|
|
168
169
|
* The underlying Datastore API Call is [lookup](https://cloud.google.com/datastore/docs/reference/data/rest/v1/projects/lookup).
|
|
169
170
|
*
|
|
@@ -172,12 +173,12 @@ export declare class Dstore implements IDstore {
|
|
|
172
173
|
* Differences between [[Dstore.getMulti]] and [[Datastore.get]]:
|
|
173
174
|
*
|
|
174
175
|
* - [[Dstore.getMulti]] always takes an Array of [[Key]]s as Parameter.
|
|
175
|
-
* - [[Dstore.getMulti]] returns always a Array of [[
|
|
176
|
+
* - [[Dstore.getMulti]] returns always a Array of [[IDstoreEntry]], or null.
|
|
176
177
|
* - [[Datastore.get]] has many edge cases - e.g. when not being able to find any of the provided keys - which return surprising results. [[Dstore.getMulti]] always returns an Array. TODO: return a Array with the same length as the Input.
|
|
177
178
|
*
|
|
178
179
|
* @category Datastore Drop-In
|
|
179
180
|
*/
|
|
180
|
-
getMulti(keys: readonly Key[]): Promise<
|
|
181
|
+
getMulti(keys: readonly Key[]): Promise<Array<IDstoreEntry | undefined>>;
|
|
181
182
|
/** `set()` is addition to [[Datastore]]. It provides a classic Key-value Interface.
|
|
182
183
|
*
|
|
183
184
|
* Instead providing a nested [[DstoreSaveEntity]] to [[save]] you can call set directly as `set( key, value)`.
|
|
@@ -194,7 +195,7 @@ export declare class Dstore implements IDstore {
|
|
|
194
195
|
*
|
|
195
196
|
* @category Additional
|
|
196
197
|
*/
|
|
197
|
-
set(key: Key, data:
|
|
198
|
+
set(key: Key, data: IDstoreEntry): Promise<Key>;
|
|
198
199
|
/** `save()` is compatible to [Datastore.save()](https://cloud.google.com/nodejs/docs/reference/datastore/latest/datastore/datastore#_google_cloud_datastore_Datastore_save_member_1_).
|
|
199
200
|
*
|
|
200
201
|
* The single Parameter is a list of [[DstoreSaveEntity]]s.
|
|
@@ -212,6 +213,20 @@ export declare class Dstore implements IDstore {
|
|
|
212
213
|
* On every subsequent `save()` an string encoded number representation is returned.
|
|
213
214
|
* Dstore normalizes that and always returns an string encoded number representation.
|
|
214
215
|
*
|
|
216
|
+
* Each [[DstoreSaveEntity]] can have an `excludeFromIndexes` property which is somewhat underdocumented.
|
|
217
|
+
* It can use something like JSON-Path notation
|
|
218
|
+
* ([Source](https://github.com/googleapis/nodejs-datastore/blob/2941f2f0f132b41534e303d441d837051ce88fd7/src/index.ts#L948))
|
|
219
|
+
* [.*](https://github.com/googleapis/nodejs-datastore/blob/406b15d2014087172df617c6e0a397a2c0902c5f/test/index.ts#L1598),
|
|
220
|
+
* [parent[]](https://github.com/googleapis/nodejs-datastore/blob/406b15d2014087172df617c6e0a397a2c0902c5f/test/index.ts#L1672),
|
|
221
|
+
* [parent.*](https://github.com/googleapis/nodejs-datastore/blob/406b15d2014087172df617c6e0a397a2c0902c5f/test/index.ts#L1672),
|
|
222
|
+
* [parent[].*](https://github.com/googleapis/nodejs-datastore/blob/406b15d2014087172df617c6e0a397a2c0902c5f/test/index.ts#L1672)
|
|
223
|
+
* and [more complex patterns](https://github.com/googleapis/nodejs-datastore/blob/406b15d2014087172df617c6e0a397a2c0902c5f/test/index.ts#L1754)
|
|
224
|
+
* seem to be supported patterns.
|
|
225
|
+
*
|
|
226
|
+
* If the caller has not provided an `excludeLargeProperties` in a [[DstoreSaveEntity]] we will default it
|
|
227
|
+
* to `excludeLargeProperties: true`. Without this you can not store strings longer than 1500 bytes easily
|
|
228
|
+
* ([source](https://github.com/googleapis/nodejs-datastore/blob/c7a08a8382c6706ccbfbbf77950babf40bac757c/src/entity.ts#L961)).
|
|
229
|
+
*
|
|
215
230
|
* @category Datastore Drop-In
|
|
216
231
|
*/
|
|
217
232
|
save(entities: readonly DstoreSaveEntity[]): Promise<CommitResponse | undefined>;
|
|
@@ -266,9 +281,10 @@ export declare class Dstore implements IDstore {
|
|
|
266
281
|
* @param kind Name of the [[Datastore]][Kind](https://cloud.google.com/datastore/docs/concepts/entities#kinds_and_identifiers) ("Table") which should be searched.
|
|
267
282
|
*
|
|
268
283
|
* @category Datastore Drop-In
|
|
269
|
-
*/
|
|
284
|
+
*/
|
|
285
|
+
createQuery(kind: string): Query;
|
|
270
286
|
runQuery(query: Query | Omit<Query, 'run'>): Promise<RunQueryResponse>;
|
|
271
|
-
query(kindName: string, filters?: TGqlFilterList, limit?: number,
|
|
287
|
+
query(kindName: string, filters?: TGqlFilterList, limit?: number, ordering?: readonly string[], selection?: string[], cursor?: string): Promise<RunQueryResponse>;
|
|
272
288
|
/** Allocate one ID in the Datastore.
|
|
273
289
|
*
|
|
274
290
|
* Currently (late 2021) there is no documentation provided by Google for the underlying node function.
|
|
@@ -289,7 +305,7 @@ export declare class Dstore implements IDstore {
|
|
|
289
305
|
|
|
290
306
|
[[runInTransaction]] is modelled after Python 2.7 [ndb's `@ndb.transactional` feature](https://cloud.google.com/appengine/docs/standard/python/ndb/transactions). This is based on node's [AsyncLocalStorage](https://nodejs.org/docs/latest-v14.x/api/async_hooks.html).
|
|
291
307
|
|
|
292
|
-
Transactions frequently fail if you try to access the same data via in a transaction. See the [Documentation on Locking](https://cloud.google.com/datastore/docs/concepts/transactions#transaction_locks) for further reference. You are advised to use [p-limit](https://github.com/sindresorhus/p-limit)(1) to
|
|
308
|
+
Transactions frequently fail if you try to access the same data via in a transaction. See the [Documentation on Locking](https://cloud.google.com/datastore/docs/concepts/transactions#transaction_locks) for further reference. You are advised to use [p-limit](https://github.com/sindresorhus/p-limit)(1) to serialize transactions touching the same resource. This should work nicely with node's single process model. It is a much bigger problem on shared-nothing approaches, like Python on App Engine.
|
|
293
309
|
|
|
294
310
|
Transactions might be wrapped in [p-retry](https://github.com/sindresorhus/p-retry) to implement automatically retrying them with exponential back-off should they fail due to contention.
|
|
295
311
|
*/
|