sqrl-redis-functions
Advanced tools
Comparing version 0.6.6-beta.5 to 0.6.6-beta.6
@@ -215,3 +215,6 @@ "use strict"; | ||
const currentCountAst = databaseCountTransform(state, ast, currentCountArgs); | ||
const currentAndPreviousCountAst = databaseCountTransform(state, ast, Object.assign(Object.assign({}, currentCountArgs), { timespan: trendingConfig.currentAndPrevious })); | ||
const currentAndPreviousCountAst = databaseCountTransform(state, ast, { | ||
...currentCountArgs, | ||
timespan: trendingConfig.currentAndPrevious | ||
}); | ||
const { keysAst } = interpretCountArgs(state, ast, currentCountArgs); | ||
@@ -245,4 +248,10 @@ return sqrl_1.AstBuilder.call("_fetchTrendingDetails", [ | ||
const resultAst = sqrl_1.AstBuilder.call("_subtract", [ | ||
classifyCountTransform(state, ast, Object.assign(Object.assign({}, args), { timespan: previousConfig.subtractLeft })), | ||
classifyCountTransform(state, ast, Object.assign(Object.assign({}, args), { timespan: previousConfig.subtractRight })) | ||
classifyCountTransform(state, ast, { | ||
...args, | ||
timespan: previousConfig.subtractLeft | ||
}), | ||
classifyCountTransform(state, ast, { | ||
...args, | ||
timespan: previousConfig.subtractRight | ||
}) | ||
]); | ||
@@ -249,0 +258,0 @@ if (!previousConfig.allowNegativeValue) { |
@@ -6,3 +6,3 @@ "use strict"; | ||
const sqrl_1 = require("sqrl"); | ||
const murmur128x64 = require("murmur-128"); | ||
const murmurJs = require("murmurhash3.js"); | ||
const sqrl_common_1 = require("sqrl-common"); | ||
@@ -17,3 +17,3 @@ const sqrlRedisParser_1 = require("./parser/sqrlRedisParser"); | ||
} | ||
const data = new Uint8Array(murmur128x64(value)); | ||
const data = Buffer.from(murmurJs.x64.hash128(value)); | ||
const hashHex = sqrl_common_1.arrayToHex(data); | ||
@@ -142,3 +142,7 @@ return hashHex.substring(16); | ||
const sortedGroupAliases = sortedGroup.map(feature => feature.alias); | ||
const { entityId, entityAst } = state.addHashedEntity(ast, "UniqueCounter", Object.assign({ groups: sortedGroupAliases, uniques: sortedUniques.map(feature => feature.alias) }, (whereTruth ? { whereFeatures, whereTruth } : {}))); | ||
const { entityId, entityAst } = state.addHashedEntity(ast, "UniqueCounter", { | ||
groups: sortedGroupAliases, | ||
uniques: sortedUniques.map(feature => feature.alias), | ||
...(whereTruth ? { whereFeatures, whereTruth } : {}) | ||
}); | ||
const originalKeysAst = state.setGlobal(ast, sqrl_1.AstBuilder.call("_getKeyList", [ | ||
@@ -145,0 +149,0 @@ entityAst, |
/// <reference types="node" /> | ||
import { RedisInterface, RateLimitOptions } from "../services/RedisService"; | ||
import { Context } from "sqrl"; | ||
import { MockRedisDatabase } from "./MockRedisDatabase"; | ||
import { RedisInterface, RateLimitOptions } from "../services/RedisInterface"; | ||
export declare class MockRedisService implements RedisInterface, MockRedisDatabase { | ||
@@ -6,0 +6,0 @@ db: {}; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.getWindowStart = exports.getCurrentBucketExpirySeconds = exports.getBucketTimeForTimeMs = exports.getBucketSize = exports.getAllBucketKeys = exports.getBucketKey = void 0; | ||
const RedisService_1 = require("./RedisService"); | ||
const RedisInterface_1 = require("./RedisInterface"); | ||
function getBucketKey(databaseSet, prefix, key, windowMs, bucketTime) { | ||
return RedisService_1.createRedisKey(databaseSet, prefix, key, windowMs, bucketTime); | ||
return RedisInterface_1.createRedisKey(databaseSet, prefix, key, windowMs, bucketTime); | ||
} | ||
@@ -8,0 +8,0 @@ exports.getBucketKey = getBucketKey; |
/// <reference types="node" /> | ||
import { Context, SqrlKey } from "sqrl"; | ||
import { RedisInterface } from "./RedisService"; | ||
import { CountUniqueService } from "../Services"; | ||
import { RedisInterface } from "./RedisInterface"; | ||
export declare class RedisApproxCountUniqueService implements CountUniqueService { | ||
@@ -6,0 +6,0 @@ private redis; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.RedisApproxCountUniqueService = void 0; | ||
const RedisService_1 = require("./RedisService"); | ||
const BucketedKeys_1 = require("./BucketedKeys"); | ||
const RedisCountService_1 = require("./RedisCountService"); | ||
const RedisInterface_1 = require("./RedisInterface"); | ||
const NUM_BUCKETS = 10; | ||
@@ -14,3 +14,3 @@ class RedisApproxCountUniqueService { | ||
async bumpTotal(ctx, key, sortedHashes) { | ||
const redisKey = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
const redisKey = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
await Promise.all([ | ||
@@ -36,3 +36,3 @@ this.redis.pfadd(ctx, redisKey, sortedHashes), | ||
async fetchTotal(ctx, key, at, windowMs, extraHashesKey) { | ||
const redisKey = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
const redisKey = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
return this.redis.pfcount(ctx, extraHashesKey ? [redisKey, extraHashesKey] : [redisKey]); | ||
@@ -45,3 +45,3 @@ } | ||
if (addHashes.length) { | ||
extraHashesKey = RedisService_1.createRedisKey(databaseSet, this.prefix, "temp", ...addHashes); | ||
extraHashesKey = RedisInterface_1.createRedisKey(databaseSet, this.prefix, "temp", ...addHashes); | ||
Promise.all([ | ||
@@ -48,0 +48,0 @@ this.redis.pfadd(ctx, extraHashesKey, addHashes), |
import { Context, SqrlKey } from "sqrl"; | ||
import { RedisInterface } from "./RedisService"; | ||
import { RedisInterface } from "./RedisInterface"; | ||
export interface RedisBucketCountInterface { | ||
@@ -4,0 +4,0 @@ bump(ctx: Context, props: { |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.RedisTotalCountService = void 0; | ||
const RedisService_1 = require("./RedisService"); | ||
const RedisCountService_1 = require("./RedisCountService"); | ||
const RedisInterface_1 = require("./RedisInterface"); | ||
class RedisTotalCountService { | ||
@@ -12,3 +12,3 @@ constructor(redis, prefix) { | ||
async bump(ctx, props) { | ||
const key = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, props.key.getHex()); | ||
const key = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, props.key.getHex()); | ||
await Promise.all([ | ||
@@ -20,3 +20,3 @@ this.redis.increment(ctx, key, props.amount), | ||
async count(ctx, props) { | ||
const key = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, props.key.getHex()); | ||
const key = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, props.key.getHex()); | ||
const values = await this.redis.mgetNumbers(ctx, [key]); | ||
@@ -23,0 +23,0 @@ return values[0]; |
@@ -1,4 +0,4 @@ | ||
import { RedisInterface } from "./RedisService"; | ||
import { Context, SqrlKey } from "sqrl"; | ||
import { CountService } from "../Services"; | ||
import { RedisInterface } from "./RedisInterface"; | ||
export declare const TOTAL_COUNT_EXPIRY_SEC: number; | ||
@@ -5,0 +5,0 @@ export declare class RedisCountService implements CountService { |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.RedisCountService = exports.TOTAL_COUNT_EXPIRY_SEC = void 0; | ||
const RedisService_1 = require("./RedisService"); | ||
const BucketedKeys_1 = require("./BucketedKeys"); | ||
const RedisInterface_1 = require("./RedisInterface"); | ||
const NUM_BUCKETS = 10; | ||
@@ -15,3 +15,3 @@ exports.TOTAL_COUNT_EXPIRY_SEC = 90 * 24 * 3600; | ||
await Promise.all(keys.map(key => { | ||
const redisKey = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
const redisKey = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
return Promise.all([ | ||
@@ -25,3 +25,3 @@ this.redis.increment(ctx, redisKey, by), | ||
const redisKeys = keys.map(key => { | ||
return RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
return RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getHex()); | ||
}); | ||
@@ -28,0 +28,0 @@ return this.redis.mgetNumbers(ctx, redisKeys); |
@@ -1,4 +0,4 @@ | ||
import { RedisInterface } from "./RedisService"; | ||
import { Context, SqrlKey } from "sqrl"; | ||
import { CountUniqueService } from "../Services"; | ||
import { RedisInterface } from "./RedisInterface"; | ||
export declare class RedisCountUniqueService implements CountUniqueService { | ||
@@ -5,0 +5,0 @@ private redis; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.RedisCountUniqueService = void 0; | ||
const RedisService_1 = require("./RedisService"); | ||
const RedisInterface_1 = require("./RedisInterface"); | ||
class RedisCountUniqueService { | ||
@@ -18,6 +18,6 @@ constructor(redis, prefix) { | ||
}); | ||
await this.redis.listPush(ctx, RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getBuffer()), ...push); | ||
await this.redis.listPush(ctx, RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getBuffer()), ...push); | ||
} | ||
async getData(ctx, key) { | ||
const data = await this.redis.getList(ctx, RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getBuffer())); | ||
const data = await this.redis.getList(ctx, RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, key.getBuffer())); | ||
return data.map(entry => JSON.parse(entry)); | ||
@@ -24,0 +24,0 @@ } |
import { LabelService } from "../LabelFunctions"; | ||
import { RedisInterface } from "./RedisService"; | ||
import { Context, Manipulator, SqrlEntity, WhenCause } from "sqrl"; | ||
import { RedisInterface } from "./RedisInterface"; | ||
export declare class RedisLabelService implements LabelService { | ||
@@ -5,0 +5,0 @@ private redis; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.RedisLabelService = void 0; | ||
const RedisService_1 = require("./RedisService"); | ||
const RedisInterface_1 = require("./RedisInterface"); | ||
const EXPIRY = 60 * 60 * 24 * 30; | ||
@@ -13,3 +13,3 @@ class RedisLabelService { | ||
manipulator.addCallback(async (ctx) => { | ||
const key = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "label", entity.getNumberString(), label); | ||
const key = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "label", entity.getNumberString(), label); | ||
await this.redis.set(ctx, key, "1"); | ||
@@ -21,3 +21,3 @@ await this.redis.expire(ctx, key, EXPIRY); | ||
manipulator.addCallback(async (ctx) => { | ||
const key = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "label", entity.getNumberString(), label); | ||
const key = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "label", entity.getNumberString(), label); | ||
await this.redis.del(ctx, key); | ||
@@ -27,3 +27,3 @@ }); | ||
async hasLabel(ctx, entity, label) { | ||
const rv = await this.redis.get(ctx, RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "label", entity.getNumberString(), label)); | ||
const rv = await this.redis.get(ctx, RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "label", entity.getNumberString(), label)); | ||
return !!rv; | ||
@@ -30,0 +30,0 @@ } |
import { RateLimitService, RateLimitProps, SessionProps } from "../RateLimitFunctions"; | ||
import { RedisInterface } from "./RedisService"; | ||
import { Context } from "sqrl"; | ||
import { RedisInterface } from "./RedisInterface"; | ||
export declare class RedisRateLimit implements RateLimitService { | ||
@@ -5,0 +5,0 @@ private redis; |
/// <reference types="node" /> | ||
import { Context, DatabaseSet } from "sqrl"; | ||
export interface RateLimitOptions { | ||
maxAmount: number; | ||
refillTimeMs: number; | ||
refillAmount: number; | ||
take: number; | ||
at: number; | ||
strict: boolean; | ||
} | ||
export interface RedisInterface { | ||
rateLimitFetch(ctx: Context, key: Buffer, opt: RateLimitOptions): Promise<number>; | ||
sessionize(ctx: Context, key: Buffer, opt: RateLimitOptions): Promise<number>; | ||
increment(ctx: Context, key: Buffer, amount?: number): Promise<number>; | ||
get(ctx: Context, key: Buffer): Promise<Buffer>; | ||
del(ctx: Context, ...keys: Buffer[]): Promise<number>; | ||
set(ctx: Context, key: Buffer, value: string, mode?: "NX" | "XX"): Promise<boolean>; | ||
getList(ctx: Context, key: Buffer): Promise<string[]>; | ||
listPush(ctx: Context, key: Buffer, ...values: Array<string | Buffer | number>): Promise<void>; | ||
pfcount(ctx: Context, keys: Buffer[]): Promise<number>; | ||
pfadd(ctx: Context, key: Buffer, values: string[]): Promise<void>; | ||
expire(ctx: Context, key: Buffer, seconds: number): Promise<void>; | ||
mgetNumbers(ctx: Context, keys: Buffer[]): Promise<number[]>; | ||
} | ||
export declare function createRedisKey(databaseSet: DatabaseSet, prefix: string, ...keys: Array<string | number | Buffer>): Buffer; | ||
import { Context } from "sqrl"; | ||
import { RedisInterface, RateLimitOptions } from "./RedisInterface"; | ||
export declare class RedisService implements RedisInterface { | ||
@@ -27,0 +5,0 @@ private conn; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.RedisService = exports.createRedisKey = void 0; | ||
exports.RedisService = void 0; | ||
const addressToHostPort_1 = require("../addressToHostPort"); | ||
const Redis = require("ioredis"); | ||
const murmurhash = require("murmurhash-native"); | ||
const sqrl_common_1 = require("sqrl-common"); | ||
const rateLimitFetchLua_1 = require("../lua/rateLimitFetchLua"); | ||
const sessionizeLua_1 = require("../lua/sessionizeLua"); | ||
function createRedisKey(databaseSet, prefix, ...keys) { | ||
const parts = [ | ||
databaseSet.getDatasetId(), | ||
prefix, | ||
...keys.map(key => { | ||
if (key instanceof Buffer) { | ||
return key.toString("hex"); | ||
} | ||
else { | ||
return key; | ||
} | ||
}) | ||
]; | ||
return murmurhash.murmurHash128x64(Buffer.from(JSON.stringify(parts), "utf-8"), 0, "buffer"); | ||
} | ||
exports.createRedisKey = createRedisKey; | ||
class RedisService { | ||
@@ -27,0 +10,0 @@ constructor(address) { |
/// <reference types="node" /> | ||
import { RedisInterface } from "./RedisService"; | ||
import { Context, UniqueId } from "sqrl"; | ||
import { RedisInterface } from "./RedisInterface"; | ||
export declare const TIMESTAMP_BITS = 40; | ||
@@ -5,0 +5,0 @@ export declare const TIMESTAMP_SIZE: number; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.RedisUniqueIdService = exports.SimpleId = exports.REMAINDER_SIZE = exports.REMAINDER_BITS = exports.TIMESTAMP_EPOCH = exports.TIMESTAMP_SIZE = exports.TIMESTAMP_BITS = void 0; | ||
const RedisService_1 = require("./RedisService"); | ||
const sqrl_1 = require("sqrl"); | ||
const sqrl_common_1 = require("sqrl-common"); | ||
const bigint_buffer_1 = require("bigint-buffer"); | ||
const RedisInterface_1 = require("./RedisInterface"); | ||
exports.TIMESTAMP_BITS = 40; | ||
@@ -50,3 +50,3 @@ exports.TIMESTAMP_SIZE = Math.pow(2, exports.TIMESTAMP_BITS); | ||
const timeMs = this.getTimeMs(); | ||
const timeKey = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "time", timeMs); | ||
const timeKey = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "time", timeMs); | ||
const [remainder] = await Promise.all([ | ||
@@ -59,3 +59,3 @@ this.redis.increment(ctx, timeKey), | ||
async fetch(ctx, type, key) { | ||
const idKey = RedisService_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "id", type, key); | ||
const idKey = RedisInterface_1.createRedisKey(ctx.requireDatabaseSet(), this.prefix, "id", type, key); | ||
const saved = await this.redis.get(ctx, idKey); | ||
@@ -62,0 +62,0 @@ if (saved) { |
{ | ||
"name": "sqrl-redis-functions", | ||
"version": "0.6.6-beta.5", | ||
"version": "0.6.6-beta.6", | ||
"description": "SQRL (A Safe, Stateful Rules Language for Event Streams) - functions for storing state in redis", | ||
@@ -49,3 +49,3 @@ "homepage": "https://twitter.github.io/sqrl", | ||
"prettier": "^1.18.2", | ||
"sqrl-test-utils": "^0.6.6-beta.5", | ||
"sqrl-test-utils": "^0.6.6-beta.6", | ||
"ts-jest": "^24.0.2", | ||
@@ -64,7 +64,7 @@ "ts-node": "^8.3.0", | ||
"moment": "^2.24.0", | ||
"murmur-128": "^0.2.1", | ||
"murmurhash3.js": "git+https://github.com/qix/murmurHash3.js.git", | ||
"sqrl": "^0.6.6-beta.5", | ||
"sqrl-common": "^0.6.6-beta.5" | ||
}, | ||
"gitHead": "ed5d613c8f8460f8e204f2c58efb843a6166f238" | ||
"gitHead": "5494cfcd70466077e90d33e907fd3658159f4fa9" | ||
} |
Sorry, the diff of this file is too big to display
Git dependency
Supply chain riskContains a dependency which resolves to a remote git URL. Dependencies fetched from git URLs are not immutable and can be used to inject untrusted code or reduce the likelihood of a reproducible install.
Found 1 instance in 1 package
271013
57
7228
1
+ Addedmurmurhash3.js@git+https://github.com/qix/murmurHash3.js.git
- Removedmurmur-128@^0.2.1
- Removedencode-utf8@1.0.3(transitive)
- Removedfmix@0.1.0(transitive)
- Removedimul@1.0.1(transitive)
- Removedmurmur-128@0.2.1(transitive)