"use strict";
/*!
 * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
 * Licensed under the MIT License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeMessageCodecs = exports.makeMessageCodec = void 0;
const typebox_1 = require("@sinclair/typebox");
const index_js_1 = require("../codec/index.js");
const messageFormat_js_1 = require("./messageFormat.js");
function makeMessageCodec(changeCodecs, revisionTagCodec, options, writeVersion) {
    const family = makeMessageCodecs(changeCodecs, revisionTagCodec, options);
    return (0, index_js_1.makeVersionDispatchingCodec)(family, { ...options, writeVersion });
}
exports.makeMessageCodec = makeMessageCodec;
/**
 * @privateRemarks - Exported for testing.
 */
function makeMessageCodecs(changeCodecs, revisionTagCodec, options) {
    const v1Codec = makeV1Codec(changeCodecs.resolve(0).json, revisionTagCodec, options);
    return (0, index_js_1.makeCodecFamily)([
        // Back-compat: messages weren't always written with an explicit version field.
        [undefined, v1Codec],
        [1, v1Codec],
    ]);
}
exports.makeMessageCodecs = makeMessageCodecs;
function makeV1Codec(changeCodec, revisionTagCodec, options) {
    return (0, index_js_1.withSchemaValidation)((0, messageFormat_js_1.Message)(changeCodec.encodedSchema ?? typebox_1.Type.Any()), {
        encode: ({ commit, sessionId: originatorId }, context) => {
            const message = {
                revision: revisionTagCodec.encode(commit.revision, { originatorId }),
                originatorId,
                changeset: changeCodec.encode(commit.change, {
                    originatorId,
                    schema: context.schema,
                }),
                version: 1,
            };
            return message;
        },
        decode: (encoded) => {
            const { revision, originatorId, changeset } = encoded;
            return {
                commit: {
                    revision: revisionTagCodec.decode(revision, { originatorId }),
                    change: changeCodec.decode(changeset, { originatorId }),
                },
                sessionId: originatorId,
            };
        },
    }, options.jsonValidator);
}
//# sourceMappingURL=messageCodecs.js.map