@kurrent/kurrentdb-client
Version:
KurrentDB gRPC NodeJS Client SDK
131 lines • 5.47 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.append = void 0;
const streams_pb_1 = require("../../../generated/streams_pb");
const shared_pb_1 = require("../../../generated/shared_pb");
const streams_grpc_pb_1 = require("../../../generated/streams_grpc_pb");
const utils_1 = require("../../utils");
const append = async function (streamName, events, { streamState, ...baseOptions }) {
const header = new streams_pb_1.AppendReq();
const options = new streams_pb_1.AppendReq.Options();
const identifier = (0, utils_1.createStreamIdentifier)(streamName);
options.setStreamIdentifier(identifier);
switch (streamState) {
case "any": {
options.setAny(new shared_pb_1.Empty());
break;
}
case "no_stream": {
options.setNoStream(new shared_pb_1.Empty());
break;
}
case "stream_exists": {
options.setStreamExists(new shared_pb_1.Empty());
break;
}
default: {
options.setRevision(streamState.toString(10));
break;
}
}
header.setOptions(options);
utils_1.debug.command("appendToStream: %O", {
streamName,
events,
options: { streamState: streamState, ...baseOptions },
});
utils_1.debug.command_grpc("appendToStream: %g", header);
return this.execute(streams_grpc_pb_1.StreamsClient, "appendToStream", (client) => new Promise(async (resolve, reject) => {
const sink = client.append(...this.callArguments(baseOptions), (error, resp) => {
if (error != null) {
return reject((0, utils_1.convertToCommandError)(error));
}
if (resp.hasWrongExpectedVersion()) {
const grpcError = resp.getWrongExpectedVersion();
let expected = "any";
switch (true) {
case grpcError.hasExpectedRevision(): {
expected = BigInt(grpcError.getExpectedRevision());
break;
}
case grpcError.hasExpectedStreamExists(): {
expected = "stream_exists";
break;
}
case grpcError.hasExpectedNoStream(): {
expected = "no_stream";
break;
}
}
if (this.throwOnAppendFailure) {
return reject(new utils_1.WrongExpectedVersionError(null, {
streamName: streamName,
current: grpcError.hasCurrentRevision()
? BigInt(grpcError.getCurrentRevision())
: "no_stream",
expected,
}));
}
const nextExpectedRevision = grpcError.hasCurrentRevision()
? BigInt(grpcError.getCurrentRevision())
: BigInt(-1);
return resolve({
success: false,
nextExpectedRevision,
position: undefined,
});
}
if (resp.hasSuccess()) {
const success = resp.getSuccess();
const nextExpectedRevision = BigInt(success.getCurrentRevision());
const grpcPosition = success.getPosition();
const position = grpcPosition
? {
commit: BigInt(grpcPosition.getCommitPosition()),
prepare: BigInt(grpcPosition.getPreparePosition()),
}
: undefined;
return resolve({
success: true,
nextExpectedRevision,
position,
});
}
});
sink.on("error", (err) => reject(err));
await (0, utils_1.backpressuredWrite)(sink, header);
for (const event of events) {
const entry = new streams_pb_1.AppendReq();
const message = new streams_pb_1.AppendReq.ProposedMessage();
const id = (0, utils_1.createUUID)(event.id);
message.setId(id);
message.getMetadataMap().set("type", event.type);
message.getMetadataMap().set("content-type", event.contentType);
switch (event.contentType) {
case "application/json": {
const data = JSON.stringify(event.data);
message.setData(Buffer.from(data, "utf8").toString("base64"));
break;
}
case "application/octet-stream": {
message.setData(event.data);
break;
}
}
if (event.metadata) {
if (event.metadata.constructor === Uint8Array) {
message.setCustomMetadata(event.metadata);
}
else {
const metadata = JSON.stringify(event.metadata);
message.setCustomMetadata(Buffer.from(metadata, "utf8").toString("base64"));
}
}
entry.setProposedMessage(message);
await (0, utils_1.backpressuredWrite)(sink, entry);
}
sink.end();
}));
};
exports.append = append;
//# sourceMappingURL=append.js.map