2 /* --------------------------------------------------------------------------------------------
3 * Copyright (c) Microsoft Corporation. All rights reserved.
4 * Licensed under the MIT License. See License.txt in the project root for license information.
5 * ------------------------------------------------------------------------------------------ */
6 Object.defineProperty(exports, "__esModule", { value: true });
7 exports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = void 0;
8 const ral_1 = require("./ral");
9 const Is = require("./is");
10 const semaphore_1 = require("./semaphore");
11 const events_1 = require("./events");
12 const ContentLength = 'Content-Length: ';
15 (function (MessageWriter) {
17 let candidate = value;
18 return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) &&
19 Is.func(candidate.onError) && Is.func(candidate.write);
21 MessageWriter.is = is;
22 })(MessageWriter = exports.MessageWriter || (exports.MessageWriter = {}));
23 class AbstractMessageWriter {
25 this.errorEmitter = new events_1.Emitter();
26 this.closeEmitter = new events_1.Emitter();
29 this.errorEmitter.dispose();
30 this.closeEmitter.dispose();
33 return this.errorEmitter.event;
35 fireError(error, message, count) {
36 this.errorEmitter.fire([this.asError(error), message, count]);
39 return this.closeEmitter.event;
42 this.closeEmitter.fire(undefined);
45 if (error instanceof Error) {
49 return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);
53 exports.AbstractMessageWriter = AbstractMessageWriter;
54 var ResolvedMessageWriterOptions;
55 (function (ResolvedMessageWriterOptions) {
56 function fromOptions(options) {
58 if (options === undefined || typeof options === 'string') {
59 return { charset: options !== null && options !== void 0 ? options : 'utf-8', contentTypeEncoder: ral_1.default().applicationJson.encoder };
62 return { charset: (_a = options.charset) !== null && _a !== void 0 ? _a : 'utf-8', contentEncoder: options.contentEncoder, contentTypeEncoder: (_b = options.contentTypeEncoder) !== null && _b !== void 0 ? _b : ral_1.default().applicationJson.encoder };
65 ResolvedMessageWriterOptions.fromOptions = fromOptions;
66 })(ResolvedMessageWriterOptions || (ResolvedMessageWriterOptions = {}));
67 class WriteableStreamMessageWriter extends AbstractMessageWriter {
68 constructor(writable, options) {
70 this.writable = writable;
71 this.options = ResolvedMessageWriterOptions.fromOptions(options);
73 this.writeSemaphore = new semaphore_1.Semaphore(1);
74 this.writable.onError((error) => this.fireError(error));
75 this.writable.onClose(() => this.fireClose());
78 return this.writeSemaphore.lock(async () => {
79 const payload = this.options.contentTypeEncoder.encode(msg, this.options).then((buffer) => {
80 if (this.options.contentEncoder !== undefined) {
81 return this.options.contentEncoder.encode(buffer);
87 return payload.then((buffer) => {
89 headers.push(ContentLength, buffer.byteLength.toString(), CRLF);
91 return this.doWrite(msg, headers, buffer);
93 this.fireError(error);
98 async doWrite(msg, headers, data) {
100 await this.writable.write(headers.join(''), 'ascii');
101 return this.writable.write(data);
104 this.handleError(error, msg);
105 return Promise.reject(error);
108 handleError(error, msg) {
110 this.fireError(error, msg, this.errorCount);
116 exports.WriteableStreamMessageWriter = WriteableStreamMessageWriter;
117 //# sourceMappingURL=messageWriter.js.map