@binaris/shift-db
Advanced tools
+23
| 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"} |
+80
| "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"} |
+179
| 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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"} |
+283
| "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"} |
+15
-87
@@ -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"} |
+8
-6
| { | ||
| "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
-170
| 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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
81463
87.62%25
25%1103
49.46%2
-86.67%2
-50%+ Added
- Removed