convex
Version:
Client for the Convex Cloud
85 lines (84 loc) • 2.61 kB
JavaScript
;
import { convexToJson, jsonToConvex } from "../../values/index.js";
import { createError, logToConsole } from "../logging.js";
export class MutationManager {
constructor() {
this.inflightMutations = /* @__PURE__ */ new Map();
}
request(udfPath, args, mutationId) {
const message = {
type: "Mutation",
mutationId,
udfPath,
args: convexToJson(args)
};
const result = new Promise((resolve, reject) => {
this.inflightMutations.set(mutationId, {
message,
status: { status: "Requested", onResult: resolve, onFailure: reject }
});
});
return { message, result };
}
onResponse(response) {
const mutationInfo = this.inflightMutations.get(response.mutationId);
if (mutationInfo === void 0) {
return null;
}
if (mutationInfo.status.status === "Requested") {
const udfPath = mutationInfo.message.udfPath;
for (const line of response.logLines) {
logToConsole("info", "mutation", udfPath, line);
}
if (response.success) {
const status = mutationInfo.status;
const onResult = () => status.onResult(jsonToConvex(response.result));
mutationInfo.status = {
status: "Committed",
ts: response.ts,
onResult
};
return null;
} else {
this.inflightMutations.delete(response.mutationId);
logToConsole("error", "mutation", udfPath, response.result);
mutationInfo.status.onFailure(
createError("mutation", udfPath, response.result)
);
return response.mutationId;
}
}
return null;
}
removeCompletedMutations(ts) {
const completeMutations = /* @__PURE__ */ new Set();
for (const [mutationId, mutationInfo] of this.inflightMutations.entries()) {
const status = mutationInfo.status;
if (status.status == "Committed" && status.ts.lessThanOrEqual(ts)) {
status.onResult();
completeMutations.add(mutationId);
this.inflightMutations.delete(mutationId);
}
}
return completeMutations;
}
hasUncommittedMutations() {
for (const mutationInfo of this.inflightMutations.values()) {
if (mutationInfo.status.status === "Requested") {
return true;
}
}
return false;
}
restart() {
const allMessages = [];
for (const value of this.inflightMutations.values()) {
allMessages.push(value.message);
}
return allMessages;
}
hasInflightMutation() {
return this.inflightMutations.size > 0;
}
}
//# sourceMappingURL=mutation_manager.js.map