@torrow/sdk-client 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/dist/index.d.ts +157 -52
- package/dist/index.js +416 -256
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -11,103 +11,167 @@ async function buildAuthHeaders(config) {
|
|
|
11
11
|
return headers;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
// ../../src/http/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
// ../../src/http/TorrowSdkError.ts
|
|
15
|
+
var TorrowSdkErrorCategory = /* @__PURE__ */ ((TorrowSdkErrorCategory2) => {
|
|
16
|
+
TorrowSdkErrorCategory2["InvalidInput"] = "InvalidInput";
|
|
17
|
+
TorrowSdkErrorCategory2["InvalidState"] = "InvalidState";
|
|
18
|
+
TorrowSdkErrorCategory2["AccessDenied"] = "AccessDenied";
|
|
19
|
+
TorrowSdkErrorCategory2["InsufficientData"] = "InsufficientData";
|
|
20
|
+
TorrowSdkErrorCategory2["InvalidResponse"] = "InvalidResponse";
|
|
21
|
+
TorrowSdkErrorCategory2["VersionConflict"] = "VersionConflict";
|
|
22
|
+
TorrowSdkErrorCategory2["AuthenticationRequired"] = "AuthenticationRequired";
|
|
23
|
+
TorrowSdkErrorCategory2["UnsupportedOperation"] = "UnsupportedOperation";
|
|
24
|
+
TorrowSdkErrorCategory2["RateLimited"] = "RateLimited";
|
|
25
|
+
TorrowSdkErrorCategory2["HttpFailure"] = "HttpFailure";
|
|
26
|
+
TorrowSdkErrorCategory2["TransportFailure"] = "TransportFailure";
|
|
27
|
+
TorrowSdkErrorCategory2["StorageFailure"] = "StorageFailure";
|
|
28
|
+
TorrowSdkErrorCategory2["Cancelled"] = "Cancelled";
|
|
29
|
+
TorrowSdkErrorCategory2["Unknown"] = "Unknown";
|
|
30
|
+
return TorrowSdkErrorCategory2;
|
|
31
|
+
})(TorrowSdkErrorCategory || {});
|
|
32
|
+
var TorrowSdkRequestState = /* @__PURE__ */ ((TorrowSdkRequestState2) => {
|
|
33
|
+
TorrowSdkRequestState2["NotStarted"] = "NotStarted";
|
|
34
|
+
TorrowSdkRequestState2["Started"] = "Started";
|
|
35
|
+
return TorrowSdkRequestState2;
|
|
36
|
+
})(TorrowSdkRequestState || {});
|
|
37
|
+
var TorrowSdkEffectArea = /* @__PURE__ */ ((TorrowSdkEffectArea2) => {
|
|
38
|
+
TorrowSdkEffectArea2["Remote"] = "Remote";
|
|
39
|
+
TorrowSdkEffectArea2["SessionMemory"] = "SessionMemory";
|
|
40
|
+
TorrowSdkEffectArea2["Storage"] = "Storage";
|
|
41
|
+
return TorrowSdkEffectArea2;
|
|
42
|
+
})(TorrowSdkEffectArea || {});
|
|
43
|
+
var TorrowSdkEffectState = /* @__PURE__ */ ((TorrowSdkEffectState2) => {
|
|
44
|
+
TorrowSdkEffectState2["NotApplied"] = "NotApplied";
|
|
45
|
+
TorrowSdkEffectState2["Applied"] = "Applied";
|
|
46
|
+
TorrowSdkEffectState2["Unknown"] = "Unknown";
|
|
47
|
+
return TorrowSdkEffectState2;
|
|
48
|
+
})(TorrowSdkEffectState || {});
|
|
49
|
+
var TorrowSdkErrorDomain = /* @__PURE__ */ ((TorrowSdkErrorDomain2) => {
|
|
50
|
+
TorrowSdkErrorDomain2["BehaviorSettings"] = "BehaviorSettings";
|
|
51
|
+
TorrowSdkErrorDomain2["Otp"] = "Otp";
|
|
52
|
+
TorrowSdkErrorDomain2["AuthSession"] = "AuthSession";
|
|
53
|
+
return TorrowSdkErrorDomain2;
|
|
54
|
+
})(TorrowSdkErrorDomain || {});
|
|
55
|
+
var OtpErrorReason = /* @__PURE__ */ ((OtpErrorReason2) => {
|
|
56
|
+
OtpErrorReason2["InvalidChallenge"] = "InvalidChallenge";
|
|
57
|
+
OtpErrorReason2["UnsupportedMethod"] = "UnsupportedMethod";
|
|
58
|
+
OtpErrorReason2["AuthHeaderMissing"] = "AuthHeaderMissing";
|
|
59
|
+
OtpErrorReason2["CodeRequestLimitExceeded"] = "CodeRequestLimitExceeded";
|
|
60
|
+
return OtpErrorReason2;
|
|
61
|
+
})(OtpErrorReason || {});
|
|
62
|
+
var AuthSessionErrorReason = /* @__PURE__ */ ((AuthSessionErrorReason2) => {
|
|
63
|
+
AuthSessionErrorReason2["SessionNotReady"] = "SessionNotReady";
|
|
64
|
+
AuthSessionErrorReason2["CallbackFailed"] = "CallbackFailed";
|
|
65
|
+
return AuthSessionErrorReason2;
|
|
66
|
+
})(AuthSessionErrorReason || {});
|
|
67
|
+
var BehaviorSettingsEffectStep = /* @__PURE__ */ ((BehaviorSettingsEffectStep2) => {
|
|
68
|
+
BehaviorSettingsEffectStep2["Write"] = "Write";
|
|
69
|
+
return BehaviorSettingsEffectStep2;
|
|
70
|
+
})(BehaviorSettingsEffectStep || {});
|
|
71
|
+
var AuthSessionEffectStep = /* @__PURE__ */ ((AuthSessionEffectStep2) => {
|
|
72
|
+
AuthSessionEffectStep2["CreateAuthSession"] = "CreateAuthSession";
|
|
73
|
+
AuthSessionEffectStep2["CloseSession"] = "CloseSession";
|
|
74
|
+
AuthSessionEffectStep2["IssueTokens"] = "IssueTokens";
|
|
75
|
+
AuthSessionEffectStep2["RefreshTokens"] = "RefreshTokens";
|
|
76
|
+
AuthSessionEffectStep2["RevokeTokens"] = "RevokeTokens";
|
|
77
|
+
AuthSessionEffectStep2["SendCode"] = "SendCode";
|
|
78
|
+
AuthSessionEffectStep2["SetTokens"] = "SetTokens";
|
|
79
|
+
AuthSessionEffectStep2["ClearTokens"] = "ClearTokens";
|
|
80
|
+
AuthSessionEffectStep2["SaveTokens"] = "SaveTokens";
|
|
81
|
+
AuthSessionEffectStep2["ClearStorage"] = "ClearStorage";
|
|
82
|
+
return AuthSessionEffectStep2;
|
|
83
|
+
})(AuthSessionEffectStep || {});
|
|
84
|
+
var TorrowSdkError = class _TorrowSdkError extends Error {
|
|
85
|
+
/** Общая причина отказа. */
|
|
86
|
+
category;
|
|
87
|
+
/** Безопасные метаданные ответа. */
|
|
88
|
+
http;
|
|
89
|
+
/** Неизменяемое предметное уточнение. */
|
|
90
|
+
detail;
|
|
91
|
+
/** Начало fetch; не доставка. */
|
|
92
|
+
request;
|
|
93
|
+
/** Имя составной операции без пользовательских значений. */
|
|
94
|
+
operation;
|
|
95
|
+
/** Стадия отказа без аргументов. */
|
|
96
|
+
failureAt;
|
|
97
|
+
/** Неизменяемые сведения об описанных изменениях. */
|
|
98
|
+
effects;
|
|
99
|
+
#sensitive;
|
|
100
|
+
constructor(init) {
|
|
101
|
+
super(`Torrow SDK: ${init.category}`);
|
|
102
|
+
this.name = "TorrowSdkError";
|
|
103
|
+
this.category = init.category;
|
|
104
|
+
this.http = init.http && Object.freeze({ ...init.http });
|
|
105
|
+
this.detail = init.detail && Object.freeze({ ...init.detail });
|
|
106
|
+
this.request = init.request;
|
|
107
|
+
this.operation = init.operation;
|
|
108
|
+
this.failureAt = init.failureAt;
|
|
109
|
+
this.effects = init.effects && Object.freeze(init.effects.map((effect) => Object.freeze({ ...effect })));
|
|
110
|
+
this.#sensitive = Object.freeze({ ...init.sensitive, cleanup: init.sensitive?.cleanup && Object.freeze({ ...init.sensitive.cleanup }) });
|
|
111
|
+
Object.freeze(this);
|
|
112
|
+
}
|
|
113
|
+
/** Безопасный снимок для обычной сериализации и диагностики. */
|
|
114
|
+
toJSON() {
|
|
115
|
+
return {
|
|
116
|
+
category: this.category,
|
|
117
|
+
http: this.http,
|
|
118
|
+
detail: this.detail,
|
|
119
|
+
request: this.request,
|
|
120
|
+
operation: this.operation,
|
|
121
|
+
failureAt: this.failureAt,
|
|
122
|
+
effects: this.effects
|
|
123
|
+
};
|
|
25
124
|
}
|
|
26
|
-
|
|
27
|
-
|
|
125
|
+
/** Явный доступ к секретной диагностике; вызывающий код отвечает за её защиту. */
|
|
126
|
+
getSensitiveDetails() {
|
|
127
|
+
return this.#sensitive;
|
|
28
128
|
}
|
|
29
|
-
|
|
30
|
-
|
|
129
|
+
/** Новый снимок для составной операции; исходная ошибка не изменяется. */
|
|
130
|
+
withContext(context) {
|
|
131
|
+
return new _TorrowSdkError({ ...this.toJSON(), ...context, sensitive: this.#sensitive });
|
|
31
132
|
}
|
|
32
|
-
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// ../../src/http/transport-errors.ts
|
|
136
|
+
var KnownApiErrorName = /* @__PURE__ */ ((KnownApiErrorName2) => {
|
|
137
|
+
KnownApiErrorName2["ResourceUnavailable"] = "REQUESTED_RESOURCE_IS_NOT_AVAILABLE";
|
|
138
|
+
KnownApiErrorName2["QuantityUnavailable"] = "REQUESTED_RESOURCE_QUANTITY_IS_NOT_AVAILABLE";
|
|
139
|
+
KnownApiErrorName2["ServiceUnavailableAtTime"] = "SERVICE_IS_NOT_AVAILABLE_AT_TIME";
|
|
140
|
+
KnownApiErrorName2["WrongVersion"] = "OBJECT_HAS_WRONG_VERSION";
|
|
141
|
+
KnownApiErrorName2["CodeRequestLimit"] = "CODE_REQUEST_LIMIT_EXCEEDED";
|
|
142
|
+
KnownApiErrorName2["AccessDenied"] = "ACCESS_DENIED";
|
|
143
|
+
KnownApiErrorName2["UserNoRights"] = "USER_HAVE_NO_RIGHTS_TO_ELEMENTS";
|
|
144
|
+
KnownApiErrorName2["AuthHeaderMissing"] = "AUTH_HEADER_MISSING";
|
|
145
|
+
KnownApiErrorName2["WrongSessionCode"] = "WRONG_SESSION_ACCESS_CODE";
|
|
146
|
+
KnownApiErrorName2["AttemptsExceeded"] = "EXCEEDED_ATTEMPTS_COUNT";
|
|
147
|
+
return KnownApiErrorName2;
|
|
148
|
+
})(KnownApiErrorName || {});
|
|
149
|
+
function createHttpError(init) {
|
|
150
|
+
const body = record(init.body);
|
|
151
|
+
const code = body?.code;
|
|
152
|
+
const apiCode = typeof code === "string" ? code : typeof code === "number" && Number.isFinite(code) ? String(code) : void 0;
|
|
153
|
+
const apiName = [body?.error, body?.name].find((value) => typeof value === "string" && Object.values(KnownApiErrorName).includes(value));
|
|
154
|
+
const nested = record(body?.torrowError) ?? record(body?.torrowErrorClient) ?? record(body?.innerError);
|
|
155
|
+
const trace = body?.traceIdentifier ?? nested?.traceIdentifier;
|
|
156
|
+
const http = {
|
|
157
|
+
status: init.status,
|
|
158
|
+
apiCode,
|
|
159
|
+
apiErrorName: typeof apiName === "string" ? apiName : void 0,
|
|
160
|
+
requestId: init.requestId,
|
|
161
|
+
traceIdentifier: init.traceIdentifier || (typeof trace === "string" ? trace : void 0)
|
|
162
|
+
};
|
|
163
|
+
const category = init.status === 401 ? "AuthenticationRequired" /* AuthenticationRequired */ : init.status === 403 ? "AccessDenied" /* AccessDenied */ : init.status === 429 ? "RateLimited" /* RateLimited */ : "HttpFailure" /* HttpFailure */;
|
|
164
|
+
return new TorrowSdkError({ category, http, request: "Started" /* Started */, sensitive: init });
|
|
33
165
|
}
|
|
34
|
-
function
|
|
35
|
-
|
|
36
|
-
return void 0;
|
|
37
|
-
}
|
|
38
|
-
const c = body.code;
|
|
39
|
-
if (typeof c === "string") {
|
|
40
|
-
return c;
|
|
41
|
-
}
|
|
42
|
-
return typeof c === "number" && Number.isFinite(c) ? String(c) : void 0;
|
|
166
|
+
function record(value) {
|
|
167
|
+
return value !== null && typeof value === "object" ? value : void 0;
|
|
43
168
|
}
|
|
44
|
-
function
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (typeof o.traceIdentifier === "string" && o.traceIdentifier.length > 0) {
|
|
50
|
-
return o.traceIdentifier;
|
|
51
|
-
}
|
|
52
|
-
for (const key of ["torrowError", "torrowErrorClient", "innerError"]) {
|
|
53
|
-
const nested = o[key];
|
|
54
|
-
if (nested !== null && typeof nested === "object") {
|
|
55
|
-
const t = nested.traceIdentifier;
|
|
56
|
-
if (typeof t === "string" && t.length > 0) {
|
|
57
|
-
return t;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return void 0;
|
|
169
|
+
function normalizeTransportError(cause, request, signal, url, parsing = false) {
|
|
170
|
+
if (cause instanceof TorrowSdkError) return cause;
|
|
171
|
+
const cancelled = signal?.aborted || record(cause)?.name === "AbortError";
|
|
172
|
+
const category = cancelled ? "Cancelled" /* Cancelled */ : parsing ? "InvalidResponse" /* InvalidResponse */ : request === "Started" /* Started */ && cause instanceof TypeError ? "TransportFailure" /* TransportFailure */ : "Unknown" /* Unknown */;
|
|
173
|
+
return new TorrowSdkError({ category, request, sensitive: { cause, url } });
|
|
62
174
|
}
|
|
63
|
-
var TorrowHttpError = class _TorrowHttpError extends Error {
|
|
64
|
-
status;
|
|
65
|
-
body;
|
|
66
|
-
apiErrorName;
|
|
67
|
-
/** Код ошибки API строкой: числовой `TorrowErrorClient.code` приводится к строке (`"311293"`). */
|
|
68
|
-
code;
|
|
69
|
-
requestId;
|
|
70
|
-
/**
|
|
71
|
-
* Идентификатор трассировки шлюза (`TorrowErrorClient.traceIdentifier`
|
|
72
|
-
* или заголовок `trace-identifier`) — для саппорта/логов.
|
|
73
|
-
*/
|
|
74
|
-
traceIdentifier;
|
|
75
|
-
url;
|
|
76
|
-
constructor(init) {
|
|
77
|
-
const apiName = pickApiErrorName(init.body);
|
|
78
|
-
const code = pickApiCode(init.body);
|
|
79
|
-
const traceIdentifier = (typeof init.traceIdentifier === "string" && init.traceIdentifier.length > 0 ? init.traceIdentifier : void 0) ?? pickTraceIdentifier(init.body);
|
|
80
|
-
const message = _TorrowHttpError.buildMessage(
|
|
81
|
-
init.status,
|
|
82
|
-
init.url,
|
|
83
|
-
apiName,
|
|
84
|
-
code,
|
|
85
|
-
traceIdentifier
|
|
86
|
-
);
|
|
87
|
-
super(message, { cause: init.cause });
|
|
88
|
-
this.name = "TorrowHttpError";
|
|
89
|
-
this.status = init.status;
|
|
90
|
-
this.body = init.body;
|
|
91
|
-
this.url = init.url;
|
|
92
|
-
this.requestId = init.requestId;
|
|
93
|
-
this.traceIdentifier = traceIdentifier;
|
|
94
|
-
this.apiErrorName = apiName;
|
|
95
|
-
this.code = code;
|
|
96
|
-
}
|
|
97
|
-
static buildMessage(status, url, apiErrorName, code, traceIdentifier) {
|
|
98
|
-
const parts = [`HTTP ${status}`, url];
|
|
99
|
-
if (code) {
|
|
100
|
-
parts.push(`code=${code}`);
|
|
101
|
-
}
|
|
102
|
-
if (apiErrorName) {
|
|
103
|
-
parts.push(apiErrorName);
|
|
104
|
-
}
|
|
105
|
-
if (traceIdentifier) {
|
|
106
|
-
parts.push(`trace-identifier=${traceIdentifier}`);
|
|
107
|
-
}
|
|
108
|
-
return parts.join(" \u2014 ");
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
175
|
|
|
112
176
|
// ../../src/util/json.ts
|
|
113
177
|
var ISO_DATE_REGEX = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+-])(\d{2}):(\d{2}))$/;
|
|
@@ -679,49 +743,59 @@ var HttpClient = class {
|
|
|
679
743
|
this.config = config;
|
|
680
744
|
}
|
|
681
745
|
config;
|
|
746
|
+
/** Выполняет запрос; сетевые и подготовительные отказы возвращает как TorrowSdkError. */
|
|
682
747
|
async requestJson(init, onDispatch) {
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
const
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
748
|
+
let request = "NotStarted" /* NotStarted */;
|
|
749
|
+
let url;
|
|
750
|
+
let parsing = false;
|
|
751
|
+
try {
|
|
752
|
+
const { fetch: fetchFn = globalThis.fetch } = this.config;
|
|
753
|
+
url = this.buildUrl(init.path, init.query);
|
|
754
|
+
const authHeaders = await buildAuthHeaders(this.config);
|
|
755
|
+
const headers = {
|
|
756
|
+
Accept: JSON_MIME,
|
|
757
|
+
...authHeaders,
|
|
758
|
+
...this.config.defaultHeaders,
|
|
759
|
+
...init.headers
|
|
760
|
+
};
|
|
761
|
+
if (this.config.userAgent) {
|
|
762
|
+
headers["User-Agent"] = this.config.userAgent;
|
|
763
|
+
}
|
|
764
|
+
const needsBody = init.body !== void 0 && init.method !== "GET" && init.method !== "DELETE";
|
|
765
|
+
if (needsBody) {
|
|
766
|
+
headers["Content-Type"] = JSON_MIME;
|
|
767
|
+
}
|
|
768
|
+
const requestInit = {
|
|
769
|
+
method: init.method,
|
|
770
|
+
headers,
|
|
771
|
+
body: needsBody ? stringifyJsonBody(init.body) : void 0,
|
|
772
|
+
signal: init.signal
|
|
773
|
+
};
|
|
774
|
+
init.signal?.throwIfAborted();
|
|
775
|
+
onDispatch?.();
|
|
776
|
+
request = "Started" /* Started */;
|
|
777
|
+
const res = await fetchFn(url, requestInit);
|
|
778
|
+
const requestId = res.headers.get("x-request-id") ?? void 0;
|
|
779
|
+
const traceIdentifier = res.headers.get("trace-identifier") ?? void 0;
|
|
780
|
+
const text = await res.text();
|
|
781
|
+
if (!res.ok) {
|
|
782
|
+
const errBody = tryParseErrorBody(text, res.headers.get("content-type"));
|
|
783
|
+
throw createHttpError({
|
|
784
|
+
status: res.status,
|
|
785
|
+
body: errBody,
|
|
786
|
+
url,
|
|
787
|
+
requestId,
|
|
788
|
+
traceIdentifier
|
|
789
|
+
});
|
|
790
|
+
}
|
|
791
|
+
if (text === "") {
|
|
792
|
+
return void 0;
|
|
793
|
+
}
|
|
794
|
+
parsing = true;
|
|
795
|
+
return parseOperationResponse(text, init.method, init.path, res.status);
|
|
796
|
+
} catch (cause) {
|
|
797
|
+
throw normalizeTransportError(cause, request, init.signal, url, parsing);
|
|
723
798
|
}
|
|
724
|
-
return parseOperationResponse(text, init.method, init.path, res.status);
|
|
725
799
|
}
|
|
726
800
|
buildUrl(path, query) {
|
|
727
801
|
const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;
|
|
@@ -3079,6 +3153,28 @@ var RelationsFacade = class {
|
|
|
3079
3153
|
}
|
|
3080
3154
|
};
|
|
3081
3155
|
|
|
3156
|
+
// ../../src/resources/common/behavior-settings-errors.ts
|
|
3157
|
+
function behaviorSettingsError(category) {
|
|
3158
|
+
return new TorrowSdkError({ category, detail: { domain: "BehaviorSettings" /* BehaviorSettings */ } });
|
|
3159
|
+
}
|
|
3160
|
+
function contextualizeBehaviorError(cause, operation, failureAt, state) {
|
|
3161
|
+
const error = cause instanceof TorrowSdkError ? cause : new TorrowSdkError({
|
|
3162
|
+
category: "Unknown" /* Unknown */,
|
|
3163
|
+
sensitive: { cause }
|
|
3164
|
+
});
|
|
3165
|
+
return error.withContext({
|
|
3166
|
+
operation,
|
|
3167
|
+
failureAt,
|
|
3168
|
+
detail: error.detail ?? { domain: "BehaviorSettings" /* BehaviorSettings */ },
|
|
3169
|
+
effects: state === void 0 ? void 0 : [{ area: "Remote" /* Remote */, step: "Write" /* Write */, state }]
|
|
3170
|
+
});
|
|
3171
|
+
}
|
|
3172
|
+
function isBehaviorCasRefusal(cause) {
|
|
3173
|
+
if (!(cause instanceof TorrowSdkError) || cause.request !== "Started" /* Started */ || cause.http?.status !== 500) return false;
|
|
3174
|
+
const body = cause.getSensitiveDetails().body;
|
|
3175
|
+
return body !== null && typeof body === "object" && "name" in body && body.name === "OBJECT_HAS_WRONG_VERSION" /* VersionConflict */ && "code" in body && (body.code === 208213 /* VersionConflict */ || body.code === String(208213 /* VersionConflict */));
|
|
3176
|
+
}
|
|
3177
|
+
|
|
3082
3178
|
// ../../src/resources/common/implicit-tag-params.ts
|
|
3083
3179
|
var SERVICE_IMPLICIT_TAG_SUFFIX = {
|
|
3084
3180
|
orderNameLegacy: ":ordername",
|
|
@@ -3486,39 +3582,77 @@ var ResourcesFacade = class extends TorrowItemFacade {
|
|
|
3486
3582
|
return this.getBehaviorSettingsFromResource(resource);
|
|
3487
3583
|
}
|
|
3488
3584
|
async updateBehaviorSettings(resourceId, settingsPatch, options) {
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3585
|
+
return this.writeBehaviorSettings(resourceId, settingsPatch, options, "ResourcesFacade.updateBehaviorSettings" /* ResourceUpdate */);
|
|
3586
|
+
}
|
|
3587
|
+
/** Контекст локален вызову; алгоритм и число запросов двух публичных операций совпадают. */
|
|
3588
|
+
async writeBehaviorSettings(resourceId, settingsPatch, options, operation) {
|
|
3589
|
+
let failureAt = "ReadCurrent" /* ReadCurrent */;
|
|
3590
|
+
let effect = "NotApplied" /* NotApplied */;
|
|
3591
|
+
try {
|
|
3592
|
+
const resource = await this.getById(resourceId, {
|
|
3593
|
+
includeDeleted: options?.includeDeleted,
|
|
3594
|
+
isNeedItem: options?.isNeedItem,
|
|
3595
|
+
isNeedParentResource: options?.isNeedParentResource,
|
|
3596
|
+
includeChildTypes: options?.includeChildTypes,
|
|
3597
|
+
securityToken: options?.securityToken,
|
|
3598
|
+
signal: options?.signal
|
|
3599
|
+
});
|
|
3600
|
+
failureAt = "PrepareWrite" /* PrepareWrite */;
|
|
3601
|
+
const mergeParameters = options?.mergeParameters ?? true;
|
|
3602
|
+
const nextSettings = mergeParameters ? {
|
|
3603
|
+
...this.getBehaviorSettingsFromResource(resource),
|
|
3604
|
+
...settingsPatch
|
|
3605
|
+
} : { ...settingsPatch };
|
|
3606
|
+
const nextTags = mergeResourceBehaviorTags(resource.tags, nextSettings);
|
|
3607
|
+
failureAt = "WriteSettings" /* WriteSettings */;
|
|
3608
|
+
let dispatched = false;
|
|
3609
|
+
let acknowledgement;
|
|
3610
|
+
try {
|
|
3611
|
+
acknowledgement = await this.http.requestJson({
|
|
3612
|
+
method: "PUT",
|
|
3613
|
+
path: `${BASE7}/${encodePathSegment(resourceId)}/tags`,
|
|
3614
|
+
body: nextTags,
|
|
3615
|
+
query: {
|
|
3616
|
+
versionToCheck: options?.checkVersion ? resource.meta?.version ?? void 0 : void 0,
|
|
3617
|
+
isNeedAnnouncement: options?.isNeedAnnouncement
|
|
3618
|
+
},
|
|
3619
|
+
signal: options?.signal
|
|
3620
|
+
}, () => {
|
|
3621
|
+
dispatched = true;
|
|
3622
|
+
});
|
|
3623
|
+
} catch (cause) {
|
|
3624
|
+
effect = dispatched ? "Unknown" /* Unknown */ : "NotApplied" /* NotApplied */;
|
|
3625
|
+
const error = contextualizeBehaviorError(cause, operation, failureAt, effect).withContext({
|
|
3626
|
+
request: dispatched ? "Started" /* Started */ : "NotStarted" /* NotStarted */
|
|
3627
|
+
});
|
|
3628
|
+
if (dispatched && isBehaviorCasRefusal(error)) {
|
|
3629
|
+
effect = "NotApplied" /* NotApplied */;
|
|
3630
|
+
throw error.withContext({
|
|
3631
|
+
category: "VersionConflict" /* VersionConflict */,
|
|
3632
|
+
detail: { domain: "BehaviorSettings" /* BehaviorSettings */ }
|
|
3633
|
+
});
|
|
3634
|
+
}
|
|
3635
|
+
throw error;
|
|
3636
|
+
}
|
|
3637
|
+
effect = acknowledgement?.id === resourceId ? "Applied" /* Applied */ : "Unknown" /* Unknown */;
|
|
3638
|
+
failureAt = "ReadBack" /* ReadBack */;
|
|
3639
|
+
return await this.getById(resourceId, {
|
|
3640
|
+
includeDeleted: options?.includeDeleted,
|
|
3641
|
+
isNeedItem: options?.isNeedItem,
|
|
3642
|
+
isNeedParentResource: options?.isNeedParentResource,
|
|
3643
|
+
includeChildTypes: options?.includeChildTypes,
|
|
3644
|
+
securityToken: options?.securityToken,
|
|
3645
|
+
signal: options?.signal
|
|
3646
|
+
});
|
|
3647
|
+
} catch (cause) {
|
|
3648
|
+
throw contextualizeBehaviorError(cause, operation, failureAt, effect);
|
|
3649
|
+
}
|
|
3516
3650
|
}
|
|
3517
3651
|
setBehaviorSettings(resourceId, settings, options) {
|
|
3518
|
-
return this.
|
|
3652
|
+
return this.writeBehaviorSettings(resourceId, settings, {
|
|
3519
3653
|
...options,
|
|
3520
3654
|
mergeParameters: false
|
|
3521
|
-
});
|
|
3655
|
+
}, "ResourcesFacade.setBehaviorSettings" /* ResourceSet */);
|
|
3522
3656
|
}
|
|
3523
3657
|
/** `GET /api/v1/resources/personallist` */
|
|
3524
3658
|
listPersonal(options) {
|
|
@@ -3590,61 +3724,39 @@ var ResourcesFacade = class extends TorrowItemFacade {
|
|
|
3590
3724
|
};
|
|
3591
3725
|
|
|
3592
3726
|
// ../../src/resources/services/behavior-settings.ts
|
|
3593
|
-
var ServiceBehaviorSettingsErrorCategory = /* @__PURE__ */ ((ServiceBehaviorSettingsErrorCategory2) => {
|
|
3594
|
-
ServiceBehaviorSettingsErrorCategory2["InvalidInput"] = "InvalidInput";
|
|
3595
|
-
ServiceBehaviorSettingsErrorCategory2["AccessDenied"] = "AccessDenied";
|
|
3596
|
-
ServiceBehaviorSettingsErrorCategory2["InsufficientData"] = "InsufficientData";
|
|
3597
|
-
ServiceBehaviorSettingsErrorCategory2["InvalidResponse"] = "InvalidResponse";
|
|
3598
|
-
ServiceBehaviorSettingsErrorCategory2["VersionConflict"] = "VersionConflict";
|
|
3599
|
-
ServiceBehaviorSettingsErrorCategory2["WriteOutcomeUnknown"] = "WriteOutcomeUnknown";
|
|
3600
|
-
ServiceBehaviorSettingsErrorCategory2["RequestNotSent"] = "RequestNotSent";
|
|
3601
|
-
return ServiceBehaviorSettingsErrorCategory2;
|
|
3602
|
-
})(ServiceBehaviorSettingsErrorCategory || {});
|
|
3603
3727
|
var ServiceBehaviorSettingsIssueReason = /* @__PURE__ */ ((ServiceBehaviorSettingsIssueReason2) => {
|
|
3604
3728
|
ServiceBehaviorSettingsIssueReason2["InvalidValue"] = "InvalidValue";
|
|
3605
3729
|
ServiceBehaviorSettingsIssueReason2["AmbiguousValue"] = "AmbiguousValue";
|
|
3606
3730
|
return ServiceBehaviorSettingsIssueReason2;
|
|
3607
3731
|
})(ServiceBehaviorSettingsIssueReason || {});
|
|
3608
|
-
var ServiceBehaviorSettingsError = class extends Error {
|
|
3609
|
-
/** Предметная категория; не зависит от кодов MCP. */
|
|
3610
|
-
category;
|
|
3611
|
-
/** Исходная ошибка транспорта или сервера, если она существует. */
|
|
3612
|
-
cause;
|
|
3613
|
-
constructor(category, cause) {
|
|
3614
|
-
super(`Service BehaviorSettings: ${category}`);
|
|
3615
|
-
this.name = "ServiceBehaviorSettingsError";
|
|
3616
|
-
this.category = category;
|
|
3617
|
-
this.cause = cause;
|
|
3618
|
-
}
|
|
3619
|
-
};
|
|
3620
3732
|
var configs = Object.values(SERVICE_IMPLICIT_TAG_REGISTRY);
|
|
3621
3733
|
function isBehaviorVersion(value) {
|
|
3622
3734
|
return typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= 2147483647;
|
|
3623
3735
|
}
|
|
3624
|
-
function
|
|
3736
|
+
function record2(value) {
|
|
3625
3737
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3626
3738
|
}
|
|
3627
3739
|
function validateBehaviorResponse(value, serviceId) {
|
|
3628
|
-
if (!
|
|
3740
|
+
if (!record2(value) || value.id !== serviceId) throw behaviorSettingsError("InvalidResponse" /* InvalidResponse */);
|
|
3629
3741
|
const personal = value.personalInfo;
|
|
3630
|
-
if (
|
|
3631
|
-
throw
|
|
3742
|
+
if (record2(personal) && (personal.itemContentType === "NoRights" /* NoRights */ || personal.itemContentType === "SubscriptionIsNotValid" /* SubscriptionIsNotValid */)) {
|
|
3743
|
+
throw behaviorSettingsError("AccessDenied" /* AccessDenied */);
|
|
3632
3744
|
}
|
|
3633
|
-
if (!
|
|
3634
|
-
throw
|
|
3745
|
+
if (!record2(personal) || personal.itemContentType !== "Full" /* Full */ || value.tags == null || !record2(value.meta) || !isBehaviorVersion(value.meta.version)) {
|
|
3746
|
+
throw behaviorSettingsError("InsufficientData" /* InsufficientData */);
|
|
3635
3747
|
}
|
|
3636
3748
|
if (!Array.isArray(value.tags) || !value.tags.every((tag) => typeof tag === "string")) {
|
|
3637
|
-
throw
|
|
3749
|
+
throw behaviorSettingsError("InvalidResponse" /* InvalidResponse */);
|
|
3638
3750
|
}
|
|
3639
3751
|
const operations = personal.operationList;
|
|
3640
3752
|
if (operations != null && (!Array.isArray(operations) || !operations.every((operation) => typeof operation === "string" || typeof operation === "number" && Number.isSafeInteger(operation)))) {
|
|
3641
|
-
throw
|
|
3753
|
+
throw behaviorSettingsError("InvalidResponse" /* InvalidResponse */);
|
|
3642
3754
|
}
|
|
3643
3755
|
return { tags: [...new Set(value.tags)], version: value.meta.version, operations };
|
|
3644
3756
|
}
|
|
3645
3757
|
function assertBehaviorPermission(operations) {
|
|
3646
|
-
if (!Array.isArray(operations)) throw
|
|
3647
|
-
if (!operations.includes("SetItemTags" /* SetItemTags */)) throw
|
|
3758
|
+
if (!Array.isArray(operations)) throw behaviorSettingsError("InsufficientData" /* InsufficientData */);
|
|
3759
|
+
if (!operations.includes("SetItemTags" /* SetItemTags */)) throw behaviorSettingsError("AccessDenied" /* AccessDenied */);
|
|
3648
3760
|
}
|
|
3649
3761
|
function suffixPrefix(tag, suffix, ignoreCase = false) {
|
|
3650
3762
|
const matches = ignoreCase ? tag.toLowerCase().endsWith(suffix.toLowerCase()) : tag.endsWith(suffix);
|
|
@@ -3724,9 +3836,9 @@ function readBehaviorSettings(tags) {
|
|
|
3724
3836
|
}
|
|
3725
3837
|
function normalizeBehaviorInput(input) {
|
|
3726
3838
|
function fail() {
|
|
3727
|
-
throw
|
|
3839
|
+
throw behaviorSettingsError("InvalidInput" /* InvalidInput */);
|
|
3728
3840
|
}
|
|
3729
|
-
if (!
|
|
3841
|
+
if (!record2(input) || Object.keys(input).some((key) => !Object.hasOwn(SERVICE_IMPLICIT_TAG_REGISTRY, key))) fail();
|
|
3730
3842
|
const output = {};
|
|
3731
3843
|
for (const config of configs) {
|
|
3732
3844
|
if (!Object.hasOwn(input, config.field)) continue;
|
|
@@ -3744,7 +3856,7 @@ function normalizeBehaviorInput(input) {
|
|
|
3744
3856
|
if (!Array.isArray(value)) fail();
|
|
3745
3857
|
const seen = /* @__PURE__ */ new Set();
|
|
3746
3858
|
output[config.field] = value.map((entry) => {
|
|
3747
|
-
if (!
|
|
3859
|
+
if (!record2(entry) || Object.keys(entry).some((key) => !["index", "text", "link"].includes(key)) || typeof entry.index !== "number" || !Number.isSafeInteger(entry.index) || entry.index <= 0 || seen.has(entry.index)) fail();
|
|
3748
3860
|
seen.add(entry.index);
|
|
3749
3861
|
const normalized = { index: entry.index };
|
|
3750
3862
|
for (const attribute of ["text", "link"]) {
|
|
@@ -3897,7 +4009,7 @@ var ServicesFacade = class extends TorrowItemFacade {
|
|
|
3897
4009
|
/** Читает сырой OpenAPI DTO до проекции, чтобы malformed tags не маскировались парсером. */
|
|
3898
4010
|
async readBehaviorState(serviceId, options) {
|
|
3899
4011
|
if (typeof serviceId !== "string" || !serviceId.trim()) {
|
|
3900
|
-
throw
|
|
4012
|
+
throw behaviorSettingsError("InvalidInput" /* InvalidInput */);
|
|
3901
4013
|
}
|
|
3902
4014
|
const value = await this.http.requestJson({
|
|
3903
4015
|
method: "GET",
|
|
@@ -3915,8 +4027,12 @@ var ServicesFacade = class extends TorrowItemFacade {
|
|
|
3915
4027
|
}
|
|
3916
4028
|
/** Один GET: версия всей услуги, предметные настройки и диагностика неполного снимка. */
|
|
3917
4029
|
async getBehaviorSettings(serviceId, options) {
|
|
3918
|
-
|
|
3919
|
-
|
|
4030
|
+
try {
|
|
4031
|
+
const state = await this.readBehaviorState(serviceId, options);
|
|
4032
|
+
return { serviceId, version: state.version, ...readBehaviorSettings(state.tags) };
|
|
4033
|
+
} catch (cause) {
|
|
4034
|
+
throw contextualizeBehaviorError(cause, "ServicesFacade.getBehaviorSettings" /* ServiceGet */, "ReadCurrent" /* ReadCurrent */);
|
|
4035
|
+
}
|
|
3920
4036
|
}
|
|
3921
4037
|
/**
|
|
3922
4038
|
* GET → локальный patch → PUT /tags с необязательной проверкой версии; автоматического readback нет.
|
|
@@ -3924,56 +4040,84 @@ var ServicesFacade = class extends TorrowItemFacade {
|
|
|
3924
4040
|
* Порядок и одинаковые дубли сервер не сохраняет; no-op определяется множеством строк.
|
|
3925
4041
|
*/
|
|
3926
4042
|
async updateBehaviorSettings(serviceId, settingsPatch, options = {}) {
|
|
3927
|
-
|
|
3928
|
-
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
|
|
3932
|
-
|
|
3933
|
-
profileId: options.profileId,
|
|
3934
|
-
securityToken: options.securityToken,
|
|
3935
|
-
signal: options.signal
|
|
3936
|
-
});
|
|
3937
|
-
assertBehaviorPermission(state.operations);
|
|
3938
|
-
if (options.versionToCheck !== void 0 && state.version !== options.versionToCheck) {
|
|
3939
|
-
throw new ServiceBehaviorSettingsError("VersionConflict" /* VersionConflict */);
|
|
3940
|
-
}
|
|
3941
|
-
const tags = mergeBehaviorSettings(state.tags, normalized, options.mergeParameters ?? true);
|
|
3942
|
-
const projected = readBehaviorSettings(tags);
|
|
3943
|
-
const unchanged = tags.length === state.tags.length && tags.every((tag) => state.tags.includes(tag));
|
|
3944
|
-
if (unchanged) return { serviceId, version: state.version, ...projected, changed: false };
|
|
3945
|
-
let dispatched = false;
|
|
3946
|
-
let result;
|
|
4043
|
+
return this.writeBehaviorSettings(serviceId, settingsPatch, options, "ServicesFacade.updateBehaviorSettings" /* ServiceUpdate */);
|
|
4044
|
+
}
|
|
4045
|
+
/** Общий алгоритм двух публичных операций; контекст и эффект принадлежат только текущему вызову. */
|
|
4046
|
+
async writeBehaviorSettings(serviceId, settingsPatch, options, operation) {
|
|
4047
|
+
let failureAt = "ValidateInput" /* ValidateInput */;
|
|
4048
|
+
let effect = "NotApplied" /* NotApplied */;
|
|
3947
4049
|
try {
|
|
3948
|
-
|
|
3949
|
-
|
|
3950
|
-
|
|
3951
|
-
|
|
3952
|
-
|
|
4050
|
+
if (!options || options.versionToCheck !== void 0 && !isBehaviorVersion(options.versionToCheck) || Object.hasOwn(options, "checkVersion") && options.checkVersion !== true || Object.hasOwn(options, "mergeParameters") && typeof options.mergeParameters !== "boolean" || options.isNeedAnnouncement != null && typeof options.isNeedAnnouncement !== "boolean" || Object.keys(options).some((key) => !["versionToCheck", "checkVersion", "mergeParameters", "profileId", "securityToken", "isNeedAnnouncement", "signal"].includes(key))) {
|
|
4051
|
+
throw behaviorSettingsError("InvalidInput" /* InvalidInput */);
|
|
4052
|
+
}
|
|
4053
|
+
const normalized = normalizeBehaviorInput(settingsPatch);
|
|
4054
|
+
options = { ...options };
|
|
4055
|
+
failureAt = "ReadCurrent" /* ReadCurrent */;
|
|
4056
|
+
const state = await this.readBehaviorState(serviceId, {
|
|
4057
|
+
profileId: options.profileId,
|
|
4058
|
+
securityToken: options.securityToken,
|
|
3953
4059
|
signal: options.signal
|
|
3954
|
-
}, () => {
|
|
3955
|
-
dispatched = true;
|
|
3956
4060
|
});
|
|
3957
|
-
|
|
3958
|
-
|
|
3959
|
-
|
|
4061
|
+
failureAt = "PrepareWrite" /* PrepareWrite */;
|
|
4062
|
+
assertBehaviorPermission(state.operations);
|
|
4063
|
+
if (options.versionToCheck !== void 0 && state.version !== options.versionToCheck) {
|
|
4064
|
+
throw behaviorSettingsError("VersionConflict" /* VersionConflict */);
|
|
3960
4065
|
}
|
|
3961
|
-
|
|
3962
|
-
|
|
3963
|
-
|
|
3964
|
-
|
|
4066
|
+
const tags = mergeBehaviorSettings(state.tags, normalized, options.mergeParameters ?? true);
|
|
4067
|
+
const projected = readBehaviorSettings(tags);
|
|
4068
|
+
const unchanged = tags.length === state.tags.length && tags.every((tag) => state.tags.includes(tag));
|
|
4069
|
+
if (unchanged) return { serviceId, version: state.version, ...projected, changed: false };
|
|
4070
|
+
failureAt = "WriteSettings" /* WriteSettings */;
|
|
4071
|
+
let result;
|
|
4072
|
+
let dispatched = false;
|
|
4073
|
+
try {
|
|
4074
|
+
result = await this.http.requestJson({
|
|
4075
|
+
method: "PUT",
|
|
4076
|
+
path: `${BASE9}/${encodePathSegment(serviceId)}/tags`,
|
|
4077
|
+
query: { versionToCheck: options.versionToCheck ?? (options.checkVersion ? state.version : void 0), isNeedAnnouncement: options.isNeedAnnouncement ?? false },
|
|
4078
|
+
body: tags,
|
|
4079
|
+
signal: options.signal
|
|
4080
|
+
}, () => {
|
|
4081
|
+
dispatched = true;
|
|
4082
|
+
});
|
|
4083
|
+
} catch (cause) {
|
|
4084
|
+
effect = dispatched ? "Unknown" /* Unknown */ : "NotApplied" /* NotApplied */;
|
|
4085
|
+
const error = contextualizeBehaviorError(cause, operation, failureAt, effect).withContext({
|
|
4086
|
+
request: dispatched ? "Started" /* Started */ : "NotStarted" /* NotStarted */
|
|
4087
|
+
});
|
|
4088
|
+
if (dispatched && isBehaviorCasRefusal(error)) {
|
|
4089
|
+
effect = "NotApplied" /* NotApplied */;
|
|
4090
|
+
throw error.withContext({
|
|
4091
|
+
category: "VersionConflict" /* VersionConflict */,
|
|
4092
|
+
detail: { domain: "BehaviorSettings" /* BehaviorSettings */ }
|
|
4093
|
+
});
|
|
4094
|
+
}
|
|
4095
|
+
throw error;
|
|
4096
|
+
}
|
|
4097
|
+
effect = "Unknown" /* Unknown */;
|
|
4098
|
+
failureAt = "ValidateWriteResponse" /* ValidateWriteResponse */;
|
|
4099
|
+
if (!result || result.id !== serviceId || !isBehaviorVersion(result.meta?.version)) {
|
|
4100
|
+
throw new TorrowSdkError({
|
|
4101
|
+
category: "InvalidResponse" /* InvalidResponse */,
|
|
4102
|
+
request: "Started" /* Started */,
|
|
4103
|
+
detail: { domain: "BehaviorSettings" /* BehaviorSettings */ },
|
|
4104
|
+
sensitive: { body: result }
|
|
4105
|
+
});
|
|
4106
|
+
}
|
|
4107
|
+
return { serviceId, version: result.meta.version, ...projected, changed: true };
|
|
4108
|
+
} catch (cause) {
|
|
4109
|
+
throw contextualizeBehaviorError(cause, operation, failureAt, effect);
|
|
3965
4110
|
}
|
|
3966
|
-
return { serviceId, version: result.meta.version, ...projected, changed: true };
|
|
3967
4111
|
}
|
|
3968
4112
|
/** Полная замена: пропущенные поля очищаются, посторонние данные сохраняются. */
|
|
3969
4113
|
setBehaviorSettings(serviceId, settings, options = {}) {
|
|
3970
|
-
return this.
|
|
4114
|
+
return this.writeBehaviorSettings(serviceId, settings, { ...options, mergeParameters: false }, "ServicesFacade.setBehaviorSettings" /* ServiceSet */);
|
|
3971
4115
|
}
|
|
3972
4116
|
/**
|
|
3973
4117
|
* Запись на услугу — `POST /api/v1/services/{serviceId}/order`.
|
|
3974
4118
|
* Минимум в теле: непустой смысл в `checkInProperties` (слот, участник, контакты — по правилам услуги и OpenAPI).
|
|
3975
4119
|
* Успех: `OrderResp` (часто интересен `order` как кейс и `consumerSecurityToken` для гостевого доступа).
|
|
3976
|
-
* Типичные отказы: нет слота, услуга недоступна по времени, подписка/баланс — разбирай тело `
|
|
4120
|
+
* Типичные отказы: нет слота, услуга недоступна по времени, подписка/баланс — разбирай тело `TorrowSdkError` (`name` / `code`); эталон UX — `torrow-apps` `CreateOrderTask`.
|
|
3977
4121
|
*/
|
|
3978
4122
|
createOrder(serviceId, body, options) {
|
|
3979
4123
|
return createOrder(this.http, serviceId, body, options);
|
|
@@ -5800,21 +5944,30 @@ var ShortUrlFacade = class {
|
|
|
5800
5944
|
* Возвращает заголовок `Location` без следования редиректу.
|
|
5801
5945
|
*/
|
|
5802
5946
|
async getRedirectLocation(shortUrl, options) {
|
|
5803
|
-
|
|
5804
|
-
|
|
5805
|
-
|
|
5806
|
-
|
|
5807
|
-
|
|
5808
|
-
|
|
5809
|
-
|
|
5810
|
-
|
|
5811
|
-
|
|
5812
|
-
|
|
5813
|
-
|
|
5814
|
-
|
|
5815
|
-
|
|
5816
|
-
|
|
5817
|
-
|
|
5947
|
+
let request = "NotStarted" /* NotStarted */;
|
|
5948
|
+
let url;
|
|
5949
|
+
try {
|
|
5950
|
+
const fetchFn = this.config.fetch ?? globalThis.fetch;
|
|
5951
|
+
const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;
|
|
5952
|
+
url = joinBaseUrlAndPath(origin, `${BASE27}/${encodePathSegment(shortUrl)}`);
|
|
5953
|
+
const authHeaders = await buildAuthHeaders(this.config);
|
|
5954
|
+
const init = {
|
|
5955
|
+
method: "GET",
|
|
5956
|
+
redirect: "manual",
|
|
5957
|
+
headers: {
|
|
5958
|
+
Accept: "*/*",
|
|
5959
|
+
...authHeaders,
|
|
5960
|
+
...this.config.defaultHeaders
|
|
5961
|
+
},
|
|
5962
|
+
signal: options?.signal
|
|
5963
|
+
};
|
|
5964
|
+
options?.signal?.throwIfAborted();
|
|
5965
|
+
request = "Started" /* Started */;
|
|
5966
|
+
const res = await fetchFn(url, init);
|
|
5967
|
+
return res.headers.get("Location");
|
|
5968
|
+
} catch (cause) {
|
|
5969
|
+
throw normalizeTransportError(cause, request, options?.signal, url);
|
|
5970
|
+
}
|
|
5818
5971
|
}
|
|
5819
5972
|
};
|
|
5820
5973
|
|
|
@@ -6966,8 +7119,8 @@ var ServiceOrderConflictErrorNameValues = {
|
|
|
6966
7119
|
ServiceUnavailableAtTime: "SERVICE_IS_NOT_AVAILABLE_AT_TIME"
|
|
6967
7120
|
};
|
|
6968
7121
|
function getServiceOrderConflictReason(error) {
|
|
6969
|
-
if (!(error instanceof
|
|
6970
|
-
switch (error.apiErrorName) {
|
|
7122
|
+
if (!(error instanceof TorrowSdkError)) return void 0;
|
|
7123
|
+
switch (error.http?.apiErrorName) {
|
|
6971
7124
|
case ServiceOrderConflictErrorNameValues.ResourceUnavailable:
|
|
6972
7125
|
return "resource-unavailable";
|
|
6973
7126
|
case ServiceOrderConflictErrorNameValues.QuantityUnavailable:
|
|
@@ -7171,6 +7324,9 @@ export {
|
|
|
7171
7324
|
AuthFacade,
|
|
7172
7325
|
AuthScopeValueList,
|
|
7173
7326
|
AuthScopeValues,
|
|
7327
|
+
AuthSessionEffectStep,
|
|
7328
|
+
AuthSessionErrorReason,
|
|
7329
|
+
BehaviorSettingsEffectStep,
|
|
7174
7330
|
BlockReasonsFacade,
|
|
7175
7331
|
CalendarsFacade,
|
|
7176
7332
|
CaseStateValues,
|
|
@@ -7206,6 +7362,7 @@ export {
|
|
|
7206
7362
|
LoyaltySystemsFacade,
|
|
7207
7363
|
NoteTypeValues,
|
|
7208
7364
|
NotesFacade,
|
|
7365
|
+
OtpErrorReason,
|
|
7209
7366
|
ParticipationFieldRequirementTypeValues,
|
|
7210
7367
|
ParticipationFieldTypeValues,
|
|
7211
7368
|
PinnedViewsFacade,
|
|
@@ -7219,8 +7376,6 @@ export {
|
|
|
7219
7376
|
SearchFacade,
|
|
7220
7377
|
SendCodeAccountTypeValueList,
|
|
7221
7378
|
SendCodeAccountTypeValues,
|
|
7222
|
-
ServiceBehaviorSettingsError,
|
|
7223
|
-
ServiceBehaviorSettingsErrorCategory,
|
|
7224
7379
|
ServiceBehaviorSettingsIssueReason,
|
|
7225
7380
|
ServiceBuilder,
|
|
7226
7381
|
ServiceCheckInWizardStepParameterName,
|
|
@@ -7241,11 +7396,16 @@ export {
|
|
|
7241
7396
|
TokenStatusValueList,
|
|
7242
7397
|
TokenStatusValues,
|
|
7243
7398
|
TorrowClient,
|
|
7244
|
-
TorrowHttpError,
|
|
7245
7399
|
TorrowIdError,
|
|
7246
7400
|
TorrowItemTypeValueList,
|
|
7247
7401
|
TorrowItemTypeValues,
|
|
7248
7402
|
TorrowObjectTypeCode,
|
|
7403
|
+
TorrowSdkEffectArea,
|
|
7404
|
+
TorrowSdkEffectState,
|
|
7405
|
+
TorrowSdkError,
|
|
7406
|
+
TorrowSdkErrorCategory,
|
|
7407
|
+
TorrowSdkErrorDomain,
|
|
7408
|
+
TorrowSdkRequestState,
|
|
7249
7409
|
UsageConditionTypeValues,
|
|
7250
7410
|
UsageTypeValues,
|
|
7251
7411
|
UserAccessLevelValues,
|