convex
Version:
Client for the Convex Cloud
149 lines (148 loc) • 4.35 kB
JavaScript
import chalk from "chalk";
import util from "util";
import ws from "ws";
import { ConvexHttpClient } from "../../browser/http_client-node.js";
import { BaseConvexClient } from "../../browser/index.js";
import { makeFunctionReference } from "../../server/index.js";
import { convexToJson } from "../../values/value.js";
import {
logError,
logFailure,
logFinishedStep,
logMessage,
logOutput
} from "../../bundler/context.js";
import { waitForever, waitUntilCalled } from "./utils.js";
export async function runFunctionAndLog(ctx, deploymentUrl, adminKey, functionName, args, callbacks) {
const client = new ConvexHttpClient(deploymentUrl);
client.setAdminAuth(adminKey);
let result;
try {
result = await client.function(makeFunctionReference(functionName), args);
} catch (err) {
logFailure(ctx, `Failed to run function "${functionName}":`);
logError(ctx, chalk.red(err.toString().trim()));
return await ctx.crash(1, "invalid filesystem or env vars");
}
callbacks?.onSuccess?.();
if (result !== null) {
logOutput(ctx, formatValue(result));
}
}
export async function runPaginatedQuery(ctx, deploymentUrl, adminKey, functionName, args, limit) {
const results = [];
let cursor = null;
let isDone = false;
while (!isDone && (limit === void 0 || results.length < limit)) {
const paginationResult = await runQuery(
ctx,
deploymentUrl,
adminKey,
functionName,
{
...args,
// The pagination is limited on the backend, so the 10000
// means "give me as many as possible".
paginationOpts: {
cursor,
numItems: limit === void 0 ? 1e4 : limit - results.length
}
}
);
isDone = paginationResult.isDone;
cursor = paginationResult.continueCursor;
results.push(...paginationResult.page);
}
return results;
}
export async function runQuery(ctx, deploymentUrl, adminKey, functionName, args) {
const client = new ConvexHttpClient(deploymentUrl);
client.setAdminAuth(adminKey);
try {
return await client.query(
makeFunctionReference(functionName),
args
);
} catch (err) {
logFailure(ctx, `Failed to run query "${functionName}":`);
logError(ctx, chalk.red(err.toString().trim()));
return await ctx.crash(1, "invalid filesystem or env vars");
}
}
export function formatValue(value) {
const json = convexToJson(value);
if (process.stdout.isTTY) {
return util.inspect(value, { colors: true, depth: null });
} else {
return JSON.stringify(json, null, 2);
}
}
export async function subscribeAndLog(ctx, deploymentUrl, adminKey, functionName, args) {
return subscribe(
ctx,
deploymentUrl,
adminKey,
functionName,
args,
waitForever(),
{
onStart() {
logFinishedStep(
ctx,
`Watching query ${functionName} on ${deploymentUrl}...`
);
},
onChange(result) {
logOutput(ctx, formatValue(result));
},
onStop() {
logMessage(ctx, `Closing connection to ${deploymentUrl}...`);
}
}
);
}
export async function subscribe(ctx, deploymentUrl, adminKey, functionName, args, until, callbacks) {
const client = new BaseConvexClient(
deploymentUrl,
(updatedQueries) => {
for (const queryToken of updatedQueries) {
callbacks?.onChange?.(client.localQueryResultByToken(queryToken));
}
},
{
// pretend that a Node.js 'ws' library WebSocket is a browser WebSocket
webSocketConstructor: ws,
unsavedChangesWarning: false
}
);
client.setAdminAuth(adminKey);
const { unsubscribe } = client.subscribe(functionName, args);
callbacks?.onStart?.();
let done = false;
const [donePromise, onDone] = waitUntilCalled();
const stopWatching = () => {
if (done) {
return;
}
done = true;
unsubscribe();
void client.close();
process.off("SIGINT", sigintListener);
onDone();
callbacks?.onStop?.();
};
function sigintListener() {
stopWatching();
}
process.on("SIGINT", sigintListener);
void until.finally(stopWatching);
while (!done) {
const oneDay = 24 * 60 * 60 * 1e3;
await Promise.race([
donePromise,
new Promise((resolve) => setTimeout(resolve, oneDay))
]);
}
}
//# sourceMappingURL=run.js.map
;