@aptpod/iscp-ts
Version:
iSCP 2.0 client library for TypeScript
523 lines (522 loc) • 29.1 kB
JavaScript
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var _Downstream_instances, _Downstream_logger, _Downstream_ackInterval, _Downstream_omitEmptyChunk, _Downstream_streamIdAlias, _Downstream_qos, _Downstream_expiryInterval, _Downstream_filters, _Downstream_id, _Downstream_serverTime, _Downstream_dataIdAliasMap, _Downstream_upstreamInfoAliasMap, _Downstream_ackIdSequence, _Downstream_dataIdAliasSequence, _Downstream_upstreamInfoAliasSequence, _Downstream_isClosedResolver, _Downstream_isDrainingResolver, _Downstream_ackMetadataRequestIds, _Downstream_ackChunkResults, _Downstream_ackUpstreamInfoMap, _Downstream_ackDataIdAliasMap, _Downstream_resumeRequester, _Downstream_closeRequester, _Downstream_chunkAckSender, _Downstream_metadataAckSender, _Downstream_messageChunkIterator, _Downstream_messageChunkAckCompleteIterator, _Downstream_messageMetadataIterator, _Downstream_reopenIterator, _Downstream_abortController, _Downstream_modelChunkEvent, _Downstream_modelMetadataEvent, _Downstream_closedEvent, _Downstream_closeLock, _Downstream_start, _Downstream_readChunkLoop, _Downstream_readMetadataLoop, _Downstream_readReopen, _Downstream_readChunkAckComplete, _Downstream_flushAckLoop, _Downstream_close;
import AwaitLock from 'await-lock';
import { ISCPException } from './exceptions';
import { DataId, UpstreamInfo, DataFilter, DownstreamFilter, DownstreamChunkAck, DownstreamChunkAckExtensionFields, RESULT_CODE, DownstreamChunkResult, DownstreamChunkResultExtensionFields, DownstreamResumeRequest, DownstreamResumeRequestExtensionFields, DownstreamCloseRequest, DownstreamCloseRequestExtensionFields, DownstreamMetadataAck, DownstreamMetadataAckExtensionFields, } from './message';
import { DownstreamChunk as Model$DownstreamChunk, DownstreamMetadata as Model$DownstreamMetadata, DataPointGroup as Model$DataPointGroup, DownstreamState, } from './model';
import { Resolver } from './utils/resolver';
import { Sequence } from './sequence';
import { Ticker } from './utils/ticker';
import { LOGGER_TAG } from './constant';
import { TypedEvent } from './utils/typed-event';
import { AliasMap } from './utils/alias-map';
import { ISCPFailedMessageError, ISCPReconnectingError } from './exceptions/exceptions';
/**
* ダウンストリームを閉じた時のイベントです。
* @category Downstream
*/
export class DownstreamClosedEvent {
constructor(init) {
this.state = init.state;
this.error = init.error;
}
}
/**
* ダウンストリームを表すクラスです。
*
* @attention このクラスのオブジェクトは、必ず{@link Conn}の{@link Conn.openDownstream}を使用して生成してください。
*
* @category Downstream
*
* @example
* ```ts
* const example = async () => {
* const conn = await Conn.connect(...)
* const downstream = conn.openDownstream(...)
* try
* // ...
* finally {
* await downstream.close()
* }
* }
* ```
*/
export class Downstream {
/**
* @internal
*/
static async start(config) {
const downstream = new Downstream(config);
await __classPrivateFieldGet(downstream, _Downstream_instances, "m", _Downstream_start).call(downstream);
return downstream;
}
/**
* @internal
*/
constructor(config) {
_Downstream_instances.add(this);
_Downstream_logger.set(this, void 0);
_Downstream_ackInterval.set(this, void 0);
_Downstream_omitEmptyChunk.set(this, void 0);
_Downstream_streamIdAlias.set(this, void 0);
_Downstream_qos.set(this, void 0);
_Downstream_expiryInterval.set(this, void 0);
_Downstream_filters.set(this, void 0);
_Downstream_id.set(this, void 0);
_Downstream_serverTime.set(this, void 0);
_Downstream_dataIdAliasMap.set(this, void 0);
_Downstream_upstreamInfoAliasMap.set(this, void 0);
_Downstream_ackIdSequence.set(this, void 0);
_Downstream_dataIdAliasSequence.set(this, void 0);
_Downstream_upstreamInfoAliasSequence.set(this, void 0);
_Downstream_isClosedResolver.set(this, void 0);
_Downstream_isDrainingResolver.set(this, void 0);
_Downstream_ackMetadataRequestIds.set(this, void 0);
_Downstream_ackChunkResults.set(this, void 0);
_Downstream_ackUpstreamInfoMap.set(this, void 0);
_Downstream_ackDataIdAliasMap.set(this, void 0);
_Downstream_resumeRequester.set(this, void 0);
_Downstream_closeRequester.set(this, void 0);
_Downstream_chunkAckSender.set(this, void 0);
_Downstream_metadataAckSender.set(this, void 0);
_Downstream_messageChunkIterator.set(this, void 0);
_Downstream_messageChunkAckCompleteIterator.set(this, void 0);
_Downstream_messageMetadataIterator.set(this, void 0);
_Downstream_reopenIterator.set(this, void 0);
_Downstream_abortController.set(this, void 0);
_Downstream_modelChunkEvent.set(this, void 0);
_Downstream_modelMetadataEvent.set(this, void 0);
_Downstream_closedEvent.set(this, void 0);
_Downstream_closeLock.set(this, void 0);
// Logger
__classPrivateFieldSet(this, _Downstream_logger, config.logger, "f");
// Config
__classPrivateFieldSet(this, _Downstream_ackInterval, config.ackInterval, "f");
__classPrivateFieldSet(this, _Downstream_omitEmptyChunk, config.omitEmptyChunk, "f");
// From DownstreamOpenRequest
__classPrivateFieldSet(this, _Downstream_streamIdAlias, config.idAlias, "f");
__classPrivateFieldSet(this, _Downstream_qos, config.qos, "f");
__classPrivateFieldSet(this, _Downstream_expiryInterval, config.expiryInterval, "f");
__classPrivateFieldSet(this, _Downstream_filters, config.filters, "f");
// From DownstreamOpenResponse
__classPrivateFieldSet(this, _Downstream_id, config.id, "f");
__classPrivateFieldSet(this, _Downstream_serverTime, config.serverTime, "f");
// State
__classPrivateFieldSet(this, _Downstream_dataIdAliasMap, AliasMap.fromAliases(config.dataIdAliases ?? {}), "f");
__classPrivateFieldSet(this, _Downstream_upstreamInfoAliasMap, AliasMap.fromAliases({}), "f");
// Sequences
__classPrivateFieldSet(this, _Downstream_ackIdSequence, Sequence.forAckId(), "f");
__classPrivateFieldSet(this, _Downstream_dataIdAliasSequence, config.dataIdAliasSequence ?? Sequence.forDataIdAlias(), "f");
__classPrivateFieldSet(this, _Downstream_upstreamInfoAliasSequence, Sequence.forDataIdAlias(), "f");
// status
__classPrivateFieldSet(this, _Downstream_isClosedResolver, new Resolver(), "f");
__classPrivateFieldSet(this, _Downstream_isDrainingResolver, new Resolver(), "f");
// ack
__classPrivateFieldSet(this, _Downstream_ackMetadataRequestIds, [], "f");
__classPrivateFieldSet(this, _Downstream_ackChunkResults, [], "f");
__classPrivateFieldSet(this, _Downstream_ackUpstreamInfoMap, new Map(), "f");
__classPrivateFieldSet(this, _Downstream_ackDataIdAliasMap, new Map(), "f");
// requester & sender
__classPrivateFieldSet(this, _Downstream_resumeRequester, config.resumeRequester, "f");
__classPrivateFieldSet(this, _Downstream_closeRequester, config.closeRequester, "f");
__classPrivateFieldSet(this, _Downstream_chunkAckSender, config.chunkAckSender, "f");
__classPrivateFieldSet(this, _Downstream_metadataAckSender, config.metadataAckSender, "f");
__classPrivateFieldSet(this, _Downstream_reopenIterator, config.reopenIterator, "f");
// message iterator
__classPrivateFieldSet(this, _Downstream_messageChunkIterator, config.chunkIterator, "f");
__classPrivateFieldSet(this, _Downstream_messageChunkAckCompleteIterator, config.chunkAckCompleteIterator, "f");
__classPrivateFieldSet(this, _Downstream_messageMetadataIterator, config.metadataIterator, "f");
__classPrivateFieldSet(this, _Downstream_abortController, new AbortController(), "f");
__classPrivateFieldSet(this, _Downstream_modelChunkEvent, new TypedEvent(), "f");
__classPrivateFieldSet(this, _Downstream_modelMetadataEvent, new TypedEvent(), "f");
__classPrivateFieldSet(this, _Downstream_closedEvent, new TypedEvent(), "f");
__classPrivateFieldSet(this, _Downstream_closeLock, new AwaitLock(), "f");
}
/**
* ストリームIDを取得します。
* @returns ストリームID
*/
get id() {
return __classPrivateFieldGet(this, _Downstream_id, "f");
}
/**
* ダウンストリームを開いた時のサーバー時刻(ナノ秒)を取得します。
* @returns ダウンストリームを開いた時のサーバー時刻(ナノ秒)
*/
get serverTime() {
return __classPrivateFieldGet(this, _Downstream_serverTime, "f");
}
/**
* 有効期限を取得します。
* @returns ストリームの有効期限(秒)
*/
get expiryInterval() {
return __classPrivateFieldGet(this, _Downstream_expiryInterval, "f");
}
/**
* QoSを取得します。
* @returns QoS
*/
get qos() {
return __classPrivateFieldGet(this, _Downstream_qos, "f");
}
/**
* Ack返却間隔(秒)を取得します。
* @returns Ack返却間隔(秒)
*/
get ackInterval() {
return __classPrivateFieldGet(this, _Downstream_ackInterval, "f");
}
/**
* 空チャンク省略フラグを取得します。
*/
get omitEmptyChunk() {
return __classPrivateFieldGet(this, _Downstream_omitEmptyChunk, "f");
}
/**
* ダウンストリームフィルタのリストを取得します。
* @returns ダウンストリームフィルタのリスト
*/
get filters() {
return __classPrivateFieldGet(this, _Downstream_filters, "f").map((filter) => {
return new DownstreamFilter({
sourceNodeId: filter.sourceNodeId,
dataFilters: filter.dataFilters.map((dataFilter) => {
return new DataFilter({
name: dataFilter.name,
type: dataFilter.type,
});
}),
});
});
}
/**
* ストリームの状態を取得します。
* @returns ダウンストリームの状態
*/
get state() {
return new DownstreamState({
dataIdAliases: __classPrivateFieldGet(this, _Downstream_dataIdAliasMap, "f").toAliases(),
upstreamInfos: __classPrivateFieldGet(this, _Downstream_upstreamInfoAliasMap, "f").toAliases(),
lastIssuedDataIdAlias: __classPrivateFieldGet(this, _Downstream_dataIdAliasSequence, "f").current,
lastIssuedUpstreamInfoAlias: __classPrivateFieldGet(this, _Downstream_upstreamInfoAliasSequence, "f").current,
lastIssuedAckId: __classPrivateFieldGet(this, _Downstream_ackIdSequence, "f").current,
});
}
/**
* ダウンストリームが閉じるまで待機します。
*/
async waitClosed() {
await __classPrivateFieldGet(this, _Downstream_isClosedResolver, "f").wait();
}
/**
* ダウンストリームを閉じます。
*/
async close() {
await __classPrivateFieldGet(this, _Downstream_instances, "m", _Downstream_close).call(this);
}
addEventListener(name, listener, options) {
switch (name) {
case Downstream.EVENT.CHUNK:
options?.once ? __classPrivateFieldGet(this, _Downstream_modelChunkEvent, "f").once(listener) : __classPrivateFieldGet(this, _Downstream_modelChunkEvent, "f").on(listener);
return;
case Downstream.EVENT.METADATA:
options?.once ? __classPrivateFieldGet(this, _Downstream_modelMetadataEvent, "f").once(listener) : __classPrivateFieldGet(this, _Downstream_modelMetadataEvent, "f").on(listener);
return;
case Downstream.EVENT.CLOSED:
options?.once ? __classPrivateFieldGet(this, _Downstream_closedEvent, "f").once(listener) : __classPrivateFieldGet(this, _Downstream_closedEvent, "f").on(listener);
return;
default:
throw new ISCPException('Unrecognized EventName.');
}
}
removeEventListener(name, listener) {
switch (name) {
case Downstream.EVENT.CHUNK:
__classPrivateFieldGet(this, _Downstream_modelChunkEvent, "f").off(listener);
return;
case Downstream.EVENT.METADATA:
__classPrivateFieldGet(this, _Downstream_modelMetadataEvent, "f").off(listener);
return;
case Downstream.EVENT.CLOSED:
__classPrivateFieldGet(this, _Downstream_closedEvent, "f").off(listener);
return;
default:
throw new ISCPException('Unrecognized EventName.');
}
}
}
_Downstream_logger = new WeakMap(), _Downstream_ackInterval = new WeakMap(), _Downstream_omitEmptyChunk = new WeakMap(), _Downstream_streamIdAlias = new WeakMap(), _Downstream_qos = new WeakMap(), _Downstream_expiryInterval = new WeakMap(), _Downstream_filters = new WeakMap(), _Downstream_id = new WeakMap(), _Downstream_serverTime = new WeakMap(), _Downstream_dataIdAliasMap = new WeakMap(), _Downstream_upstreamInfoAliasMap = new WeakMap(), _Downstream_ackIdSequence = new WeakMap(), _Downstream_dataIdAliasSequence = new WeakMap(), _Downstream_upstreamInfoAliasSequence = new WeakMap(), _Downstream_isClosedResolver = new WeakMap(), _Downstream_isDrainingResolver = new WeakMap(), _Downstream_ackMetadataRequestIds = new WeakMap(), _Downstream_ackChunkResults = new WeakMap(), _Downstream_ackUpstreamInfoMap = new WeakMap(), _Downstream_ackDataIdAliasMap = new WeakMap(), _Downstream_resumeRequester = new WeakMap(), _Downstream_closeRequester = new WeakMap(), _Downstream_chunkAckSender = new WeakMap(), _Downstream_metadataAckSender = new WeakMap(), _Downstream_messageChunkIterator = new WeakMap(), _Downstream_messageChunkAckCompleteIterator = new WeakMap(), _Downstream_messageMetadataIterator = new WeakMap(), _Downstream_reopenIterator = new WeakMap(), _Downstream_abortController = new WeakMap(), _Downstream_modelChunkEvent = new WeakMap(), _Downstream_modelMetadataEvent = new WeakMap(), _Downstream_closedEvent = new WeakMap(), _Downstream_closeLock = new WeakMap(), _Downstream_instances = new WeakSet(), _Downstream_start = async function _Downstream_start() {
Promise.all([
__classPrivateFieldGet(this, _Downstream_instances, "m", _Downstream_flushAckLoop).call(this, __classPrivateFieldGet(this, _Downstream_abortController, "f").signal),
__classPrivateFieldGet(this, _Downstream_instances, "m", _Downstream_readChunkLoop).call(this),
__classPrivateFieldGet(this, _Downstream_instances, "m", _Downstream_readChunkAckComplete).call(this),
__classPrivateFieldGet(this, _Downstream_instances, "m", _Downstream_readMetadataLoop).call(this),
__classPrivateFieldGet(this, _Downstream_instances, "m", _Downstream_readReopen).call(this),
]).catch((error) => {
const overwriteError = error instanceof Error ? error : new Error(String(error));
__classPrivateFieldGet(this, _Downstream_instances, "m", _Downstream_close).call(this, {
overwriteError,
});
});
}, _Downstream_readChunkLoop = async function _Downstream_readChunkLoop() {
for await (const messageChunk of __classPrivateFieldGet(this, _Downstream_messageChunkIterator, "f")) {
registerWithUpstreamAliases({
upstreamOrAlias: messageChunk.upstreamOrAlias,
upstreamInfoAliasMap: __classPrivateFieldGet(this, _Downstream_upstreamInfoAliasMap, "f"),
ackUpstreamInfoAliases: __classPrivateFieldGet(this, _Downstream_ackUpstreamInfoMap, "f"),
issueAlias: __classPrivateFieldGet(this, _Downstream_upstreamInfoAliasSequence, "f").next.bind(__classPrivateFieldGet(this, _Downstream_upstreamInfoAliasSequence, "f")),
});
const upstreamInfo = getUpstreamInfo({
upstreamOrAlias: messageChunk.upstreamOrAlias,
upstreamInfoAliasMap: __classPrivateFieldGet(this, _Downstream_upstreamInfoAliasMap, "f"),
});
__classPrivateFieldGet(this, _Downstream_ackChunkResults, "f").push(new DownstreamChunkResult({
resultCode: RESULT_CODE.SUCCEEDED,
resultString: 'OK',
sequenceNumberInUpstream: messageChunk.streamChunk.sequenceNumber,
streamIdOfUpstream: upstreamInfo?.streamId,
extensionFields: new DownstreamChunkResultExtensionFields(),
}));
const modelDataPointGroups = messageChunk.streamChunk.dataPointGroups.map((group) => {
registerWithDataIdAliases({
dataIdOrAlias: group.dataIdOrAlias,
dataIdAliasMap: __classPrivateFieldGet(this, _Downstream_dataIdAliasMap, "f"),
ackDataIdAliases: __classPrivateFieldGet(this, _Downstream_ackDataIdAliasMap, "f"),
issueAlias: __classPrivateFieldGet(this, _Downstream_dataIdAliasSequence, "f").next.bind(__classPrivateFieldGet(this, _Downstream_dataIdAliasSequence, "f")),
});
const dataId = getDataId({
dataIdOrAlias: group.dataIdOrAlias,
dataIdAliasMap: __classPrivateFieldGet(this, _Downstream_dataIdAliasMap, "f"),
});
return new Model$DataPointGroup({
dataId,
dataPoints: group.dataPoints,
});
});
const modelChunk = new Model$DownstreamChunk({
upstreamInfo,
sequenceNumber: messageChunk.streamChunk.sequenceNumber,
dataPointGroups: modelDataPointGroups,
});
__classPrivateFieldGet(this, _Downstream_modelChunkEvent, "f").emit(modelChunk);
}
}, _Downstream_readMetadataLoop = async function _Downstream_readMetadataLoop() {
for await (const messageMetadata of __classPrivateFieldGet(this, _Downstream_messageMetadataIterator, "f")) {
/*
const metadataAck = new DownstreamMetadataAck({
requestId: messageMetadata.requestId,
resultCode: RESULT_CODE.SUCCEEDED,
resultString: 'OK',
extensionFields: new DownstreamMetadataAckExtensionFields(),
})
// await this.#metadataAckSender(metadataAck)
*/
__classPrivateFieldGet(this, _Downstream_ackMetadataRequestIds, "f").push(messageMetadata.requestId);
const modelMetadata = new Model$DownstreamMetadata({
sourceNodeId: messageMetadata.sourceNodeId,
metadata: messageMetadata.metadata,
});
__classPrivateFieldGet(this, _Downstream_modelMetadataEvent, "f").emit(modelMetadata);
}
}, _Downstream_readReopen = async function _Downstream_readReopen() {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
for await (const _ of __classPrivateFieldGet(this, _Downstream_reopenIterator, "f")) {
const response = await __classPrivateFieldGet(this, _Downstream_resumeRequester, "f").call(this, new DownstreamResumeRequest({
requestId: 0,
streamId: __classPrivateFieldGet(this, _Downstream_id, "f"),
desiredStreamIdAlias: __classPrivateFieldGet(this, _Downstream_streamIdAlias, "f"),
extensionFields: new DownstreamResumeRequestExtensionFields(),
}));
if (response.resultCode !== RESULT_CODE.SUCCEEDED) {
throw new ISCPFailedMessageError(response);
}
}
}, _Downstream_readChunkAckComplete = async function _Downstream_readChunkAckComplete() {
for await (const message of __classPrivateFieldGet(this, _Downstream_messageChunkAckCompleteIterator, "f")) {
if (message.resultCode !== RESULT_CODE.SUCCEEDED) {
__classPrivateFieldGet(this, _Downstream_logger, "f").warn(LOGGER_TAG.DOWNSTREAM, `code[${message.resultCode}],message,[${message.resultString}]`);
}
}
}, _Downstream_flushAckLoop = async function _Downstream_flushAckLoop(signal) {
const ticker = Ticker.of({
delayMs: __classPrivateFieldGet(this, _Downstream_ackInterval, "f") * 1e3,
signal,
});
const chunkAckQueue = [];
const metadataAckQueue = [];
// eslint-disable-next-line @typescript-eslint/no-unused-vars
for await (const _ of ticker) {
for (const requestId of __classPrivateFieldGet(this, _Downstream_ackMetadataRequestIds, "f")) {
const metadataAck = new DownstreamMetadataAck({
requestId,
resultCode: RESULT_CODE.SUCCEEDED,
resultString: 'OK',
extensionFields: new DownstreamMetadataAckExtensionFields(),
});
metadataAckQueue.push(metadataAck);
}
__classPrivateFieldSet(this, _Downstream_ackMetadataRequestIds, [], "f");
if (__classPrivateFieldGet(this, _Downstream_ackChunkResults, "f").length > 0) {
const chunkAck = new DownstreamChunkAck({
ackId: __classPrivateFieldGet(this, _Downstream_ackIdSequence, "f").next(),
streamIdAlias: __classPrivateFieldGet(this, _Downstream_streamIdAlias, "f"),
results: __classPrivateFieldGet(this, _Downstream_ackChunkResults, "f"),
upstreamAliases: Object.fromEntries(__classPrivateFieldGet(this, _Downstream_ackUpstreamInfoMap, "f")),
dataIdAliases: Object.fromEntries(__classPrivateFieldGet(this, _Downstream_ackDataIdAliasMap, "f")),
extensionFields: new DownstreamChunkAckExtensionFields(),
});
chunkAckQueue.push(chunkAck);
__classPrivateFieldSet(this, _Downstream_ackChunkResults, [], "f");
__classPrivateFieldGet(this, _Downstream_ackUpstreamInfoMap, "f").clear();
__classPrivateFieldGet(this, _Downstream_ackDataIdAliasMap, "f").clear();
}
try {
for (;;) {
if (metadataAckQueue.length === 0) {
break;
}
const metadataAck = metadataAckQueue[0];
await __classPrivateFieldGet(this, _Downstream_metadataAckSender, "f").call(this, metadataAck);
metadataAckQueue.shift();
}
}
catch (error) {
if (error instanceof ISCPReconnectingError) {
__classPrivateFieldGet(this, _Downstream_logger, "f").warn(LOGGER_TAG.DOWNSTREAM, `failed to send metadata ack. stream_id [${__classPrivateFieldGet(this, _Downstream_id, "f")}]`, error);
continue;
}
throw error;
}
try {
for (;;) {
if (chunkAckQueue.length === 0) {
break;
}
const chunkAck = chunkAckQueue[0];
await __classPrivateFieldGet(this, _Downstream_chunkAckSender, "f").call(this, chunkAck);
chunkAckQueue.shift();
}
}
catch (error) {
if (error instanceof ISCPReconnectingError) {
__classPrivateFieldGet(this, _Downstream_logger, "f").warn(LOGGER_TAG.DOWNSTREAM, `failed to send chunk ack. stream_id [${__classPrivateFieldGet(this, _Downstream_id, "f")}]`, error);
continue;
}
throw error;
}
}
}, _Downstream_close = async function _Downstream_close(config) {
const overwriteError = config?.overwriteError;
if (__classPrivateFieldGet(this, _Downstream_isClosedResolver, "f").isDone) {
return;
}
if (__classPrivateFieldGet(this, _Downstream_isDrainingResolver, "f").isDone) {
const errorMessage = 'Already draining.';
throw new ISCPException(errorMessage);
}
__classPrivateFieldGet(this, _Downstream_isDrainingResolver, "f").resolve();
try {
await __classPrivateFieldGet(this, _Downstream_closeLock, "f").acquireAsync();
if (__classPrivateFieldGet(this, _Downstream_isClosedResolver, "f").isDone) {
return;
}
__classPrivateFieldGet(this, _Downstream_abortController, "f").abort();
const response = await __classPrivateFieldGet(this, _Downstream_closeRequester, "f").call(this, new DownstreamCloseRequest({
requestId: 0,
streamId: __classPrivateFieldGet(this, _Downstream_id, "f"),
extensionFields: new DownstreamCloseRequestExtensionFields(),
}));
if (response.resultCode !== RESULT_CODE.SUCCEEDED) {
__classPrivateFieldGet(this, _Downstream_logger, "f").error(LOGGER_TAG.DOWNSTREAM, `failed to close a downstream. stream_id [${__classPrivateFieldGet(this, _Downstream_id, "f")}] code[${response.resultCode}] messge=[${response.resultString}]`);
}
__classPrivateFieldGet(this, _Downstream_closedEvent, "f").emit({
state: this.state,
error: overwriteError,
});
}
catch (error) {
__classPrivateFieldGet(this, _Downstream_closedEvent, "f").emit(new DownstreamClosedEvent({
state: this.state,
error: error instanceof Error ? error : new Error(String(error)),
}));
}
finally {
__classPrivateFieldGet(this, _Downstream_closeLock, "f").release();
__classPrivateFieldGet(this, _Downstream_isClosedResolver, "f").resolve();
__classPrivateFieldGet(this, _Downstream_modelChunkEvent, "f").dispose();
__classPrivateFieldGet(this, _Downstream_modelMetadataEvent, "f").dispose();
__classPrivateFieldGet(this, _Downstream_closedEvent, "f").dispose();
}
};
/**
* @event イベント
*/
Downstream.EVENT = {
/** ダウンストリームチャンクを受信した時に呼び出されるイベントです。 */
CHUNK: 'chunk',
/** ダウンストリームメタデータを受信した時に呼び出されるイベントです。 */
METADATA: 'metadata',
/** ダウンストリームを閉じた時に呼び出されるイベントです。 */
CLOSED: 'closed',
};
//
// Static Functions
//
const registerWithUpstreamAliases = (params) => {
const { upstreamOrAlias, upstreamInfoAliasMap, ackUpstreamInfoAliases, issueAlias } = params;
if (upstreamOrAlias instanceof UpstreamInfo) {
const info = upstreamOrAlias;
const alias = upstreamInfoAliasMap.findAlias(info);
if (typeof alias === 'undefined') {
const issuedAlias = issueAlias();
upstreamInfoAliasMap.set(issuedAlias, info);
ackUpstreamInfoAliases.set(issuedAlias, info);
}
}
};
const getUpstreamInfo = (params) => {
const { upstreamOrAlias, upstreamInfoAliasMap } = params;
if (upstreamOrAlias instanceof UpstreamInfo) {
return upstreamOrAlias;
}
const info = upstreamInfoAliasMap.get(upstreamOrAlias);
if (typeof info === 'undefined') {
throw new ISCPException('Not found UpstreamInfo.');
}
return info;
};
const registerWithDataIdAliases = (params) => {
const { dataIdOrAlias, dataIdAliasMap, ackDataIdAliases, issueAlias } = params;
if (dataIdOrAlias instanceof DataId) {
const dataId = dataIdOrAlias;
const alias = dataIdAliasMap.findAlias(dataId);
if (typeof alias === 'undefined') {
const issuedAlias = issueAlias();
dataIdAliasMap.set(issuedAlias, dataId);
ackDataIdAliases.set(issuedAlias, dataId);
}
}
};
const getDataId = (params) => {
const { dataIdOrAlias, dataIdAliasMap } = params;
if (dataIdOrAlias instanceof DataId) {
return dataIdOrAlias;
}
const dataId = dataIdAliasMap.get(dataIdOrAlias);
if (typeof dataId === 'undefined') {
throw new ISCPException('Not found DataId.');
}
return dataId;
};
//# sourceMappingURL=downstream.js.map