Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@binaris/shift-db

Package Overview
Dependencies
Maintainers
1
Versions
16
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@binaris/shift-db - npm Package Compare versions

Comparing version
0.4.0-dbnu
to
0.5.0-dbnu
+23
dist/db.d.ts
import { DeepReadonly } from 'deep-freeze';
import { Options } from '@binaris/shift-interfaces-node-client';
import { ClientContext, Document, UpdateOptions, Version, Serializable } from '@binaris/shift-interfaces-node-client/interfaces';
import * as Q from './query';
export { Q };
export interface Versioned<T extends Serializable | undefined> {
version: Version;
value: T;
}
export declare class DB {
private readonly ctx;
private readonly client;
constructor(url: string, ctx: ClientContext, options?: Options);
get<T extends Serializable = any>(key: string): Promise<T | undefined>;
create(key: string, value: Serializable): Promise<boolean>;
remove(key: string): Promise<boolean>;
update<T extends Serializable = any>(key: string, updater: (state?: DeepReadonly<T>) => T, _options?: UpdateOptions): Promise<DeepReadonly<T>>;
private getWithVersion;
startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>>;
find(query: Q.Query): Promise<Document[]>;
private setIfVersion;
}
//# sourceMappingURL=db.d.ts.map
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAY,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,OAAO,EAEP,YAAY,EACb,MAAM,kDAAkD,CAAC;AAE1D,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAE,CAAC,EAAE,CAAC;AAEb,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,YAAY,GAAG,SAAS;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;CACV;AAuBD,qBAAa,EAAE;IAGY,OAAO,CAAC,QAAQ,CAAC,GAAG;IAF7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEtB,GAAG,EAAE,MAAM,EAAmB,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,OAAO;IAIlE,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAItE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAC9C,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,aAAa,GAC7E,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAe3B,OAAO,CAAC,cAAc;IAIT,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAI3F,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YAIxC,YAAY;CAO3B"}
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const deep_freeze_1 = __importDefault(require("deep-freeze"));
const shift_interfaces_node_client_1 = require("@binaris/shift-interfaces-node-client");
const Q = __importStar(require("./query"));
exports.Q = Q;
// bigint not currently allowed.
const allowedTypes = new Set(['object', 'boolean', 'number', 'string']);
function checkValue(value) {
if (!allowedTypes.has(typeof value)) {
throw new TypeError(`Non-JSONable value of type ${typeof value} at top level`);
}
}
// Generates successive promises to sleep in order to back off. (Not
// an async iterator, so you can generate the promise to back off,
// then try something, and then back off for the remainder of the
// generated time.)
function* backoff() {
let delayMs = 20;
for (;;) {
yield new Promise((res) => setTimeout(res, delayMs));
delayMs *= 1.2;
}
}
class DB {
constructor(url, ctx, options) {
this.ctx = ctx;
this.client = new shift_interfaces_node_client_1.DBClient(url, options);
}
async get(key) {
return (await this.client.get(this.ctx, key));
}
async create(key, value) {
checkValue(value);
return await this.client.create(this.ctx, key, value);
}
async remove(key) {
return await this.client.remove(this.ctx, key);
}
// TODO(ariels): Support operationId for streaming.
async update(key, updater, _options) {
for (const delay of backoff()) {
const { value, version } = await this.getWithVersion(key);
// deepFreeze doesn't like some values (like undefined), trick
// it by referring to value in an object.
const newValue = updater(deep_freeze_1.default({ value: value }).value);
checkValue(newValue);
if (await this.setIfVersion(key, newValue, version))
return deep_freeze_1.default(newValue);
await delay;
}
throw Error('Timed out'); // backoff() is currently infinite but
// won't stay that way. Needed for
// TypeScript.
}
getWithVersion(key) {
return this.client.getWithVersion(this.ctx, key);
}
async startPolling(_key) {
throw new Error('Unimplemented');
}
async find(query) {
return await this.client.find(this.ctx, query.getParts());
}
async setIfVersion(key, value, version) {
return await this.client.setIfVersion(this.ctx, key, version, value);
}
}
exports.DB = DB;
//# sourceMappingURL=db.js.map
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
export declare class ValueError extends Error {
readonly name = "ValueError";
}
export declare class IllegalArgumentError extends Error {
readonly name = "IllegalArgumentError";
}
//# sourceMappingURL=errors.d.ts.map
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAgB,IAAI,gBAAgB;CACrC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,IAAI,0BAA0B;CAC/C"}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class ValueError extends Error {
constructor() {
super(...arguments);
this.name = 'ValueError';
}
}
exports.ValueError = ValueError;
class IllegalArgumentError extends Error {
constructor() {
super(...arguments);
this.name = 'IllegalArgumentError';
}
}
exports.IllegalArgumentError = IllegalArgumentError;
//# sourceMappingURL=errors.js.map
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;AAAA,MAAa,UAAW,SAAQ,KAAK;IAArC;;QACkB,SAAI,GAAG,YAAY,CAAC;IACtC,CAAC;CAAA;AAFD,gCAEC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAA/C;;QACkB,SAAI,GAAG,sBAAsB,CAAC;IAChD,CAAC;CAAA;AAFD,oDAEC"}
import * as dbi from '@binaris/shift-interfaces-node-client/interfaces';
declare type Key = string | number;
declare const filterSymbol: unique symbol;
export declare type Marked<T extends {}> = T & {
[filterSymbol]: true;
};
export declare type EqFilter = Marked<dbi.EqFilter>;
export declare type NeFilter = Marked<dbi.NeFilter>;
export declare type GtFilter = Marked<dbi.GtFilter>;
export declare type GteFilter = Marked<dbi.GteFilter>;
export declare type LtFilter = Marked<dbi.LtFilter>;
export declare type LteFilter = Marked<dbi.LteFilter>;
export declare type ExistsFilter = Marked<dbi.ExistsFilter>;
export declare type IsNullFilter = Marked<dbi.IsNullFilter>;
export declare type MatchesFilter = Marked<dbi.MatchesFilter>;
export declare type StartsWithFilter = Marked<dbi.StartsWithFilter>;
export declare type Equatable = dbi.Equatable;
export declare type Comparable = dbi.Comparable;
export declare type Direction = dbi.Direction;
export declare type Order = dbi.Order;
export declare const ASC = dbi.Direction.ASC;
export declare const DESC = dbi.Direction.DESC;
interface AndFilter extends Marked<dbi.AndFilter> {
readonly filters: Filter[];
}
interface OrFilter extends Marked<dbi.OrFilter> {
readonly filters: Filter[];
}
interface NotFilter extends Marked<dbi.NotFilter> {
readonly filter: Filter;
}
export declare type Filter = EqFilter | NeFilter | GtFilter | GteFilter | LtFilter | LteFilter | ExistsFilter | IsNullFilter | MatchesFilter | StartsWithFilter | AndFilter | OrFilter | NotFilter;
declare class Path {
protected readonly parts: string[];
constructor(parts: string[]);
static proxied(parts: string[]): PathProxy;
/**
* Returns a subpath at given key.
* @param key - object key or array index
* @return - subpath of document
*/
field(k: Key): PathProxy;
/**
* Returns a subpath at given key.
* Has a template parameter for improved type safety when using typescript.
* @param key - object key or array index
* @return - subpath of document
*/
typedField<T>(k: Key): Doc<T>;
/**
* Equals
* @param x - value for comparison
* @return - a filter
*/
eq(x: Equatable): EqFilter;
/**
* Not equals
* @param x - value for comparison
* @return - a filter
*/
ne(x: Equatable): NeFilter;
/**
* Greater than
* @param x - value for comparison
* @return - a filter
*/
gt(x: Comparable): GtFilter;
/**
* Greater than or equals
* @param x - value for comparison
* @return - a filter
*/
gte(x: Comparable): GteFilter;
/**
* Less than
* @param x - value for comparison
* @return - a filter
*/
lt(x: Comparable): LtFilter;
/**
* Less than or equals
* @param x - value for comparison
* @return - a filter
*/
lte(x: Comparable): LteFilter;
/**
* Does path exist?
* @return - a filter
*/
exists(): ExistsFilter;
/**
* Is value at path null?
* @return - a filter
*/
isNull(): IsNullFilter;
/**
* String matches pattern.
* @param pattern regular expression
* @param caseInsensitive should the check be case insensitive?
* @return - a filter
*/
matches(pattern: string, caseInsensitive?: boolean): MatchesFilter;
/**
* String matches pattern.
* @param pattern - regular expression, if the RegExp object has the 'i' flag, perform a case insensitive match.
* @return - a filter
*/
matches(pattern: RegExp): MatchesFilter;
/**
* String starts with prefix
* @return - a filter
*/
startsWith(prefix: string): StartsWithFilter;
/**
* Casts to a specific doc type. Use for typed paths with typescript.
* @return - a filter
*/
as<T>(): Doc<T>;
}
declare type PathProxy = Path & Record<Key, Path>;
interface CastablePath {
as<T>(): Doc<T>;
}
interface EquatablePath<T extends Equatable> extends CastablePath {
eq(x: T): EqFilter;
ne(x: T): NeFilter;
}
interface ComparablePath<T extends Comparable> extends EquatablePath<T> {
gt(x: T): GtFilter;
gte(x: T): GteFilter;
lt(x: T): LtFilter;
lte(x: T): LteFilter;
}
interface StringPath extends ComparablePath<string> {
matches(pattern: string, caseInsensitive?: boolean): MatchesFilter;
matches(pattern: RegExp): MatchesFilter;
startsWith(prefix: string): StartsWithFilter;
}
declare type NumberPath = ComparablePath<number>;
declare type DatePath = ComparablePath<Date>;
declare type BooleanPath = EquatablePath<boolean>;
interface NullPath extends CastablePath {
isNull(): IsNullFilter;
}
interface MaybePath extends CastablePath {
exists(): Filter;
}
declare type Doc<T> = T extends Record<string, unknown> ? Required<{
[P in keyof T]: Doc<T[P]> & MaybePath;
}> : T extends Array<infer U> ? {
[idx: number]: Doc<U> & MaybePath;
} : T extends null ? NullPath : T extends number ? NumberPath : T extends string ? StringPath : T extends boolean ? BooleanPath : T extends Date ? DatePath : never;
export declare function typedValue<T>(): Doc<T>;
export declare const key: StringPath;
export declare const value: PathProxy;
declare type NonEmptyArray<T> = [T, ...T[]];
export declare function all(...filters: NonEmptyArray<Filter>): AndFilter;
export declare function any(...filters: NonEmptyArray<Filter>): OrFilter;
export declare function not(f: Filter): NotFilter;
export interface QueryData extends dbi.Query {
filter: Filter;
}
export declare class Query {
protected readonly _filter: Filter;
protected readonly _limit?: number | undefined;
protected readonly _skip?: number | undefined;
protected readonly _orderBy?: dbi.Order[] | undefined;
protected constructor(_filter: Filter, _limit?: number | undefined, _skip?: number | undefined, _orderBy?: dbi.Order[] | undefined);
filter(f: Filter): Query;
limit(l: number): Query;
skip(s: number): Query;
orderBy(path: Path | Doc<any>, order?: Direction): Query;
static fromFilter(f: Filter): Query;
toJSON(): QueryData;
getParts(): QueryData;
}
export declare const filter: typeof Query.fromFilter;
export {};
//# sourceMappingURL=query.d.ts.map
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const ramda_1 = require("ramda");
const dbi = __importStar(require("@binaris/shift-interfaces-node-client/interfaces"));
const errors_1 = require("./errors");
const filterSymbol = Symbol('shiftjs/filter');
exports.ASC = dbi.Direction.ASC;
exports.DESC = dbi.Direction.DESC;
const proxyHandler = {
get(obj, prop) {
// Known properties such as `field` and `eq` are used as defined, unknown properties are used as fields.
return prop in obj ? obj[prop] : obj.field(prop);
},
};
class Path {
constructor(parts) {
this.parts = parts;
}
static proxied(parts) {
return new Proxy(new this(parts), proxyHandler);
}
/**
* Returns a subpath at given key.
* @param key - object key or array index
* @return - subpath of document
*/
field(k) {
// When using proxy, paths will be converted to string, field() replicates this behavior
return Path.proxied([...this.parts, k.toString()]);
}
/**
* Returns a subpath at given key.
* Has a template parameter for improved type safety when using typescript.
* @param key - object key or array index
* @return - subpath of document
*/
typedField(k) {
return this.field(k);
}
/**
* Equals
* @param x - value for comparison
* @return - a filter
*/
eq(x) {
return {
[filterSymbol]: true,
operator: 'eq',
path: this.parts,
value: x,
};
}
/**
* Not equals
* @param x - value for comparison
* @return - a filter
*/
ne(x) {
return {
[filterSymbol]: true,
operator: 'ne',
path: this.parts,
value: x,
};
}
/**
* Greater than
* @param x - value for comparison
* @return - a filter
*/
gt(x) {
return {
[filterSymbol]: true,
operator: 'gt',
path: this.parts,
value: x,
};
}
/**
* Greater than or equals
* @param x - value for comparison
* @return - a filter
*/
gte(x) {
return {
[filterSymbol]: true,
operator: 'gte',
path: this.parts,
value: x,
};
}
/**
* Less than
* @param x - value for comparison
* @return - a filter
*/
lt(x) {
return {
[filterSymbol]: true,
operator: 'lt',
path: this.parts,
value: x,
};
}
/**
* Less than or equals
* @param x - value for comparison
* @return - a filter
*/
lte(x) {
return {
[filterSymbol]: true,
operator: 'lte',
path: this.parts,
value: x,
};
}
/**
* Does path exist?
* @return - a filter
*/
exists() {
return {
[filterSymbol]: true,
operator: 'exists',
path: this.parts,
};
}
/**
* Is value at path null?
* @return - a filter
*/
isNull() {
return {
[filterSymbol]: true,
operator: 'isNull',
path: this.parts,
};
}
matches(pattern, caseInsensitive = false) {
if (typeof pattern === 'string') {
return {
[filterSymbol]: true,
operator: 'matches',
path: this.parts,
pattern,
caseInsensitive,
};
}
else if (pattern instanceof RegExp) {
if (/[^i]/.test(pattern.flags)) {
throw new TypeError('Only /i RegExp flag supported');
}
return {
[filterSymbol]: true,
operator: 'matches',
path: this.parts,
pattern: pattern.source,
caseInsensitive: pattern.flags.includes('i'),
};
}
throw new TypeError('Expected pattern to be a RegExp or string');
}
/**
* String starts with prefix
* @return - a filter
*/
startsWith(prefix) {
return {
[filterSymbol]: true,
operator: 'startsWith',
path: this.parts,
value: prefix,
};
}
/**
* Casts to a specific doc type. Use for typed paths with typescript.
* @return - a filter
*/
as() {
return Path.proxied(this.parts);
}
}
function typedValue() {
return Path.proxied(['value']);
}
exports.typedValue = typedValue;
exports.key = Path.proxied(['key']);
exports.value = Path.proxied(['value']);
function checkFilters(...filters) {
if (filters.length === 0) {
throw new errors_1.IllegalArgumentError('Expected at least 1 filter');
}
for (const f of filters) {
if (!f[filterSymbol]) {
throw new TypeError('Given filter is invalid');
}
}
}
function all(...filters) {
checkFilters(...filters);
return {
[filterSymbol]: true,
operator: 'and',
filters,
};
}
exports.all = all;
function any(...filters) {
checkFilters(...filters);
return {
[filterSymbol]: true,
operator: 'or',
filters,
};
}
exports.any = any;
function not(f) {
checkFilters(f);
return {
[filterSymbol]: true,
operator: 'not',
filter: f,
};
}
exports.not = not;
class Query {
constructor(_filter, _limit, _skip, _orderBy) {
this._filter = _filter;
this._limit = _limit;
this._skip = _skip;
this._orderBy = _orderBy;
}
filter(f) {
return new Query(all(this._filter, f), this._limit, this._skip, this._orderBy);
}
limit(l) {
if (l < 1) {
throw new errors_1.IllegalArgumentError(`Given limit (${l}) is less than 1`);
}
if (this._limit !== undefined && l > this._limit) {
throw new errors_1.IllegalArgumentError(`Given limit (${l}) is greater than current limit (${this._limit})`);
}
return new Query(this._filter, l, this._skip, this._orderBy);
}
skip(s) {
return new Query(this._filter, this._limit, s, this._orderBy);
}
orderBy(path, order = exports.ASC) {
const { parts } = path;
for (const { path: p } of (this._orderBy || [])) {
if (ramda_1.equals(p, parts)) {
throw new errors_1.IllegalArgumentError(`Query already ordered by path: ${p}`);
}
}
return new Query(this._filter, this._limit, this._skip, [...(this._orderBy || []), { path: parts, direction: order }]);
}
static fromFilter(f) {
checkFilters(f);
return new this(f);
}
toJSON() {
return this.getParts();
}
getParts() {
return {
filter: this._filter,
limit: this._limit,
skip: this._skip,
orderBy: this._orderBy,
};
}
}
exports.Query = Query;
exports.filter = Query.fromFilter.bind(Query);
//# sourceMappingURL=query.js.map
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
export {};
//# sourceMappingURL=db.test.d.ts.map
{"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../../../src/test/component/db.test.ts"],"names":[],"mappings":""}
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const ava_1 = __importDefault(require("ava"));
const fs_1 = require("fs");
const rmfr_1 = __importDefault(require("rmfr"));
const os_1 = require("os");
const util_1 = require("util");
const path = __importStar(require("path"));
const koa_1 = __importDefault(require("koa"));
const koa_router_1 = __importDefault(require("koa-router"));
const http_1 = require("http");
const shift_leveldb_server_1 = require("@binaris/shift-leveldb-server");
const shift_interfaces_koa_server_1 = require("@binaris/shift-interfaces-koa-server");
const db_1 = require("../../db");
const test = ava_1.default;
async function listenOn(app) {
return new Promise((resolve, reject) => {
const server = http_1.createServer(app.callback())
.listen(undefined, 'localhost', () => resolve(server));
server.once('error', reject);
});
}
test.beforeEach(async (t) => {
const dbDir = await util_1.promisify(fs_1.mkdtemp)(path.join(os_1.tmpdir(), 'test-state-'), 'utf8');
const db = new shift_leveldb_server_1.Handler(`${dbDir}/root.db`);
const dbRouter = new shift_interfaces_koa_server_1.DBRouter(db, true);
const router = new koa_router_1.default();
router.use('/v1', dbRouter.koaRouter.routes(), dbRouter.koaRouter.allowedMethods());
const app = new koa_1.default();
app.use(router.routes());
app.use(router.allowedMethods());
const server = await listenOn(app);
const port = server.address().port;
const client = new db_1.DB(`http://localhost:${port}/v1`, {
auth: {
v1: {
appId: 'testing',
apiKey: 'test',
},
},
}, { timeoutMs: 1000 });
t.context = {
dbDir,
client,
};
});
test.afterEach(async (t) => {
await rmfr_1.default(t.context.dbDir);
});
test('DB.get returns undefined when no key exists', async (t) => {
const { client } = t.context;
const value = await client.get('test');
t.assert(value === undefined);
});
test('DB.create creates a new document and returns true', async (t) => {
const { client } = t.context;
const ret = await client.create('test', { a: 1 });
const value = await client.get('test');
t.deepEqual(value, { a: 1 });
t.true(ret);
});
test('DB.create returns false if key already exists', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.false(await client.create('test', { a: 2 }));
});
test('DB.create throws TypeError when value forced undefined', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', undefined), {
instanceOf: TypeError,
message: /undefined/,
});
});
test('DB.create throws TypeError when value is a function', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', () => 17), {
instanceOf: TypeError,
message: /function/,
});
});
test('DB.create throws TypeError when value is a bigint', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', BigInt(17)), {
instanceOf: TypeError,
message: /bigint/,
});
});
test('DB.create accepts arbitrary JSONables', async (t) => {
const { client } = t.context;
await client.create('test_string', 'hey');
await client.create('test_number', 7);
await client.create('test_boolean', true);
await client.create('test_object', { a: [7] });
await client.create('test_object', [{ a: 7 }]);
t.pass();
});
test('DB.remove returns false when no key exists', async (t) => {
const { client } = t.context;
t.false(await client.remove('test'));
});
test('DB.remove returns false when key was already deleted', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
await client.remove('test');
t.false(await client.remove('test'));
});
test('DB.remove removes existing key from DB and returns true', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.true(await client.remove('test'));
t.is(await client.get('test'), undefined);
});
test('DB.remove removes the key', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.true(await client.remove('test'));
const value = await client.get('test');
t.assert(value === undefined);
});
test('DB.update creates a new document if key does not exist, returns it, sets version to 1', async (t) => {
const { client } = t.context;
const next = await client.update('test', (prev) => (Object.assign({}, prev, { a: 1 })));
const value = await client.get('test');
t.deepEqual(value, { a: 1 });
t.deepEqual(next, value);
});
test('DB.update updates an existing document, returns it, and increments version', async (t) => {
const { client } = t.context;
await client.create('test', { b: 2 });
const next = await client.update('test', (prev) => (Object.assign({}, prev, { a: 1 })));
const value = await client.get('test');
t.deepEqual(value, { a: 1, b: 2 });
t.deepEqual(next, value);
});
test('DB.update does nothing if document not updated', async (t) => {
const { client } = t.context;
await client.create('test', { b: 2 });
const next = await client.update('test', (prev) => (Object.assign({}, prev)));
const value = await client.get('test');
t.deepEqual(value, { b: 2 });
t.deepEqual(next, value);
// TODO(ariels): Verify no update on an ongoing poll.
});
// TODO(ariels): Retrieve poll tests from old db/src/db.ts.
test('DB.create works after remove', async (t) => {
const { client } = t.context;
await client.create('test', 7);
await client.remove('test');
t.true(await client.create('test', 8));
const value = await client.get('test');
t.assert(value === 8);
});
// TODO(ariels): DB.update works after remove but increments version and includes tombstone\'s patches'
test('DB.update throws TypeError if updater returned undefined', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.update('test', () => undefined), TypeError);
});
test('CLIENT.update throws TypeError if trying to modify returned object', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1, b: { c: 2, d: [5] } });
await t.throwsAsync(client.update('test', (obj) => {
obj.a = 2;
return obj;
}), TypeError);
await t.throwsAsync(client.update('test', (obj) => {
obj.b.c = 3;
return obj;
}), TypeError);
await t.throwsAsync(client.update('test', (obj) => {
obj.b.d[0] = 6;
return obj;
}), TypeError);
});
//# sourceMappingURL=db.test.js.map
{"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../../src/test/component/db.test.ts"],"names":[],"mappings":"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"}
export {};
//# sourceMappingURL=query.test.d.ts.map
{"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../../../src/test/unit/query.test.ts"],"names":[],"mappings":""}
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ava_1 = __importDefault(require("ava"));
const query_1 = require("../../query");
const errors_1 = require("../../errors");
function stringifyThenParse(v) {
return JSON.parse(JSON.stringify(v));
}
ava_1.default('key builds a filter on document key', (t) => {
t.deepEqual(stringifyThenParse(query_1.key.eq('abc')), { path: ['key'], operator: 'eq', value: 'abc' });
});
ava_1.default('value builds a filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.value.eq('abc')), { path: ['value'], operator: 'eq', value: 'abc' });
});
ava_1.default('value.field() builds a nested filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.value.field('a.b').eq('abc')), { path: ['value', 'a.b'], operator: 'eq', value: 'abc' });
});
ava_1.default('value.field(number) casts path to string', (t) => {
t.deepEqual(stringifyThenParse(query_1.value.field(7).eq('abc')), { path: ['value', '7'], operator: 'eq', value: 'abc' });
});
ava_1.default('value.field(reserved field) generates a path', (t) => {
t.deepEqual(stringifyThenParse(query_1.value.field('eq').eq('abc')), { path: ['value', 'eq'], operator: 'eq', value: 'abc' });
});
ava_1.default('value proxy builds a nested filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.value.x.eq('abc')), { path: ['value', 'x'], operator: 'eq', value: 'abc' });
});
ava_1.default('typedField builds a filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.value.typedField('a').eq('abc')), { path: ['value', 'a'], operator: 'eq', value: 'abc' });
});
ava_1.default('typedValue builds a filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().eq('abc')), { path: ['value'], operator: 'eq', value: 'abc' });
});
ava_1.default('typedValue proxy builds a nested filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().a.eq(6)), { path: ['value', 'a'], operator: 'eq', value: 6 });
});
ava_1.default('typedValue proxy builds an array filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue()[0].eq('abc')), { path: ['value', '0'], operator: 'eq', value: 'abc' });
});
ava_1.default('typedValue proxy builds a complex nested filter on document value', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().z[0].x[5].eq(true)), { path: ['value', 'z', '0', 'x', '5'], operator: 'eq', value: true });
});
ava_1.default('typedValue proxy supports optional fields', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().z.exists()), { path: ['value', 'z'], operator: 'exists' });
t.deepEqual(stringifyThenParse(query_1.typedValue().z.eq(3)), { path: ['value', 'z'], operator: 'eq', value: 3 });
});
ava_1.default('typedValue proxy supports optional array values', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue()[0].exists()), { path: ['value', '0'], operator: 'exists' });
t.deepEqual(stringifyThenParse(query_1.typedValue()[0].eq(3)), { path: ['value', '0'], operator: 'eq', value: 3 });
});
ava_1.default('typedValue supports null', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().z.isNull()), { path: ['value', 'z'], operator: 'isNull' });
t.deepEqual(stringifyThenParse(query_1.typedValue().z.as().isNull()), { path: ['value', 'z'], operator: 'isNull' });
t.deepEqual(stringifyThenParse(query_1.typedValue().z.as().eq(3)), { path: ['value', 'z'], operator: 'eq', value: 3 });
});
ava_1.default('ne builds a gt filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().ne(false)), { path: ['value'], operator: 'ne', value: false });
});
ava_1.default('gt builds a gt filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().gt(7)), { path: ['value'], operator: 'gt', value: 7 });
});
ava_1.default('lt builds an lt filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().lt('abc')), { path: ['value'], operator: 'lt', value: 'abc' });
});
ava_1.default('gte builds a gte filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().gte(7)), { path: ['value'], operator: 'gte', value: 7 });
});
ava_1.default('lte builds an lte filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().lte('abc')), { path: ['value'], operator: 'lte', value: 'abc' });
});
ava_1.default('exists is available on non optional fields', (t) => {
const val = query_1.typedValue();
t.deepEqual(stringifyThenParse(val.x.exists()), { path: ['value', 'x'], operator: 'exists' });
t.deepEqual(stringifyThenParse(val.x.y.exists()), { path: ['value', 'x', 'y'], operator: 'exists' });
});
ava_1.default('matches builds a match filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().matches('abc')), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: false });
t.deepEqual(stringifyThenParse(query_1.typedValue().matches('abc', true)), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: true });
t.deepEqual(stringifyThenParse(query_1.typedValue().matches(/abc/)), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: false });
t.deepEqual(stringifyThenParse(query_1.typedValue().matches(/abc/i)), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: true });
});
ava_1.default('matches throws when given unsupported flags', (t) => {
t.throws(() => query_1.key.matches(/abc/g));
});
ava_1.default('startsWith builds a startsWith filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.typedValue().startsWith('abc')), { path: ['value'], operator: 'startsWith', value: 'abc' });
});
ava_1.default('all builds a valid filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.all(query_1.key.startsWith('/games/'), query_1.value.x.eq(5))), {
operator: 'and',
filters: [
{ path: ['key'], operator: 'startsWith', value: '/games/' },
{ path: ['value', 'x'], operator: 'eq', value: 5 },
],
});
});
ava_1.default('all throws a TypeError if not given a filter', (t) => {
t.throws(() => query_1.all('a'), TypeError);
});
ava_1.default('all throws an IllegalArgumentError if not given any arguemnts', (t) => {
t.throws(() => query_1.all(), errors_1.IllegalArgumentError);
});
ava_1.default('any builds a valid filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.any(query_1.key.startsWith('/games/'), query_1.value.y.gt(7))), {
operator: 'or',
filters: [
{ path: ['key'], operator: 'startsWith', value: '/games/' },
{ path: ['value', 'y'], operator: 'gt', value: 7 },
],
});
});
ava_1.default('any throws a TypeError if not given a filter', (t) => {
t.throws(() => query_1.any('a'), TypeError);
});
ava_1.default('any throws an IllegalArgumentError if not given any arguemnts', (t) => {
t.throws(() => query_1.any(), errors_1.IllegalArgumentError);
});
ava_1.default('not builds a valid filter', (t) => {
t.deepEqual(stringifyThenParse(query_1.not(query_1.key.startsWith('/games/'))), {
operator: 'not',
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
});
});
ava_1.default('not throws a TypeError if not given a filter', (t) => {
t.throws(() => query_1.not('a'), TypeError);
});
ava_1.default('filter builds a new query', (t) => {
t.deepEqual(stringifyThenParse(query_1.filter(query_1.key.startsWith('/games/'))), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
});
});
ava_1.default('filter throws if not given a Filter', (t) => {
t.throws(() => query_1.filter('abc'), TypeError);
});
ava_1.default('Query.filter combines filters with logical AND', (t) => {
t.deepEqual(stringifyThenParse(query_1.filter(query_1.key.startsWith('/games/')).filter(query_1.value.eq(7))), {
filter: {
operator: 'and',
filters: [
{ path: ['key'], operator: 'startsWith', value: '/games/' },
{ path: ['value'], operator: 'eq', value: 7 },
],
},
});
});
ava_1.default('Query.filter throws if not given a Filter', (t) => {
const q = query_1.filter(query_1.key.eq('abc'));
t.throws(() => q.filter('abc'), TypeError);
});
const baseQ = query_1.filter(query_1.key.startsWith('/games/'));
const limitQ = baseQ.limit(7);
ava_1.default('Query.limit sets a limit', (t) => {
t.deepEqual(stringifyThenParse(limitQ), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
limit: 7,
});
});
ava_1.default('Query.limit overrides if current limit > new limit l', (t) => {
t.deepEqual(stringifyThenParse(limitQ.limit(6)), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
limit: 6,
});
});
ava_1.default('Query.limit does nothing if current limit = new limit', (t) => {
t.deepEqual(stringifyThenParse(limitQ.limit(7)), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
limit: 7,
});
});
ava_1.default('Query.limit throws an IllegalArgumentError if increasing current limit', (t) => {
t.throws(() => limitQ.limit(8), errors_1.IllegalArgumentError);
});
ava_1.default('Query.limit throws an IllegalArgumentError if setting limit to a value less than 1', (t) => {
t.throws(() => limitQ.limit(0), errors_1.IllegalArgumentError);
});
ava_1.default('Query.skip sets skip', (t) => {
t.deepEqual(stringifyThenParse(baseQ.skip(3)), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
skip: 3,
});
});
ava_1.default('Query.orderBy sets order', (t) => {
t.deepEqual(stringifyThenParse(baseQ.orderBy(query_1.value.x)), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
orderBy: [{ path: ['value', 'x'], direction: query_1.ASC }],
});
});
ava_1.default('Query.orderBy sets DESC order', (t) => {
t.deepEqual(stringifyThenParse(baseQ.orderBy(query_1.value.x, query_1.DESC)), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
orderBy: [{ path: ['value', 'x'], direction: query_1.DESC }],
});
});
ava_1.default('Query.orderBy sets secondary order', (t) => {
t.deepEqual(stringifyThenParse(baseQ.orderBy(query_1.value.x).orderBy(query_1.key)), {
filter: { path: ['key'], operator: 'startsWith', value: '/games/' },
orderBy: [{ path: ['value', 'x'], direction: query_1.ASC }, { path: ['key'], direction: query_1.ASC }],
});
});
ava_1.default('Query.orderBy throws an IllegalArgumentError when ordering by same path twice', (t) => {
t.throws(() => baseQ.orderBy(query_1.value.x).orderBy(query_1.value.x), errors_1.IllegalArgumentError);
});
//# sourceMappingURL=query.test.js.map
{"version":3,"file":"query.test.js","sourceRoot":"","sources":["../../../src/test/unit/query.test.ts"],"names":[],"mappings":"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"}
+4
-20

@@ -1,21 +0,5 @@

import { Options } from '@binaris/shift-interfaces-node-client';
import { UpdateOptions, Version, Serializable } from '@binaris/shift-interfaces-node-client/interfaces';
import { DeepReadonly } from 'deep-freeze';
export interface Versioned<T extends Serializable | undefined> {
version: Version;
value: T;
}
export declare class DBHandler {
private readonly client;
private readonly ctx;
constructor(options?: Options);
get<T extends Serializable = any>(key: string): Promise<T | undefined>;
create(key: string, value: Serializable): Promise<boolean>;
remove(key: string): Promise<boolean>;
update<T extends Serializable = any>(key: string, updater: (state?: DeepReadonly<T>) => T, _options?: UpdateOptions): Promise<DeepReadonly<T>>;
private getWithVersion;
startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>>;
find(): Promise<any[]>;
private setIfVersion;
}
import { Document, UpdateOptions, Serializable } from '@binaris/shift-interfaces-node-client/interfaces';
import { Versioned, Q } from './db';
export { Q };
/**

@@ -49,3 +33,3 @@ * Gets a single document.

*/
export declare function find(): Promise<any[]>;
export declare function find(query: Q.Query): Promise<Document[]>;
/**

@@ -52,0 +36,0 @@ * Polls on updates to specified keys since specified versions.

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EACU,aAAa,EAAE,OAAO,EAAwB,YAAY,EAC1E,MAAM,kDAAkD,CAAC;AAC1D,OAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIvD,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,YAAY,GAAG,SAAS;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;CACV;AA2BD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAQlB;gBAEU,OAAO,CAAC,EAAE,OAAO;IAIhB,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAItE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAC9C,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,aAAa,GAC7E,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAe3B,OAAO,CAAC,cAAc;IAIT,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAI3F,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAIrB,YAAY;CAO3B;AAID;;;GAGG;AACH,wBAAsB,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE3F;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/E;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1D;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EACvD,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAC5E,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAE1B;AAGD;;;;GAIG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAE3C;AAED;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAEzC;yBAFqB,IAAI;;;;;AAK1B;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAEhH;yBAFqB,YAAY"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,QAAQ,EACR,aAAa,EACb,YAAY,EACb,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAM,SAAS,EAAE,CAAC,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,EAAE,CAAC,EAAE,CAAC;AAkBb;;;GAGG;AACH,wBAAsB,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE3F;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/E;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1D;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EACvD,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAC5E,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAE1B;AAGD;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAEzC;yBAFqB,IAAI;;;;;AAK1B;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAEhH;yBAFqB,YAAY"}

@@ -5,89 +5,17 @@ "use strict";

};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const shift_interfaces_node_client_1 = require("@binaris/shift-interfaces-node-client");
const deep_freeze_1 = __importDefault(require("deep-freeze"));
const ramda_1 = require("ramda");
const process = __importStar(require("process"));
const defaultOptions = {
const process_1 = __importDefault(require("process"));
const db_1 = require("./db");
exports.Q = db_1.Q;
// TODO(bergundy): Verify environment variables
const db = new db_1.DB(`${process_1.default.env.SHIFT_DB_BASE_URL}/v1`, {
auth: {
v1: {
appId: process_1.default.env.SHIFT_APPLICATION_ID,
apiKey: '<unused>',
},
},
}, {
timeoutMs: 2000,
};
// bigint not currently allowed.
const allowedTypes = new Set(['object', 'boolean', 'number', 'string']);
function checkValue(value) {
if (!allowedTypes.has(typeof value)) {
throw new TypeError(`Non-JSONable value of type ${typeof value} at top level`);
}
}
// Generates successive promises to sleep in order to back off. (Not
// an async iterator, so you can generate the promise to back off,
// then try something, and then back off for the remainder of the
// generated time.)
function* backoff() {
let delayMs = 20;
for (;;) {
yield new Promise((res) => setTimeout(res, delayMs));
delayMs *= 1.2;
}
}
class DBHandler {
constructor(options) {
this.ctx = {
auth: {
v1: {
// TODO(ariels): Update with prefixes from binaris/spice#616.
appId: process.env.APP_ID,
apiKey: process.env.API_KEY,
},
},
};
this.client = new shift_interfaces_node_client_1.DBClient(`${process.env.DB_BASE_URL}/v1`, ramda_1.merge(defaultOptions, options));
}
async get(key) {
return (await this.client.get(this.ctx, key));
}
async create(key, value) {
checkValue(value);
return await this.client.create(this.ctx, key, value);
}
async remove(key) {
return await this.client.remove(this.ctx, key);
}
// TODO(ariels): Support operationId for streaming.
async update(key, updater, _options) {
for (const delay of backoff()) {
const { value, version } = await this.getWithVersion(key);
// deepFreeze doesn't like some values (like undefined), trick
// it by referring to value in an object.
const newValue = updater(deep_freeze_1.default({ value: value }).value);
checkValue(newValue);
if (await this.setIfVersion(key, newValue, version))
return deep_freeze_1.default(newValue);
await delay;
}
throw Error('Timed out'); // backoff() is currently infinite but
// won't stay that way. Needed for
// TypeScript.
}
getWithVersion(key) {
return this.client.getWithVersion(this.ctx, key);
}
async startPolling(_key) {
throw new Error('Unimplemented');
}
async find() {
throw new Error('Unimplemented');
}
async setIfVersion(key, value, version) {
return await this.client.setIfVersion(this.ctx, key, version, value);
}
}
exports.DBHandler = DBHandler;
const db = new DBHandler();
});
/**

@@ -134,4 +62,4 @@ * Gets a single document.

*/
async function find() {
throw new Error('Unimplemented');
async function find(query) {
return db.find(query);
}

@@ -138,0 +66,0 @@ exports.find = find;

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,sDAA8B;AAO9B,6BAAwC;AAE/B,YAFe,MAAC,CAEf;AAEV,+CAA+C;AAC/C,MAAM,EAAE,GAAG,IAAI,OAAE,CACf,GAAG,iBAAO,CAAC,GAAG,CAAC,iBAAkB,KAAK,EACtC;IACE,IAAI,EAAE;QACJ,EAAE,EAAE;YACF,KAAK,EAAE,iBAAO,CAAC,GAAG,CAAC,oBAAqB;YACxC,MAAM,EAAE,UAAU;SACnB;KACF;CACF,EACD;IACE,SAAS,EAAE,IAAI;CAChB,CACF,CAAC;AAEF;;;GAGG;AACI,KAAK,UAAU,GAAG,CAA+B,GAAW;IACjE,OAAO,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAFD,kBAEC;AAED;;;;GAIG;AACI,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,KAAmB;IAC3D,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAFD,wBAEC;AAED;;;GAGG;AACI,KAAK,UAAU,MAAM,CAAC,GAAW;IACtC,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAFD,wBAEC;AAED;;;;;GAKG;AACI,KAAK,UAAU,MAAM,CAC1B,GAAW,EAAE,OAAuC,EAAE,OAAuB;IAE7E,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAJD,wBAIC;AACD,uDAAuD;AAEvD;;;;GAIG;AACI,KAAK,UAAU,IAAI,CAAC,KAAc;IACvC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAFD,oBAEC;AAED;;GAEG;AACI,KAAK,UAAU,IAAI;IACxB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC;AAFD,oBAEC;AACD,IAAI,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAErC;;GAEG;AACI,KAAK,UAAU,YAAY,CAA+B,IAAY;IAC3E,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC;AAFD,oCAEC;AACD,YAAY,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC"}
{
"name": "@binaris/shift-db",
"version": "0.4.0-dbnu",
"version": "0.5.0-dbnu",
"description": "(Backend) client for accessing ShiftJS DBs.",
"main": "dist/index.js",
"files": "dist/",
"files": [
"dist/"
],
"types": "dist/index.d.ts",

@@ -11,3 +13,3 @@ "scripts": {

"lint": "tslint -c ../common/tslint.yml -p .",
"test": "ava dist/test/component/*.js"
"test": "ava -v dist/test/**/*.test.js"
},

@@ -26,3 +28,3 @@ "keywords": [

"dependencies": {
"@binaris/shift-interfaces-node-client": "0.4.0-nudb.1",
"@binaris/shift-interfaces-node-client": "0.4.0-nudb.2",
"@types/deep-freeze": "^0.1.2",

@@ -33,4 +35,4 @@ "deep-freeze": "0.0.1",

"devDependencies": {
"@binaris/shift-interfaces-koa-server": "0.4.0-nudb.1",
"@binaris/shift-leveldb-server": "0.0.1-dbnu",
"@binaris/shift-interfaces-koa-server": "0.4.0-nudb.2",
"@binaris/shift-leveldb-server": "0.0.2-dbnu",
"@types/koa": "~2.0.49",

@@ -37,0 +39,0 @@ "@types/koa-router": "~7.0.42",

Sorry, the diff of this file is not supported yet

DEBUG: loaded
DEBUG: start before
DEBUG: tmpdir /var/folders/k7/8lqpw3ws3ybd5_rm_1jvzlj00000gn/T/test-state-ZB8J5q
DEBUG: listening on undefined
DEBUG: started { ctx:
{ dbDir:
'/var/folders/k7/8lqpw3ws3ybd5_rm_1jvzlj00000gn/T/test-state-ZB8J5q',
client: DBHandler { ctx: [Object], client: [DBClient] } } }
>>> @binaris/shift-db
rm -rf dist/ && tsc
export {};
//# sourceMappingURL=db.d.ts.map
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/test/component/db.ts"],"names":[],"mappings":""}
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const ava_1 = __importDefault(require("ava"));
const shift_leveldb_server_1 = require("@binaris/shift-leveldb-server");
const shift_interfaces_koa_server_1 = require("@binaris/shift-interfaces-koa-server");
const __1 = require("../..");
const fs_1 = require("fs");
const rmfr_1 = __importDefault(require("rmfr"));
const os_1 = require("os");
const util_1 = require("util");
const path = __importStar(require("path"));
const koa_1 = __importDefault(require("koa"));
const koa_router_1 = __importDefault(require("koa-router"));
const http_1 = require("http");
const test = ava_1.default;
async function listenOn(app) {
return new Promise((resolve, reject) => {
const server = http_1.createServer(app.callback())
.listen(undefined, 'localhost', () => resolve(server));
server.once('error', reject);
});
}
process.env.APP_ID = 'testing';
process.env.API_KEY = '1234';
test.beforeEach(async (t) => {
const dbDir = await util_1.promisify(fs_1.mkdtemp)(path.join(os_1.tmpdir(), 'test-state-'), 'utf8');
const db = new shift_leveldb_server_1.DB(`${dbDir}/root.db`);
const dbRouter = new shift_interfaces_koa_server_1.DBRouter(db, true);
const router = new koa_router_1.default();
router.use('/v1', dbRouter.koaRouter.routes(), dbRouter.koaRouter.allowedMethods());
const app = new koa_1.default();
app.use(router.routes());
app.use(router.allowedMethods());
const server = await listenOn(app);
const port = server.address().port;
const url = `http://localhost:${port}`;
process.env.DB_BASE_URL = url;
// Instantiate DBHandler with proper URL set up.
const client = new __1.DBHandler({ timeoutMs: 1000 });
t.context = {
dbDir,
client,
};
});
test.afterEach(async (t) => {
await rmfr_1.default(t.context.dbDir);
});
test('DB.get returns undefined when no key exists', async (t) => {
const { client } = t.context;
const value = await client.get('test');
t.assert(value === undefined);
});
test('DB.create creates a new document and returns true', async (t) => {
const { client } = t.context;
const ret = await client.create('test', { a: 1 });
const value = await client.get('test');
t.deepEqual(value, { a: 1 });
t.true(ret);
});
test('DB.create returns false if key already exists', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.false(await client.create('test', { a: 2 }));
});
test('DB.create throws TypeError when value forced undefined', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', undefined), {
instanceOf: TypeError,
message: /undefined/,
});
});
test('DB.create throws TypeError when value is a function', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', () => 17), {
instanceOf: TypeError,
message: /function/,
});
});
test('DB.create throws TypeError when value is a bigint', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', BigInt(17)), {
instanceOf: TypeError,
message: /bigint/,
});
});
test('DB.create accepts arbitrary JSONables', async (t) => {
const { client } = t.context;
await client.create('test_string', 'hey');
await client.create('test_number', 7);
await client.create('test_boolean', true);
await client.create('test_object', { a: [7] });
await client.create('test_object', [{ a: 7 }]);
t.pass();
});
test('DB.remove returns false when no key exists', async (t) => {
const { client } = t.context;
t.false(await client.remove('test'));
});
test('DB.remove returns false when key was already deleted', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
await client.remove('test');
t.false(await client.remove('test'));
});
test('DB.remove removes existing key from DB and returns true', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.true(await client.remove('test'));
t.is(await client.get('test'), undefined);
});
test('DB.remove removes the key', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.true(await client.remove('test'));
const value = await client.get('test');
t.assert(value === undefined);
});
test('DB.update creates a new document if key does not exist, returns it, sets version to 1', async (t) => {
const { client } = t.context;
const next = await client.update('test', (prev) => (Object.assign({}, prev, { a: 1 })));
const value = await client.get('test');
t.deepEqual(value, { a: 1 });
t.deepEqual(next, value);
});
test('DB.update updates an existing document, returns it, and increments version', async (t) => {
const { client } = t.context;
await client.create('test', { b: 2 });
const next = await client.update('test', (prev) => (Object.assign({}, prev, { a: 1 })));
const value = await client.get('test');
t.deepEqual(value, { a: 1, b: 2 });
t.deepEqual(next, value);
});
test('DB.update does nothing if document not updated', async (t) => {
const { client } = t.context;
await client.create('test', { b: 2 });
const next = await client.update('test', (prev) => (Object.assign({}, prev)));
const value = await client.get('test');
t.deepEqual(value, { b: 2 });
t.deepEqual(next, value);
// TODO(ariels): Verify no update on an ongoing poll.
});
// TODO(ariels): Retrieve poll tests from old db/src/db.ts.
test('DB.create works after remove', async (t) => {
const { client } = t.context;
await client.create('test', 7);
await client.remove('test');
t.true(await client.create('test', 8));
const value = await client.get('test');
t.assert(value === 8);
});
// TODO(ariels): DB.update works after remove but increments version and includes tombstone\'s patches'
test('DB.update throws TypeError if updater returned undefined', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.update('test', () => undefined), TypeError);
});
test('CLIENT.update throws TypeError if trying to modify returned object', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1, b: { c: 2, d: [5] } });
await t.throwsAsync(client.update('test', (obj) => {
obj.a = 2;
return obj;
}), TypeError);
await t.throwsAsync(client.update('test', (obj) => {
obj.b.c = 3;
return obj;
}), TypeError);
await t.throwsAsync(client.update('test', (obj) => {
obj.b.d[0] = 6;
return obj;
}), TypeError);
});
//# sourceMappingURL=db.js.map
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/test/component/db.ts"],"names":[],"mappings":"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"}
{
"files": {
"db-client/package.json": "de9cb18da4b3516fe0b763d547d9258bb65b38f0",
"db-client/src/index.ts": "bdfd33ff816857efe5a383c2c6854faa84d12190",
"db-client/src/test/component/db.ts": "d35a3788e8d1d3d6a42f0abd50efd9567b12bd96",
"db-client/tsconfig.json": "383425b283005db5d0677d2116cb9b66f739985a",
"common/config/rush/shrinkwrap.yaml": "186870aead95700ad5d3b6e82e261de5621bf26b"
},
"arguments": "rm -rf dist/ && tsc "
}

Sorry, the diff of this file is not supported yet

import { DBClient, Options } from '@binaris/shift-interfaces-node-client';
import {
ClientContext, UpdateOptions, Version, VersionedMaybeObject, Serializable
} from '@binaris/shift-interfaces-node-client/interfaces';
import deepFreeze, { DeepReadonly } from 'deep-freeze';
import { merge } from 'ramda';
import * as process from 'process';
export interface Versioned<T extends Serializable | undefined> {
version: Version;
value: T;
}
const defaultOptions: Options = {
timeoutMs: 2000,
};
// bigint not currently allowed.
const allowedTypes = new Set(['object', 'boolean', 'number', 'string']);
function checkValue(value: Serializable) {
if (!allowedTypes.has(typeof value)) {
throw new TypeError(`Non-JSONable value of type ${typeof value} at top level`);
}
}
// Generates successive promises to sleep in order to back off. (Not
// an async iterator, so you can generate the promise to back off,
// then try something, and then back off for the remainder of the
// generated time.)
function* backoff() {
let delayMs = 20;
for (;;) {
yield new Promise((res) => setTimeout(res, delayMs));
delayMs *= 1.2;
}
}
export class DBHandler {
private readonly client: DBClient;
private readonly ctx: ClientContext = {
auth: {
v1: {
// TODO(ariels): Update with prefixes from binaris/spice#616.
appId: process.env.APP_ID!,
apiKey: process.env.API_KEY!,
},
},
};
constructor(options?: Options) {
this.client = new DBClient(`${process.env.DB_BASE_URL!}/v1`, merge(defaultOptions, options));
}
public async get<T extends Serializable = any>(key: string): Promise<T | undefined> {
return (await this.client.get(this.ctx, key)) as T;
}
public async create(key: string, value: Serializable): Promise<boolean> {
checkValue(value);
return await this.client.create(this.ctx, key, value);
}
public async remove(key: string): Promise<boolean> {
return await this.client.remove(this.ctx, key);
}
// TODO(ariels): Support operationId for streaming.
public async update<T extends Serializable = any>(
key: string, updater: (state?: DeepReadonly<T>) => T, _options?: UpdateOptions,
): Promise<DeepReadonly<T>> {
for (const delay of backoff()) {
const { value, version } = await this.getWithVersion(key);
// deepFreeze doesn't like some values (like undefined), trick
// it by referring to value in an object.
const newValue = updater(deepFreeze({ value: value as T }).value);
checkValue(newValue);
if (await this.setIfVersion(key, newValue, version)) return deepFreeze(newValue);
await delay;
}
throw Error('Timed out'); // backoff() is currently infinite but
// won't stay that way. Needed for
// TypeScript.
}
private getWithVersion(key: string): Promise<VersionedMaybeObject> {
return this.client.getWithVersion(this.ctx, key);
}
public async startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>> {
throw new Error('Unimplemented');
}
public async find(): Promise<any[]> {
throw new Error('Unimplemented');
}
private async setIfVersion(
key: string,
value: Serializable,
version: Version
): Promise<boolean> {
return await this.client.setIfVersion(this.ctx, key, version, value);
}
}
const db = new DBHandler();
/**
* Gets a single document.
* @return - value or undefined if key doesn’t exist.
*/
export async function get<T extends Serializable = any>(key: string): Promise<T | undefined> {
return await db.get(key);
}
/**
* Creates a document for given key.
* @param value - Cannot be undefined, must be an object
* @return - true if document was created, false if key already exists.
*/
export async function create(key: string, value: Serializable): Promise<boolean> {
return await db.create(key, value);
}
/**
* Removes a single document.
* @return - true if document was deleted, false if key doesn’t exist.
*/
export async function remove(key: string): Promise<boolean> {
return await db.remove(key);
}
/**
* Updates a single document.
* @param updater - Function that gets the previous value and returns the next value to update the DB with.
* Cannot return undefined, receives undefined in case key doesn’t already exist in the DB.
* @return - The new value returned from updater
*/
export async function update<T extends Serializable = any>(
key: string, updater: (state?: DeepReadonly<T>) => T, options?: UpdateOptions,
): Promise<DeepReadonly<T>> {
return await db.update(key, updater, options);
}
// Available only on backend, needs to pass a function.
/**
* Find documents matching query.
* @param query - a query constructed with Q methods.
* @return - an array of documents
*/
export async function find(): Promise<any[]> {
throw new Error('Unimplemented');
}
/**
* Polls on updates to specified keys since specified versions.
*/
export async function poll(): Promise<any> {
throw new Error('Unimplemented');
}
poll.__shiftjs__ = { exposed: true };
/**
* Gets a initial document in an intent to for poll on it.
*/
export async function startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>> {
throw new Error('Unimplemented');
}
startPolling.__shiftjs__ = { exposed: true };

Sorry, the diff of this file is not supported yet

import anyTest, { TestInterface } from 'ava';
import { DB } from '@binaris/shift-leveldb-server';
import { DBRouter } from '@binaris/shift-interfaces-koa-server';
import { DBHandler } from '../..';
import { mkdtemp } from 'fs';
import rmrf from 'rmfr';
import { tmpdir } from 'os';
import { promisify } from 'util';
import * as path from 'path';
import { AddressInfo } from 'net';
import Koa from 'koa';
import KoaRouter from 'koa-router';
import { createServer, Server } from 'http';
interface Context {
dbDir: string;
client: DBHandler;
}
const test = anyTest as TestInterface<Context>;
async function listenOn(app: Koa): Promise<Server> {
return new Promise((resolve, reject) => {
const server = createServer(app.callback())
.listen(undefined, 'localhost', () => resolve(server));
server.once('error', reject);
});
}
process.env.APP_ID = 'testing';
process.env.API_KEY = '1234';
test.beforeEach(async (t) => {
const dbDir = await promisify(mkdtemp)(path.join(tmpdir(), 'test-state-'), 'utf8');
const db = new DB(`${dbDir}/root.db`);
const dbRouter = new DBRouter(db, true);
const router = new KoaRouter();
router.use('/v1', dbRouter.koaRouter.routes(), dbRouter.koaRouter.allowedMethods());
const app = new Koa();
app.use(router.routes());
app.use(router.allowedMethods());
const server = await listenOn(app);
const port = (server.address() as unknown as AddressInfo).port;
const url = `http://localhost:${port}`;
process.env.DB_BASE_URL = url;
// Instantiate DBHandler with proper URL set up.
const client = new DBHandler({ timeoutMs: 1000 });
t.context = {
dbDir,
client,
};
});
test.afterEach(async (t) => {
await rmrf(t.context.dbDir);
});
test('DB.get returns undefined when no key exists', async (t) => {
const { client } = t.context;
const value = await client.get('test');
t.assert(value === undefined);
});
test('DB.create creates a new document and returns true', async (t) => {
const { client } = t.context;
const ret = await client.create('test', { a: 1 });
const value = await client.get('test');
t.deepEqual(value, { a: 1 });
t.true(ret);
});
test('DB.create returns false if key already exists', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.false(await client.create('test', { a: 2 }));
});
test('DB.create throws TypeError when value forced undefined', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', undefined as any), {
instanceOf: TypeError,
message: /undefined/,
});
});
test('DB.create throws TypeError when value is a function', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', () => 17), {
instanceOf: TypeError,
message: /function/,
});
});
test('DB.create throws TypeError when value is a bigint', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.create('test', BigInt(17)), {
instanceOf: TypeError,
message: /bigint/,
});
});
test('DB.create accepts arbitrary JSONables', async (t) => {
const { client } = t.context;
await client.create('test_string', 'hey');
await client.create('test_number', 7);
await client.create('test_boolean', true);
await client.create('test_object', { a: [7] });
await client.create('test_object', [{ a: 7 }]);
t.pass();
});
test('DB.remove returns false when no key exists', async (t) => {
const { client } = t.context;
t.false(await client.remove('test'));
});
test('DB.remove returns false when key was already deleted', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
await client.remove('test');
t.false(await client.remove('test'));
});
test('DB.remove removes existing key from DB and returns true', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.true(await client.remove('test'));
t.is(await client.get('test'), undefined);
});
test('DB.remove removes the key', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1 });
t.true(await client.remove('test'));
const value = await client.get('test');
t.assert(value === undefined);
});
test('DB.update creates a new document if key does not exist, returns it, sets version to 1', async (t) => {
const { client } = t.context;
const next = await client.update('test', (prev) => ({ ...prev, a: 1 }));
const value = await client.get('test');
t.deepEqual(value, { a: 1 });
t.deepEqual(next, value);
});
test('DB.update updates an existing document, returns it, and increments version', async (t) => {
const { client } = t.context;
await client.create('test', { b: 2 });
const next = await client.update('test', (prev) => ({ ...prev, a: 1 }));
const value = await client.get('test');
t.deepEqual(value, { a: 1, b: 2 });
t.deepEqual(next, value);
});
test('DB.update does nothing if document not updated', async (t) => {
const { client } = t.context;
await client.create('test', { b: 2 });
const next = await client.update('test', (prev) => ({ ...prev }));
const value = await client.get('test');
t.deepEqual(value, { b: 2 });
t.deepEqual(next, value);
// TODO(ariels): Verify no update on an ongoing poll.
});
// TODO(ariels): Retrieve poll tests from old db/src/db.ts.
test('DB.create works after remove', async (t) => {
const { client } = t.context;
await client.create('test', 7);
await client.remove('test');
t.true(await client.create('test', 8));
const value = await client.get('test');
t.assert(value === 8);
});
// TODO(ariels): DB.update works after remove but increments version and includes tombstone\'s patches'
test('DB.update throws TypeError if updater returned undefined', async (t) => {
const { client } = t.context;
await t.throwsAsync(client.update('test', () => undefined as any), TypeError);
});
test('CLIENT.update throws TypeError if trying to modify returned object', async (t) => {
const { client } = t.context;
await client.create('test', { a: 1, b: { c: 2, d: [5] } });
await t.throwsAsync(client.update('test', (obj) => {
(obj as any).a = 2;
return obj;
}), TypeError);
await t.throwsAsync(client.update('test', (obj) => {
(obj as any).b.c = 3;
return obj;
}), TypeError);
await t.throwsAsync(client.update('test', (obj) => {
(obj as any).b.d[0] = 6;
return obj;
}), TypeError);
});

Sorry, the diff of this file is not supported yet

{
"extends": "../common/tsconfig.json",
"compilerOptions": {
"outDir": "dist",
}
}

Sorry, the diff of this file is not supported yet