js-redis-server 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -35
- package/dist/cluster.d.ts +7 -1
- package/dist/cluster.d.ts.map +1 -1
- package/dist/cluster.js +103 -7
- package/dist/cluster.js.map +1 -1
- package/dist/commands/cluster.d.ts +3 -0
- package/dist/commands/cluster.d.ts.map +1 -1
- package/dist/commands/cluster.js +63 -20
- package/dist/commands/cluster.js.map +1 -1
- package/dist/commands/command.js +27 -18
- package/dist/commands/command.js.map +1 -1
- package/dist/commands/config.d.ts +9 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +142 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connection.d.ts.map +1 -1
- package/dist/commands/connection.js +73 -9
- package/dist/commands/connection.js.map +1 -1
- package/dist/commands/hashes.d.ts.map +1 -1
- package/dist/commands/hashes.js +5 -7
- package/dist/commands/hashes.js.map +1 -1
- package/dist/commands/index.d.ts +5 -4
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +25 -4
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/keys.d.ts +19 -0
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +112 -5
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/lists.d.ts +13 -0
- package/dist/commands/lists.d.ts.map +1 -1
- package/dist/commands/lists.js +140 -26
- package/dist/commands/lists.js.map +1 -1
- package/dist/commands/scripts.d.ts.map +1 -1
- package/dist/commands/scripts.js +9 -12
- package/dist/commands/scripts.js.map +1 -1
- package/dist/commands/sets.d.ts +1 -0
- package/dist/commands/sets.d.ts.map +1 -1
- package/dist/commands/sets.js +33 -8
- package/dist/commands/sets.js.map +1 -1
- package/dist/commands/streams.d.ts +63 -0
- package/dist/commands/streams.d.ts.map +1 -0
- package/dist/commands/streams.js +504 -0
- package/dist/commands/streams.js.map +1 -0
- package/dist/commands/strings.d.ts +5 -0
- package/dist/commands/strings.d.ts.map +1 -1
- package/dist/commands/strings.js +20 -2
- package/dist/commands/strings.js.map +1 -1
- package/dist/commands/zsets.d.ts +13 -3
- package/dist/commands/zsets.d.ts.map +1 -1
- package/dist/commands/zsets.js +174 -30
- package/dist/commands/zsets.js.map +1 -1
- package/dist/core/client-session.d.ts +114 -2
- package/dist/core/client-session.d.ts.map +1 -1
- package/dist/core/client-session.js +181 -12
- package/dist/core/client-session.js.map +1 -1
- package/dist/core/command-executor.d.ts +79 -0
- package/dist/core/command-executor.d.ts.map +1 -1
- package/dist/core/command-executor.js +130 -3
- package/dist/core/command-executor.js.map +1 -1
- package/dist/core/command-schema.d.ts +3 -0
- package/dist/core/command-schema.d.ts.map +1 -1
- package/dist/core/command-schema.js +2 -1
- package/dist/core/command-schema.js.map +1 -1
- package/dist/core/execution-policies/auth-policy.d.ts +10 -0
- package/dist/core/execution-policies/auth-policy.d.ts.map +1 -0
- package/dist/core/execution-policies/auth-policy.js +39 -0
- package/dist/core/execution-policies/auth-policy.js.map +1 -0
- package/dist/core/execution-policies/cluster-policy.d.ts.map +1 -1
- package/dist/core/execution-policies/cluster-policy.js +8 -2
- package/dist/core/execution-policies/cluster-policy.js.map +1 -1
- package/dist/core/execution-policies/index.d.ts +1 -0
- package/dist/core/execution-policies/index.d.ts.map +1 -1
- package/dist/core/execution-policies/index.js +3 -1
- package/dist/core/execution-policies/index.js.map +1 -1
- package/dist/core/execution-policies/transaction-policy.d.ts.map +1 -1
- package/dist/core/execution-policies/transaction-policy.js +0 -4
- package/dist/core/execution-policies/transaction-policy.js.map +1 -1
- package/dist/core/lua-runtime.d.ts +1 -1
- package/dist/core/lua-runtime.d.ts.map +1 -1
- package/dist/core/lua-runtime.js +26 -34
- package/dist/core/lua-runtime.js.map +1 -1
- package/dist/core/redis-context.d.ts +6 -1
- package/dist/core/redis-context.d.ts.map +1 -1
- package/dist/core/redis-context.js.map +1 -1
- package/dist/core/redis-error.d.ts +55 -1
- package/dist/core/redis-error.d.ts.map +1 -1
- package/dist/core/redis-error.js +105 -3
- package/dist/core/redis-error.js.map +1 -1
- package/dist/core/redis-value.d.ts +4 -0
- package/dist/core/redis-value.d.ts.map +1 -1
- package/dist/core/redis-value.js +4 -0
- package/dist/core/redis-value.js.map +1 -1
- package/dist/core/resp-encoder.js +5 -0
- package/dist/core/resp-encoder.js.map +1 -1
- package/dist/core/transports/resp2/decoder.d.ts +5 -1
- package/dist/core/transports/resp2/decoder.d.ts.map +1 -1
- package/dist/core/transports/resp2/decoder.js +20 -8
- package/dist/core/transports/resp2/decoder.js.map +1 -1
- package/dist/core/transports/resp2/server.d.ts +3 -1
- package/dist/core/transports/resp2/server.d.ts.map +1 -1
- package/dist/core/transports/resp2/server.js +3 -0
- package/dist/core/transports/resp2/server.js.map +1 -1
- package/dist/core/transports/resp2/session-adapter.d.ts.map +1 -1
- package/dist/core/transports/resp2/session-adapter.js +8 -1
- package/dist/core/transports/resp2/session-adapter.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -3
- package/dist/index.js.map +1 -1
- package/dist/state/cluster-topology.d.ts +6 -0
- package/dist/state/cluster-topology.d.ts.map +1 -1
- package/dist/state/cluster-topology.js +21 -0
- package/dist/state/cluster-topology.js.map +1 -1
- package/dist/state/data-types.d.ts +11 -0
- package/dist/state/data-types.d.ts.map +1 -1
- package/dist/state/data-types.js +12 -1
- package/dist/state/data-types.js.map +1 -1
- package/dist/state/database.d.ts +3 -1
- package/dist/state/database.d.ts.map +1 -1
- package/dist/state/database.js +6 -0
- package/dist/state/database.js.map +1 -1
- package/dist/state/keyspace.d.ts.map +1 -1
- package/dist/state/keyspace.js +1 -0
- package/dist/state/keyspace.js.map +1 -1
- package/dist/state/mutation-events.d.ts +1 -0
- package/dist/state/mutation-events.d.ts.map +1 -1
- package/dist/state/mutation-events.js.map +1 -1
- package/dist/state/server-state.d.ts +7 -0
- package/dist/state/server-state.d.ts.map +1 -1
- package/dist/state/server-state.js +2 -0
- package/dist/state/server-state.js.map +1 -1
- package/package.json +5 -5
|
@@ -5,6 +5,27 @@ const command_schema_1 = require("./command-schema");
|
|
|
5
5
|
const redis_error_1 = require("./redis-error");
|
|
6
6
|
const redis_result_1 = require("./redis-result");
|
|
7
7
|
const response_stream_1 = require("./response-stream");
|
|
8
|
+
/**
|
|
9
|
+
* Central command pipeline shared by every client session.
|
|
10
|
+
*
|
|
11
|
+
* Responsibilities:
|
|
12
|
+
* 1. Resolve a raw command name to a {@link CommandDefinition} (case-insensitive).
|
|
13
|
+
* 2. Parse raw argument buffers into typed args and extract routing keys,
|
|
14
|
+
* producing a {@link CommandPlan}.
|
|
15
|
+
* 3. Run the configured {@link ExecutionPolicy} chain around the command's own
|
|
16
|
+
* `execute`, giving policies (transaction, cluster, ...) a chance to
|
|
17
|
+
* short-circuit, rewrite, or wrap the result.
|
|
18
|
+
*
|
|
19
|
+
* Two execution paths exist on purpose:
|
|
20
|
+
* - {@link executePlan} / {@link executeRaw} — async, used for real network
|
|
21
|
+
* clients; may return a {@link ResponseStream} and may await async commands.
|
|
22
|
+
* - {@link executePlanSync} — synchronous mirror used by the Lua runtime, where
|
|
23
|
+
* `redis.call` must complete in a single tick. Streams and promises are
|
|
24
|
+
* rejected rather than awaited.
|
|
25
|
+
*
|
|
26
|
+
* The executor is stateless per-call: all mutable state lives on the
|
|
27
|
+
* {@link RedisExecutionContext} (and the session it carries).
|
|
28
|
+
*/
|
|
8
29
|
class CommandExecutor {
|
|
9
30
|
registry;
|
|
10
31
|
policies;
|
|
@@ -18,28 +39,74 @@ class CommandExecutor {
|
|
|
18
39
|
getCommandDefinitions() {
|
|
19
40
|
return this.registry.getAll();
|
|
20
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a raw command + args into a {@link CommandPlan} without executing it.
|
|
44
|
+
* The command name is matched case-insensitively against the registry.
|
|
45
|
+
*
|
|
46
|
+
* @throws {UnknownRedisCommandError} if no command is registered under the name.
|
|
47
|
+
*/
|
|
21
48
|
plan(rawCommand, rawArgs) {
|
|
22
|
-
const commandName =
|
|
23
|
-
? rawCommand.toLowerCase()
|
|
24
|
-
: rawCommand.toString().toLowerCase();
|
|
49
|
+
const commandName = CommandExecutor.normalizeCommandName(rawCommand);
|
|
25
50
|
const definition = this.registry.get(commandName);
|
|
26
51
|
if (!definition) {
|
|
27
52
|
throw new redis_error_1.UnknownRedisCommandError(rawCommand, rawArgs);
|
|
28
53
|
}
|
|
29
54
|
return this.createPlan(definition, rawArgs);
|
|
30
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Plan and execute a raw command in one step — the normal entry point for a
|
|
58
|
+
* network client.
|
|
59
|
+
*
|
|
60
|
+
* Errors thrown during *planning* (unknown command, arity/parse failures) are
|
|
61
|
+
* caught here and converted into a RESP error reply. Such a failure also marks
|
|
62
|
+
* any open MULTI transaction dirty so a later EXEC is aborted, matching Redis:
|
|
63
|
+
* a command that cannot even be parsed must not silently vanish from the queue.
|
|
64
|
+
* Execution-time errors are handled inside {@link executePlan}.
|
|
65
|
+
*/
|
|
31
66
|
async executeRaw(rawCommand, rawArgs, ctx) {
|
|
32
67
|
try {
|
|
33
68
|
return await this.executePlan(this.plan(rawCommand, rawArgs), ctx);
|
|
34
69
|
}
|
|
35
70
|
catch (err) {
|
|
36
71
|
if (err instanceof redis_error_1.RedisCommandError) {
|
|
72
|
+
// EXEC itself with bad arity (e.g. `EXEC foo`) discards the
|
|
73
|
+
// transaction immediately and replies EXECABORT, matching Redis'
|
|
74
|
+
// execCommandAbort — distinct from a *queued* command's arity error,
|
|
75
|
+
// which only dirties the transaction for a later, well-formed EXEC.
|
|
76
|
+
if (err instanceof redis_error_1.WrongNumberOfArgumentsError &&
|
|
77
|
+
ctx.session.mode === 'transaction' &&
|
|
78
|
+
CommandExecutor.normalizeCommandName(rawCommand) === 'exec') {
|
|
79
|
+
ctx.session.discardTransaction();
|
|
80
|
+
const abortError = new redis_error_1.ExecCommandAbortError(err.message);
|
|
81
|
+
return redis_result_1.RedisResult.error(abortError.message, abortError.code);
|
|
82
|
+
}
|
|
37
83
|
ctx.session.markTransactionDirty();
|
|
38
84
|
return redis_result_1.RedisResult.error(err.message, err.code);
|
|
39
85
|
}
|
|
40
86
|
throw err;
|
|
41
87
|
}
|
|
42
88
|
}
|
|
89
|
+
static normalizeCommandName(rawCommand) {
|
|
90
|
+
return typeof rawCommand === 'string'
|
|
91
|
+
? rawCommand.toLowerCase()
|
|
92
|
+
: rawCommand.toString().toLowerCase();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Run a pre-built plan through the full async pipeline.
|
|
96
|
+
*
|
|
97
|
+
* Order of operations:
|
|
98
|
+
* 1. `beforeExecute` for each policy. The first policy that returns a result
|
|
99
|
+
* short-circuits execution (e.g. the transaction policy queues the command
|
|
100
|
+
* and returns "+QUEUED"; the cluster policy returns a MOVED/CROSSSLOT
|
|
101
|
+
* error). A short-circuit error during MULTI also dirties the transaction.
|
|
102
|
+
* 2. The command's own `execute`.
|
|
103
|
+
* 3. If a {@link ResponseStream} is produced, run it through every policy's
|
|
104
|
+
* `onStream` hook; otherwise await the value and run it through every
|
|
105
|
+
* `afterExecute` hook (each may replace the result).
|
|
106
|
+
*
|
|
107
|
+
* Execution-time {@link RedisCommandError}s become RESP error replies (and
|
|
108
|
+
* dirty an open transaction when appropriate). Non-Redis errors propagate.
|
|
109
|
+
*/
|
|
43
110
|
async executePlan(plan, ctx) {
|
|
44
111
|
try {
|
|
45
112
|
for (const policy of this.policies) {
|
|
@@ -79,6 +146,20 @@ class CommandExecutor {
|
|
|
79
146
|
throw err;
|
|
80
147
|
}
|
|
81
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Synchronous counterpart to {@link executePlan}, used by the Lua runtime for
|
|
151
|
+
* `redis.call` / `redis.pcall`. Lua expects each nested command to resolve
|
|
152
|
+
* immediately, so anything that would require awaiting — a command that
|
|
153
|
+
* returns a promise, a {@link ResponseStream}, or an async policy hook — is
|
|
154
|
+
* rejected with a {@link RedisCommandError} instead of being awaited. Async
|
|
155
|
+
* command definitions are rejected before invocation so they cannot leave
|
|
156
|
+
* orphaned work running after the script error (see
|
|
157
|
+
* {@link assertSyncCommandDefinition}, {@link assertSyncCommandResult}, and
|
|
158
|
+
* {@link assertSyncPolicyResult}).
|
|
159
|
+
*
|
|
160
|
+
* The policy chain and transaction-dirty handling otherwise mirror the async
|
|
161
|
+
* path exactly.
|
|
162
|
+
*/
|
|
82
163
|
executePlanSync(plan, ctx) {
|
|
83
164
|
try {
|
|
84
165
|
for (const policy of this.policies) {
|
|
@@ -90,6 +171,7 @@ class CommandExecutor {
|
|
|
90
171
|
return policyResult;
|
|
91
172
|
}
|
|
92
173
|
}
|
|
174
|
+
assertSyncCommandDefinition(plan);
|
|
93
175
|
const rawResult = plan.definition.execute(plan.args, ctx);
|
|
94
176
|
const result = assertSyncCommandResult(plan, rawResult);
|
|
95
177
|
let finalResult = result;
|
|
@@ -109,6 +191,12 @@ class CommandExecutor {
|
|
|
109
191
|
throw err;
|
|
110
192
|
}
|
|
111
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Build a {@link CommandPlan} from a resolved definition: parse the raw buffers
|
|
196
|
+
* against the command's schema (may throw arity/type errors) and extract the
|
|
197
|
+
* routing keys used for cluster slot validation. Flags are copied onto the plan
|
|
198
|
+
* so policies can inspect them without re-resolving the definition.
|
|
199
|
+
*/
|
|
112
200
|
createPlan(definition, rawArgs) {
|
|
113
201
|
const args = (0, command_schema_1.parseCommandArgs)(definition.schema, rawArgs, definition.name);
|
|
114
202
|
const keys = definition.keys(args);
|
|
@@ -121,6 +209,13 @@ class CommandExecutor {
|
|
|
121
209
|
}
|
|
122
210
|
}
|
|
123
211
|
exports.CommandExecutor = CommandExecutor;
|
|
212
|
+
/**
|
|
213
|
+
* A policy's `onStream` hook may return an object that is both a
|
|
214
|
+
* {@link ResponseStream} and thenable (e.g. an async wrapper). Callers `await`
|
|
215
|
+
* the executor result, and awaiting a thenable stream would unwrap it into its
|
|
216
|
+
* resolved value, breaking streaming. This re-wraps such a stream in a plain,
|
|
217
|
+
* non-thenable object so it survives the surrounding `await` untouched.
|
|
218
|
+
*/
|
|
124
219
|
function ensureNonThenableStream(stream) {
|
|
125
220
|
if (!('then' in stream)) {
|
|
126
221
|
return stream;
|
|
@@ -134,6 +229,12 @@ function ensureNonThenableStream(stream) {
|
|
|
134
229
|
close: reason => stream.close(reason),
|
|
135
230
|
};
|
|
136
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* Guard for the synchronous (Lua) path: a command's result must be a ready
|
|
234
|
+
* {@link RedisResult}. Streaming commands and async commands are not callable
|
|
235
|
+
* from scripts, so a stream is closed and both cases are surfaced as a
|
|
236
|
+
* script-facing {@link RedisCommandError}.
|
|
237
|
+
*/
|
|
137
238
|
function assertSyncCommandResult(plan, result) {
|
|
138
239
|
if ((0, response_stream_1.isResponseStream)(result)) {
|
|
139
240
|
result.close('Lua redis.call cannot run streaming commands');
|
|
@@ -144,6 +245,17 @@ function assertSyncCommandResult(plan, result) {
|
|
|
144
245
|
}
|
|
145
246
|
return result;
|
|
146
247
|
}
|
|
248
|
+
function assertSyncCommandDefinition(plan) {
|
|
249
|
+
if (!isAsyncFunction(plan.definition.execute)) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
throw new redis_error_1.RedisCommandError(`${plan.definition.name.toUpperCase()} cannot run asynchronously from scripts`);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Same idea as {@link assertSyncCommandResult} but for policy hooks: an async
|
|
256
|
+
* hook result cannot be awaited on the Lua path, so it is rejected with a
|
|
257
|
+
* descriptive {@link RedisCommandError} naming the offending policy and hook.
|
|
258
|
+
*/
|
|
147
259
|
function assertSyncPolicyResult(policyName, hookName, value) {
|
|
148
260
|
if (isThenable(value)) {
|
|
149
261
|
throw new redis_error_1.RedisCommandError(`Execution policy '${policyName}' ${hookName} hook cannot run asynchronously from scripts`);
|
|
@@ -159,9 +271,24 @@ function isThenable(value) {
|
|
|
159
271
|
}
|
|
160
272
|
return typeof value.then === 'function';
|
|
161
273
|
}
|
|
274
|
+
function isAsyncFunction(value) {
|
|
275
|
+
return (typeof value === 'function' && value.constructor?.name === 'AsyncFunction');
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* True when a policy short-circuit returned an error while queuing a command in
|
|
279
|
+
* MULTI — i.e. the command was rejected at queue time. Redis aborts the whole
|
|
280
|
+
* transaction on EXEC in that case, so the session must be marked dirty.
|
|
281
|
+
*/
|
|
162
282
|
function isTransactionQueueError(plan, ctx, result) {
|
|
163
283
|
return shouldDirtyTransaction(plan, ctx) && result.value.kind === 'error';
|
|
164
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Whether an error on this plan should dirty the current transaction.
|
|
287
|
+
*
|
|
288
|
+
* Only meaningful while the session is in `transaction` mode. Commands flagged
|
|
289
|
+
* `transaction` are the control commands themselves (MULTI/EXEC/DISCARD/WATCH);
|
|
290
|
+
* their errors must not abort the transaction, so they are excluded.
|
|
291
|
+
*/
|
|
165
292
|
function shouldDirtyTransaction(plan, ctx) {
|
|
166
293
|
return (ctx.session.mode === 'transaction' && !plan.flags.includes('transaction'));
|
|
167
294
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/core/command-executor.ts"],"names":[],"mappings":";;;AAEA,qDAAmD;AAEnD,+
|
|
1
|
+
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/core/command-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,9 @@ type SchemaShape = Record<string, CommandSchema<unknown>>;
|
|
|
13
13
|
type InferShape<TShape extends SchemaShape> = {
|
|
14
14
|
[K in keyof TShape]: InferSchema<TShape[K]>;
|
|
15
15
|
};
|
|
16
|
+
export declare class SchemaMismatchError extends Error {
|
|
17
|
+
constructor();
|
|
18
|
+
}
|
|
16
19
|
export declare function parseCommandArgs<TArgs>(schema: CommandSchema<TArgs>, input: readonly Buffer[], commandName: string): TArgs;
|
|
17
20
|
export declare const t: {
|
|
18
21
|
custom<TValue>(parse: CommandSchema<TValue>["parse"]): CommandSchema<TValue>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-schema.d.ts","sourceRoot":"","sources":["../../src/core/command-schema.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,MAAM,IAAI;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,WAAW,aAAa,CAAC,MAAM;IACnC,KAAK,CACH,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,YAAY,GAChB,eAAe,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,MAAM,MAAM,WAAW,CAAC,OAAO,IAC7B,OAAO,SAAS,aAAa,CAAC,MAAM,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAA;AAE9D,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;AAEzD,KAAK,UAAU,CAAC,MAAM,SAAS,WAAW,IAAI;KAC3C,CAAC,IAAI,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAC5C,CAAA;
|
|
1
|
+
{"version":3,"file":"command-schema.d.ts","sourceRoot":"","sources":["../../src/core/command-schema.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,MAAM,IAAI;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,WAAW,aAAa,CAAC,MAAM;IACnC,KAAK,CACH,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,YAAY,GAChB,eAAe,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,MAAM,MAAM,WAAW,CAAC,OAAO,IAC7B,OAAO,SAAS,aAAa,CAAC,MAAM,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAA;AAE9D,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;AAEzD,KAAK,UAAU,CAAC,MAAM,SAAS,WAAW,IAAI;KAC3C,CAAC,IAAI,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAC5C,CAAA;AAQD,qBAAa,mBAAoB,SAAQ,KAAK;;CAI7C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EACpC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,EAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,WAAW,EAAE,MAAM,GAClB,KAAK,CAmBP;AAqBD,eAAO,MAAM,CAAC;WACL,MAAM,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;WAIrE,aAAa,CAAC,MAAM,CAAC;YAIpB,aAAa,CAAC,MAAM,CAAC;cAOnB,aAAa,CAAC,MAAM,CAAC;sBAOb;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC,MAAM,CAAC;yBAwBnD;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC,MAAM,CAAC;aAqBlE,aAAa,CAAC,MAAM,CAAC;YAWtB,QAAQ,SAAS,MAAM,YACnB,QAAQ,GACjB,aAAa,CAAC,QAAQ,CAAC;aAWjB,MAAM,UACL,aAAa,CAAC,MAAM,CAAC,GAC5B,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC;aAkB3B,MAAM,UACL,aAAa,CAAC,MAAM,CAAC,YACnB;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACzB,aAAa,CAAC,MAAM,EAAE,CAAC;WAqBnB,MAAM,SAAS,WAAW,SACxB,MAAM,GACZ,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;UAkB9B,MAAM,WACD,SAAS,aAAa,CAAC,MAAM,CAAC,EAAE,GACxC,aAAa,CAAC,MAAM,CAAC;CAyBzB,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.t = void 0;
|
|
3
|
+
exports.t = exports.SchemaMismatchError = void 0;
|
|
4
4
|
exports.parseCommandArgs = parseCommandArgs;
|
|
5
5
|
const redis_error_1 = require("./redis-error");
|
|
6
6
|
class MissingInputError extends Error {
|
|
@@ -13,6 +13,7 @@ class SchemaMismatchError extends Error {
|
|
|
13
13
|
super('schema mismatch');
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
+
exports.SchemaMismatchError = SchemaMismatchError;
|
|
16
17
|
function parseCommandArgs(schema, input, commandName) {
|
|
17
18
|
try {
|
|
18
19
|
const result = schema.parse(input, 0, { commandName });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-schema.js","sourceRoot":"","sources":["../../src/core/command-schema.ts"],"names":[],"mappings":";;;AA8CA,4CAuBC;AArED,+CAMsB;AA4BtB,MAAM,iBAAkB,SAAQ,KAAK;IACnC;QACE,KAAK,CAAC,eAAe,CAAC,CAAA;IACxB,CAAC;CACF;AAED,
|
|
1
|
+
{"version":3,"file":"command-schema.js","sourceRoot":"","sources":["../../src/core/command-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecutionPolicy } from './index';
|
|
2
|
+
/**
|
|
3
|
+
* Enforces `requirepass`: when the server is password-protected and the session
|
|
4
|
+
* has not yet authenticated, every command outside {@link NO_AUTH_COMMANDS} is
|
|
5
|
+
* short-circuited with `-NOAUTH Authentication required.`. When no password is
|
|
6
|
+
* configured the policy is a no-op, so the default `nopass` user can run
|
|
7
|
+
* anything.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createAuthPolicy(): ExecutionPolicy;
|
|
10
|
+
//# sourceMappingURL=auth-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-policy.d.ts","sourceRoot":"","sources":["../../../src/core/execution-policies/auth-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAa9C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAoBlD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthPolicy = createAuthPolicy;
|
|
4
|
+
const redis_error_1 = require("../redis-error");
|
|
5
|
+
const redis_result_1 = require("../redis-result");
|
|
6
|
+
/**
|
|
7
|
+
* Commands a client may issue before authenticating on a password-protected
|
|
8
|
+
* server. Mirrors Redis' `no-auth` command flag: AUTH/HELLO let the client
|
|
9
|
+
* authenticate, RESET clears connection state, QUIT closes the connection.
|
|
10
|
+
* Everything else (including PING) is rejected with NOAUTH until the client
|
|
11
|
+
* authenticates.
|
|
12
|
+
*/
|
|
13
|
+
const NO_AUTH_COMMANDS = new Set(['auth', 'hello', 'reset', 'quit']);
|
|
14
|
+
/**
|
|
15
|
+
* Enforces `requirepass`: when the server is password-protected and the session
|
|
16
|
+
* has not yet authenticated, every command outside {@link NO_AUTH_COMMANDS} is
|
|
17
|
+
* short-circuited with `-NOAUTH Authentication required.`. When no password is
|
|
18
|
+
* configured the policy is a no-op, so the default `nopass` user can run
|
|
19
|
+
* anything.
|
|
20
|
+
*/
|
|
21
|
+
function createAuthPolicy() {
|
|
22
|
+
return {
|
|
23
|
+
name: 'auth',
|
|
24
|
+
beforeExecute(plan, ctx) {
|
|
25
|
+
if (!ctx.server.requirepass) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (ctx.session.isAuthenticated) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (NO_AUTH_COMMANDS.has(plan.definition.name)) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const error = new redis_error_1.NoAuthError();
|
|
35
|
+
return redis_result_1.RedisResult.error(error.message, error.code);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=auth-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-policy.js","sourceRoot":"","sources":["../../../src/core/execution-policies/auth-policy.ts"],"names":[],"mappings":";;AAoBA,4CAoBC;AAvCD,gDAA4C;AAC5C,kDAA6C;AAE7C;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAEpE;;;;;;GAMG;AACH,SAAgB,gBAAgB;IAC9B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,aAAa,CAAC,IAAI,EAAE,GAAG;YACrB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5B,OAAM;YACR,CAAC;YAED,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAChC,OAAM;YACR,CAAC;YAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,OAAM;YACR,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,yBAAW,EAAE,CAAA;YAC/B,OAAO,0BAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACrD,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-policy.d.ts","sourceRoot":"","sources":["../../../src/core/execution-policies/cluster-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAQ9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC,CAAA;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,eAAe,
|
|
1
|
+
{"version":3,"file":"cluster-policy.d.ts","sourceRoot":"","sources":["../../../src/core/execution-policies/cluster-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAQ9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC,CAAA;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,eAAe,CA6DjB"}
|
|
@@ -26,7 +26,9 @@ function createClusterPolicy(options) {
|
|
|
26
26
|
(plan.definition.name === 'exec' || plan.definition.name === 'discard')) {
|
|
27
27
|
transactionSlots.delete(ctx.session);
|
|
28
28
|
}
|
|
29
|
-
const slot = validateClusterSlot(topology, options.localNodeId, plan.keys
|
|
29
|
+
const slot = validateClusterSlot(topology, options.localNodeId, plan.keys, {
|
|
30
|
+
allowReplicaRead: ctx.session.clusterReadOnly && plan.flags.includes('readonly'),
|
|
31
|
+
});
|
|
30
32
|
if (slot === null || ctx.session.mode !== 'transaction') {
|
|
31
33
|
return;
|
|
32
34
|
}
|
|
@@ -41,7 +43,7 @@ function createClusterPolicy(options) {
|
|
|
41
43
|
},
|
|
42
44
|
};
|
|
43
45
|
}
|
|
44
|
-
function validateClusterSlot(topology, localNodeId, keys) {
|
|
46
|
+
function validateClusterSlot(topology, localNodeId, keys, options = {}) {
|
|
45
47
|
const slot = topology.calculateSlotForKeys(keys);
|
|
46
48
|
if (slot === null) {
|
|
47
49
|
return null;
|
|
@@ -52,6 +54,10 @@ function validateClusterSlot(topology, localNodeId, keys) {
|
|
|
52
54
|
if (topology.nodeOwnsSlot(localNodeId, slot)) {
|
|
53
55
|
return slot;
|
|
54
56
|
}
|
|
57
|
+
if (options.allowReplicaRead &&
|
|
58
|
+
topology.nodeCanServeReadonlySlot(localNodeId, slot)) {
|
|
59
|
+
return slot;
|
|
60
|
+
}
|
|
55
61
|
const owner = topology.getSlotOwner(slot);
|
|
56
62
|
if (!owner) {
|
|
57
63
|
throw new redis_error_1.RedisClusterDownError(slot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-policy.js","sourceRoot":"","sources":["../../../src/core/execution-policies/cluster-policy.ts"],"names":[],"mappings":";;AAeA,
|
|
1
|
+
{"version":3,"file":"cluster-policy.js","sourceRoot":"","sources":["../../../src/core/execution-policies/cluster-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export interface ExecutionPolicy {
|
|
|
11
11
|
onStream?(plan: CommandPlan, ctx: RedisExecutionContext, stream: ResponseStream): MaybePromise<ResponseStream | void>;
|
|
12
12
|
}
|
|
13
13
|
export { createTransactionPolicy } from './transaction-policy';
|
|
14
|
+
export { createAuthPolicy } from './auth-policy';
|
|
14
15
|
export type { ClusterPolicyOptions } from './cluster-policy';
|
|
15
16
|
export { createClusterPolicy } from './cluster-policy';
|
|
16
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/execution-policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,IAAI,CAAA;AAC7C,MAAM,MAAM,YAAY,CAAC,MAAM,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAE3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,aAAa,CAAC,CACZ,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,GACzB,YAAY,CAAC,YAAY,CAAC,CAAA;IAE7B,YAAY,CAAC,CACX,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,EAC1B,MAAM,EAAE,WAAW,GAClB,YAAY,CAAC,WAAW,CAAC,CAAA;IAE5B,QAAQ,CAAC,CACP,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,EAC1B,MAAM,EAAE,cAAc,GACrB,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;CACvC;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/execution-policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,IAAI,CAAA;AAC7C,MAAM,MAAM,YAAY,CAAC,MAAM,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAE3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,aAAa,CAAC,CACZ,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,GACzB,YAAY,CAAC,YAAY,CAAC,CAAA;IAE7B,YAAY,CAAC,CACX,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,EAC1B,MAAM,EAAE,WAAW,GAClB,YAAY,CAAC,WAAW,CAAC,CAAA;IAE5B,QAAQ,CAAC,CACP,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,EAC1B,MAAM,EAAE,cAAc,GACrB,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;CACvC;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createClusterPolicy = exports.createTransactionPolicy = void 0;
|
|
3
|
+
exports.createClusterPolicy = exports.createAuthPolicy = exports.createTransactionPolicy = void 0;
|
|
4
4
|
var transaction_policy_1 = require("./transaction-policy");
|
|
5
5
|
Object.defineProperty(exports, "createTransactionPolicy", { enumerable: true, get: function () { return transaction_policy_1.createTransactionPolicy; } });
|
|
6
|
+
var auth_policy_1 = require("./auth-policy");
|
|
7
|
+
Object.defineProperty(exports, "createAuthPolicy", { enumerable: true, get: function () { return auth_policy_1.createAuthPolicy; } });
|
|
6
8
|
var cluster_policy_1 = require("./cluster-policy");
|
|
7
9
|
Object.defineProperty(exports, "createClusterPolicy", { enumerable: true, get: function () { return cluster_policy_1.createClusterPolicy; } });
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/execution-policies/index.ts"],"names":[],"mappings":";;;AA6BA,2DAA8D;AAArD,6HAAA,uBAAuB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/execution-policies/index.ts"],"names":[],"mappings":";;;AA6BA,2DAA8D;AAArD,6HAAA,uBAAuB,OAAA;AAChC,6CAAgD;AAAvC,+GAAA,gBAAgB,OAAA;AAEzB,mDAAsD;AAA7C,qHAAA,mBAAmB,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-policy.d.ts","sourceRoot":"","sources":["../../../src/core/execution-policies/transaction-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9C,wBAAgB,uBAAuB,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"transaction-policy.d.ts","sourceRoot":"","sources":["../../../src/core/execution-policies/transaction-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9C,wBAAgB,uBAAuB,IAAI,eAAe,CAgBzD"}
|
|
@@ -13,10 +13,6 @@ function createTransactionPolicy() {
|
|
|
13
13
|
if (plan.flags.includes('transaction')) {
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
|
-
if (plan.definition.capabilities?.pushOnly) {
|
|
17
|
-
ctx.session.markTransactionDirty();
|
|
18
|
-
return redis_result_1.RedisResult.error(`${plan.definition.name.toUpperCase()} is not allowed in transactions`);
|
|
19
|
-
}
|
|
20
16
|
ctx.session.queueTransaction(plan);
|
|
21
17
|
return redis_result_1.RedisResult.create(redis_value_1.RedisValue.simpleString('QUEUED'));
|
|
22
18
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-policy.js","sourceRoot":"","sources":["../../../src/core/execution-policies/transaction-policy.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"transaction-policy.js","sourceRoot":"","sources":["../../../src/core/execution-policies/transaction-policy.ts"],"names":[],"mappings":";;AAIA,0DAgBC;AAnBD,kDAA6C;AAC7C,gDAA2C;AAE3C,SAAgB,uBAAuB;IACrC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,aAAa,CAAC,IAAI,EAAE,GAAG;YACrB,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACvC,OAAM;YACR,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBACvC,OAAM;YACR,CAAC;YAED,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;YAClC,OAAO,0BAAW,CAAC,MAAM,CAAC,wBAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC9D,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -6,7 +6,7 @@ export declare class RedisLuaRuntime {
|
|
|
6
6
|
private readonly hostState;
|
|
7
7
|
private readonly engine;
|
|
8
8
|
constructor(module: LuaWasmModule);
|
|
9
|
-
eval(script: Buffer, keys: readonly Buffer[], args: readonly Buffer[], ctx: RedisExecutionContext
|
|
9
|
+
eval(script: Buffer, keys: readonly Buffer[], args: readonly Buffer[], ctx: RedisExecutionContext): ReplyValue;
|
|
10
10
|
private runRedisCommand;
|
|
11
11
|
}
|
|
12
12
|
export declare function getDefaultRedisLuaRuntime(): Promise<RedisLuaRuntime>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lua-runtime.d.ts","sourceRoot":"","sources":["../../src/core/lua-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"lua-runtime.d.ts","sourceRoot":"","sources":["../../src/core/lua-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAA;AASvB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAM1C,MAAM,MAAM,aAAa,GAAG,UAAU,CAAA;AAEtC,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEtB,MAAM,EAAE,aAAa;IAQjC,IAAI,CACF,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,qBAAqB,GACzB,UAAU;IAiBb,OAAO,CAAC,eAAe;CAgCxB;AAID,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,eAAe,CAAC,CAG1E;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,CAGtE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CA6BlE"}
|
package/dist/core/lua-runtime.js
CHANGED
|
@@ -8,7 +8,7 @@ const lua_redis_wasm_1 = require("lua-redis-wasm");
|
|
|
8
8
|
const redis_error_1 = require("./redis-error");
|
|
9
9
|
const redis_value_1 = require("./redis-value");
|
|
10
10
|
class RedisLuaRuntime {
|
|
11
|
-
hostState = { ctx: null
|
|
11
|
+
hostState = { ctx: null };
|
|
12
12
|
engine;
|
|
13
13
|
constructor(module) {
|
|
14
14
|
this.engine = module.create({
|
|
@@ -17,20 +17,21 @@ class RedisLuaRuntime {
|
|
|
17
17
|
log: () => { },
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
|
-
eval(script, keys, args, ctx
|
|
20
|
+
eval(script, keys, args, ctx) {
|
|
21
21
|
if (this.hostState.ctx) {
|
|
22
22
|
throw new redis_error_1.RedisCommandError('Lua runtime is already executing a script');
|
|
23
23
|
}
|
|
24
24
|
this.hostState.ctx = ctx;
|
|
25
|
-
this.hostState.sha = sha;
|
|
26
25
|
try {
|
|
27
26
|
return this.engine.evalWithArgs(script, [...keys], [...args]);
|
|
28
27
|
}
|
|
29
28
|
finally {
|
|
30
29
|
this.hostState.ctx = null;
|
|
31
|
-
this.hostState.sha = '';
|
|
32
30
|
}
|
|
33
31
|
}
|
|
32
|
+
// Host callback for redis.call()/redis.pcall(). Both modes share the same
|
|
33
|
+
// dispatch: the engine decides whether an error aborts the script (call) or is
|
|
34
|
+
// returned as a value (pcall) and decorates it with the script sha accordingly.
|
|
34
35
|
runRedisCommand(args) {
|
|
35
36
|
const ctx = this.hostState.ctx;
|
|
36
37
|
if (!ctx) {
|
|
@@ -45,7 +46,7 @@ class RedisLuaRuntime {
|
|
|
45
46
|
}
|
|
46
47
|
catch (err) {
|
|
47
48
|
if (err instanceof redis_error_1.UnknownRedisCommandError) {
|
|
48
|
-
return redisErrorToLuaReply(new redis_error_1.ScriptUnknownCommandError(
|
|
49
|
+
return redisErrorToLuaReply(new redis_error_1.ScriptUnknownCommandError());
|
|
49
50
|
}
|
|
50
51
|
if (err instanceof redis_error_1.RedisCommandError) {
|
|
51
52
|
return redisErrorToLuaReply(err);
|
|
@@ -53,10 +54,10 @@ class RedisLuaRuntime {
|
|
|
53
54
|
throw err;
|
|
54
55
|
}
|
|
55
56
|
if (plan.flags.includes('noscript')) {
|
|
56
|
-
return redisErrorToLuaReply(new redis_error_1.
|
|
57
|
+
return redisErrorToLuaReply(new redis_error_1.ScriptNotAllowedCommandError());
|
|
57
58
|
}
|
|
58
59
|
const result = ctx.executor.executePlanSync(plan, ctx);
|
|
59
|
-
return redisValueToLuaReply(result.value);
|
|
60
|
+
return redisValueToLuaReply(normalizeScriptCommandValue(result.value));
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
exports.RedisLuaRuntime = RedisLuaRuntime;
|
|
@@ -86,7 +87,7 @@ function luaReplyToRedisValue(value) {
|
|
|
86
87
|
return redis_value_1.RedisValue.simpleString(value.ok.toString());
|
|
87
88
|
}
|
|
88
89
|
if ('err' in value) {
|
|
89
|
-
return
|
|
90
|
+
return redis_value_1.RedisValue.error(value.err.toString(), value.code?.toString() ?? 'ERR');
|
|
90
91
|
}
|
|
91
92
|
return redis_value_1.RedisValue.bulkString(Buffer.from(String(value)));
|
|
92
93
|
}
|
|
@@ -115,6 +116,11 @@ function redisValueToLuaReply(value) {
|
|
|
115
116
|
redisValueToLuaReply(key),
|
|
116
117
|
redisValueToLuaReply(entryValue),
|
|
117
118
|
]);
|
|
119
|
+
case 'map-pairs':
|
|
120
|
+
return value.entries.map(([key, entryValue]) => [
|
|
121
|
+
redisValueToLuaReply(key),
|
|
122
|
+
redisValueToLuaReply(entryValue),
|
|
123
|
+
]);
|
|
118
124
|
case 'push':
|
|
119
125
|
return [Buffer.from(value.name), ...value.items.map(redisValueToLuaReply)];
|
|
120
126
|
case 'null':
|
|
@@ -122,36 +128,25 @@ function redisValueToLuaReply(value) {
|
|
|
122
128
|
return null;
|
|
123
129
|
case 'error':
|
|
124
130
|
return {
|
|
125
|
-
err: Buffer.from(
|
|
131
|
+
err: Buffer.from(value.message),
|
|
132
|
+
code: value.code ? Buffer.from(value.code) : undefined,
|
|
126
133
|
};
|
|
127
134
|
}
|
|
128
135
|
}
|
|
136
|
+
// A command run from a script cannot redirect the client, so a MOVED reply is
|
|
137
|
+
// surfaced to the script as a generic error instead of a cluster redirect.
|
|
138
|
+
function normalizeScriptCommandValue(value) {
|
|
139
|
+
if (value.kind === 'error' && value.code === 'MOVED') {
|
|
140
|
+
return redis_value_1.RedisValue.error('Script attempted to access a non local key in a cluster node', 'ERR');
|
|
141
|
+
}
|
|
142
|
+
return value;
|
|
143
|
+
}
|
|
129
144
|
function redisErrorToLuaReply(err) {
|
|
130
145
|
return {
|
|
131
|
-
err: Buffer.from(
|
|
146
|
+
err: Buffer.from(err.message),
|
|
147
|
+
code: Buffer.from(err.code),
|
|
132
148
|
};
|
|
133
149
|
}
|
|
134
|
-
function luaErrorToRedisValue(message) {
|
|
135
|
-
const match = /^([A-Z][A-Z0-9]*) (.+)$/.exec(message);
|
|
136
|
-
if (!match) {
|
|
137
|
-
return redis_value_1.RedisValue.error(message, 'ERR');
|
|
138
|
-
}
|
|
139
|
-
return redis_value_1.RedisValue.error(match[2], match[1]);
|
|
140
|
-
}
|
|
141
|
-
function formatRedisErrorValue(value) {
|
|
142
|
-
return formatRedisError(value.message, value.code);
|
|
143
|
-
}
|
|
144
|
-
function formatRedisError(message, code) {
|
|
145
|
-
const sanitizedMessage = sanitizeErrorText(message);
|
|
146
|
-
if (!code) {
|
|
147
|
-
return sanitizedMessage;
|
|
148
|
-
}
|
|
149
|
-
const sanitizedCode = sanitizeErrorText(code);
|
|
150
|
-
if (sanitizedMessage.startsWith(`${sanitizedCode} `)) {
|
|
151
|
-
return sanitizedMessage;
|
|
152
|
-
}
|
|
153
|
-
return `${sanitizedCode} ${sanitizedMessage}`;
|
|
154
|
-
}
|
|
155
150
|
function formatNumber(value) {
|
|
156
151
|
if (Number.isNaN(value)) {
|
|
157
152
|
return 'nan';
|
|
@@ -167,7 +162,4 @@ function formatNumber(value) {
|
|
|
167
162
|
}
|
|
168
163
|
return value.toString();
|
|
169
164
|
}
|
|
170
|
-
function sanitizeErrorText(value) {
|
|
171
|
-
return value.replace(/[\r\n]+/g, ' ');
|
|
172
|
-
}
|
|
173
165
|
//# sourceMappingURL=lua-runtime.js.map
|