@opsregistry/bridge-client 0.4.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 +95 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +167 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# @opsregistry/bridge-client
|
|
2
|
+
|
|
3
|
+
Общая TypeScript-библиотека для безопасного взаимодействия браузерных приложений с локальным
|
|
4
|
+
[`opsregistry-bridge`](https://gitflic.ru/project/opsregistry/bridge). Она позволяет любому
|
|
5
|
+
приложению использовать локальные операции OpsRegistry и не содержит кода, специфичного для VARM.
|
|
6
|
+
|
|
7
|
+
Клиент:
|
|
8
|
+
|
|
9
|
+
- находит локальный Bridge и проверяет версию протокола;
|
|
10
|
+
- связывает origin приложения с локальной службой;
|
|
11
|
+
- принимает короткоживущий допуск к каждой операции;
|
|
12
|
+
- проверяет запросы и ответы схемами `@opsregistry/contracts`;
|
|
13
|
+
- предоставляет типизированные методы для настройки электронной подписи, поиска устройств и
|
|
14
|
+
сертификатов, а также создания подписи;
|
|
15
|
+
- различает недоступность службы, нарушение протокола и ошибку самой операции.
|
|
16
|
+
|
|
17
|
+
Библиотека не содержит интерфейс, криптографию, закрытые ключи и бизнес-логику провайдеров.
|
|
18
|
+
Приложение само показывает пользователю установку и подписание, а допуски к операциям выдаёт его
|
|
19
|
+
backend после проверки прав пользователя.
|
|
20
|
+
|
|
21
|
+
`operationGrant` — не произвольный API-токен, а короткоживущий компактный JWS с `EdDSA`. Перед
|
|
22
|
+
обращением к backend приложение получает `requestId` через `createRequestId()`. Grant связан с
|
|
23
|
+
конкретными Bridge, origin, кодом операции, `requestId` и SHA-256 канонизированного input, поэтому
|
|
24
|
+
его нельзя перенести на другой запрос или повторно использовать. Backend должен вычислять хеш input
|
|
25
|
+
по JSON Canonicalization Scheme (RFC 8785); формат claims экспортируется из
|
|
26
|
+
`@opsregistry/contracts/bridge/grant`.
|
|
27
|
+
|
|
28
|
+
## Пример
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import { BridgeClient } from '@opsregistry/bridge-client';
|
|
32
|
+
|
|
33
|
+
const bridge = new BridgeClient();
|
|
34
|
+
const manifest = await bridge.discover();
|
|
35
|
+
const requestId = bridge.createRequestId();
|
|
36
|
+
|
|
37
|
+
// Backend signs bridgeId, origin, operation, requestId and the RFC 8785 input hash.
|
|
38
|
+
const operationGrant = await getOperationGrant({ bridgeId: manifest.bridgeId, requestId });
|
|
39
|
+
|
|
40
|
+
const environment = await bridge.inspectSigningEnvironment(
|
|
41
|
+
{
|
|
42
|
+
requirements: {
|
|
43
|
+
signatureFormats: ['cadesBes'],
|
|
44
|
+
qualifiedSignature: 'required'
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
{ requestId, operationGrant }
|
|
48
|
+
);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Для полного сценария приложение сначала вызывает `discover()`, при необходимости выполняет
|
|
52
|
+
`pair()`, открывает возвращённый `approvalUrl` в новой вкладке и опрашивает `getPairing(requestId)`.
|
|
53
|
+
После локального подтверждения оно получает допуск от своего backend и вызывает нужную операцию.
|
|
54
|
+
Специализированные методы доступны для следующих контрактов:
|
|
55
|
+
|
|
56
|
+
- `trust.signingEnvironment.inspect`;
|
|
57
|
+
- `trust.signingEnvironment.configure`;
|
|
58
|
+
- `trust.device.list`;
|
|
59
|
+
- `trust.certificate.list`;
|
|
60
|
+
- `trust.certificate.resolve`;
|
|
61
|
+
- `trust.digitalSignature.create`.
|
|
62
|
+
|
|
63
|
+
Для остальных операций можно использовать типизированное ядро `execute()` с соответствующей
|
|
64
|
+
Zod-схемой результата.
|
|
65
|
+
|
|
66
|
+
Результат `discover()` содержит `modules` и `operations`. Поле состояния операции позволяет
|
|
67
|
+
интерфейсу различить готовую возможность, модуль, который можно установить, текущую установку и
|
|
68
|
+
ошибку настройки. Старого общего `operationCodes` нет: оно не позволяло отличить установленный
|
|
69
|
+
функционал от доступного для загрузки.
|
|
70
|
+
|
|
71
|
+
Manifest также возвращает `operatingSystem`, `architecture` и полный `targetTriple`. Клиент не
|
|
72
|
+
угадывает совместимость платформ: выбор конкретного бинарника выполняет сам Bridge по точному
|
|
73
|
+
совпадению с подписанным каталогом. Поэтому один и тот же клиент работает с Bridge на Windows,
|
|
74
|
+
Linux, macOS и будущих поддерживаемых системах.
|
|
75
|
+
|
|
76
|
+
## Безопасность транспорта
|
|
77
|
+
|
|
78
|
+
По умолчанию клиент обращается к `http://127.0.0.1:47831`. Удалённые хосты отклоняются даже при
|
|
79
|
+
явной настройке. В production HTTPS-приложение должно быть связано с Bridge и передавать новый
|
|
80
|
+
короткоживущий допуск для каждой операции.
|
|
81
|
+
|
|
82
|
+
## Разработка
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
bun install
|
|
86
|
+
bun run check
|
|
87
|
+
bun test
|
|
88
|
+
bun run build
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## English
|
|
92
|
+
|
|
93
|
+
`@opsregistry/bridge-client` is a framework-neutral TypeScript client for secure communication
|
|
94
|
+
between browser applications and a local OpsRegistry Bridge. It validates loopback endpoints,
|
|
95
|
+
protocol envelopes and operation payloads without implementing UI or cryptography.
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type BridgeManifest, type BridgePairingRequest, type BridgePairingResult } from '@opsregistry/contracts/bridge/protocol';
|
|
2
|
+
import { type CertificateListInput, type CertificateListResult } from '@opsregistry/contracts/trust/certificate-list';
|
|
3
|
+
import { type CertificateResolveInput, type CertificateResolveResult } from '@opsregistry/contracts/trust/certificate-resolve';
|
|
4
|
+
import { type DeviceListInput, type DeviceListResult } from '@opsregistry/contracts/trust/device-list';
|
|
5
|
+
import { type DigitalSignatureCreateInput, type DigitalSignatureCreateResult } from '@opsregistry/contracts/trust/digital-signature-create';
|
|
6
|
+
import { type SigningEnvironmentConfigureInput, type SigningEnvironmentConfigureResult } from '@opsregistry/contracts/trust/signing-environment-configure';
|
|
7
|
+
import { type SigningEnvironmentInspectInput, type SigningEnvironmentInspectResult } from '@opsregistry/contracts/trust/signing-environment-inspect';
|
|
8
|
+
import type { ZodType } from 'zod';
|
|
9
|
+
export declare const defaultBridgeBaseUrl = "http://127.0.0.1:47831";
|
|
10
|
+
type Fetch = typeof globalThis.fetch;
|
|
11
|
+
type PairingInput = Omit<BridgePairingRequest, 'protocolVersion'>;
|
|
12
|
+
export type OperationAuthorization = {
|
|
13
|
+
requestId: string;
|
|
14
|
+
operationGrant: string;
|
|
15
|
+
};
|
|
16
|
+
export type BridgeClientOptions = {
|
|
17
|
+
baseUrl?: string;
|
|
18
|
+
fetch?: Fetch;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
randomUuid?: () => string;
|
|
21
|
+
};
|
|
22
|
+
export declare const normalizeBridgeBaseUrl: (value: string) => string;
|
|
23
|
+
export declare class BridgeClient {
|
|
24
|
+
readonly baseUrl: string;
|
|
25
|
+
readonly timeoutMs: number;
|
|
26
|
+
readonly fetch: Fetch;
|
|
27
|
+
readonly randomUuid: () => string;
|
|
28
|
+
constructor(options?: BridgeClientOptions);
|
|
29
|
+
createRequestId(): string;
|
|
30
|
+
discover(): Promise<BridgeManifest>;
|
|
31
|
+
pair(input: PairingInput): Promise<BridgePairingResult>;
|
|
32
|
+
getPairing(requestId: string): Promise<BridgePairingResult>;
|
|
33
|
+
execute<T>(operationCode: string, input: unknown, authorization: OperationAuthorization, resultSchema: ZodType<T>): Promise<T>;
|
|
34
|
+
inspectSigningEnvironment(input: SigningEnvironmentInspectInput, authorization: OperationAuthorization): Promise<SigningEnvironmentInspectResult>;
|
|
35
|
+
configureSigningEnvironment(input: SigningEnvironmentConfigureInput, authorization: OperationAuthorization): Promise<SigningEnvironmentConfigureResult>;
|
|
36
|
+
listDevices(input: DeviceListInput, authorization: OperationAuthorization): Promise<DeviceListResult>;
|
|
37
|
+
listCertificates(input: CertificateListInput, authorization: OperationAuthorization): Promise<CertificateListResult>;
|
|
38
|
+
resolveCertificate(input: CertificateResolveInput, authorization: OperationAuthorization): Promise<CertificateResolveResult>;
|
|
39
|
+
createDigitalSignature(input: DigitalSignatureCreateInput, authorization: OperationAuthorization): Promise<DigitalSignatureCreateResult>;
|
|
40
|
+
private request;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { bridgeManifestSchema, bridgeOperationRequestSchema, bridgeOperationResponseSchema, bridgePairingRequestSchema, bridgePairingResultSchema, bridgeProtocolVersion } from '@opsregistry/contracts/bridge/protocol';
|
|
2
|
+
import { certificateListInputSchema, certificateListResultSchema } from '@opsregistry/contracts/trust/certificate-list';
|
|
3
|
+
import { certificateResolveInputSchema, certificateResolveResultSchema } from '@opsregistry/contracts/trust/certificate-resolve';
|
|
4
|
+
import { deviceListInputSchema, deviceListResultSchema } from '@opsregistry/contracts/trust/device-list';
|
|
5
|
+
import { digitalSignatureCreateInputSchema, digitalSignatureCreateResultSchema } from '@opsregistry/contracts/trust/digital-signature-create';
|
|
6
|
+
import { signingEnvironmentConfigureInputSchema, signingEnvironmentConfigureResultSchema } from '@opsregistry/contracts/trust/signing-environment-configure';
|
|
7
|
+
import { signingEnvironmentInspectInputSchema, signingEnvironmentInspectResultSchema } from '@opsregistry/contracts/trust/signing-environment-inspect';
|
|
8
|
+
import { BridgeOperationError, BridgeProtocolError, BridgeUnavailableError } from './errors.js';
|
|
9
|
+
export const defaultBridgeBaseUrl = 'http://127.0.0.1:47831';
|
|
10
|
+
const isLoopbackHost = (hostname) => {
|
|
11
|
+
const normalized = hostname.replace(/^\[|\]$/g, '');
|
|
12
|
+
return (normalized === 'localhost' ||
|
|
13
|
+
normalized.endsWith('.localhost') ||
|
|
14
|
+
normalized === '::1' ||
|
|
15
|
+
/^127(?:\.\d{1,3}){3}$/.test(normalized));
|
|
16
|
+
};
|
|
17
|
+
export const normalizeBridgeBaseUrl = (value) => {
|
|
18
|
+
const url = new URL(value);
|
|
19
|
+
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
20
|
+
throw new BridgeProtocolError('Bridge URL must use HTTP or HTTPS');
|
|
21
|
+
}
|
|
22
|
+
if (!isLoopbackHost(url.hostname)) {
|
|
23
|
+
throw new BridgeProtocolError('Bridge URL must resolve to a loopback host');
|
|
24
|
+
}
|
|
25
|
+
if (url.username || url.password || url.search || url.hash) {
|
|
26
|
+
throw new BridgeProtocolError('Bridge URL must not contain credentials, query or fragment');
|
|
27
|
+
}
|
|
28
|
+
url.pathname = url.pathname.replace(/\/+$/, '');
|
|
29
|
+
return url.toString().replace(/\/$/, '');
|
|
30
|
+
};
|
|
31
|
+
export class BridgeClient {
|
|
32
|
+
baseUrl;
|
|
33
|
+
timeoutMs;
|
|
34
|
+
fetch;
|
|
35
|
+
randomUuid;
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
this.baseUrl = normalizeBridgeBaseUrl(options.baseUrl ?? defaultBridgeBaseUrl);
|
|
38
|
+
this.timeoutMs = options.timeoutMs ?? 3_000;
|
|
39
|
+
this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
40
|
+
this.randomUuid = options.randomUuid ?? (() => globalThis.crypto.randomUUID());
|
|
41
|
+
}
|
|
42
|
+
createRequestId() {
|
|
43
|
+
return this.randomUuid();
|
|
44
|
+
}
|
|
45
|
+
async discover() {
|
|
46
|
+
const value = await this.request('/v1/manifest', { method: 'GET' });
|
|
47
|
+
const parsed = bridgeManifestSchema.safeParse(value);
|
|
48
|
+
if (!parsed.success) {
|
|
49
|
+
throw new BridgeProtocolError('Local bridge returned an invalid manifest', {
|
|
50
|
+
cause: parsed.error
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return parsed.data;
|
|
54
|
+
}
|
|
55
|
+
async pair(input) {
|
|
56
|
+
const request = bridgePairingRequestSchema.parse({
|
|
57
|
+
...input,
|
|
58
|
+
protocolVersion: bridgeProtocolVersion
|
|
59
|
+
});
|
|
60
|
+
const value = await this.request('/v1/pairings', {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers: { 'content-type': 'application/json' },
|
|
63
|
+
body: JSON.stringify(request)
|
|
64
|
+
});
|
|
65
|
+
const parsed = bridgePairingResultSchema.safeParse(value);
|
|
66
|
+
if (!parsed.success) {
|
|
67
|
+
throw new BridgeProtocolError('Local bridge returned an invalid pairing response', {
|
|
68
|
+
cause: parsed.error
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return parsed.data;
|
|
72
|
+
}
|
|
73
|
+
async getPairing(requestId) {
|
|
74
|
+
const value = await this.request(`/v1/pairings/${encodeURIComponent(requestId)}`, {
|
|
75
|
+
method: 'GET'
|
|
76
|
+
});
|
|
77
|
+
const parsed = bridgePairingResultSchema.safeParse(value);
|
|
78
|
+
if (!parsed.success || parsed.data.requestId !== requestId) {
|
|
79
|
+
throw new BridgeProtocolError('Local bridge returned an invalid pairing status', {
|
|
80
|
+
cause: parsed.success ? undefined : parsed.error
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return parsed.data;
|
|
84
|
+
}
|
|
85
|
+
async execute(operationCode, input, authorization, resultSchema) {
|
|
86
|
+
const { requestId, operationGrant } = authorization;
|
|
87
|
+
const request = bridgeOperationRequestSchema.parse({
|
|
88
|
+
protocolVersion: bridgeProtocolVersion,
|
|
89
|
+
requestId,
|
|
90
|
+
operationCode,
|
|
91
|
+
operationGrant,
|
|
92
|
+
input
|
|
93
|
+
});
|
|
94
|
+
const value = await this.request(`/v1/operations/${encodeURIComponent(operationCode)}`, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers: { 'content-type': 'application/json' },
|
|
97
|
+
body: JSON.stringify(request)
|
|
98
|
+
}, true);
|
|
99
|
+
const envelope = bridgeOperationResponseSchema.safeParse(value);
|
|
100
|
+
if (!envelope.success) {
|
|
101
|
+
throw new BridgeProtocolError('Local bridge returned an invalid operation response', {
|
|
102
|
+
cause: envelope.error
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (envelope.data.requestId !== requestId || envelope.data.operationCode !== operationCode) {
|
|
106
|
+
throw new BridgeProtocolError('Local bridge response does not match the request');
|
|
107
|
+
}
|
|
108
|
+
if (envelope.data.error) {
|
|
109
|
+
throw new BridgeOperationError(envelope.data.error.code, envelope.data.error.message, envelope.data.error.retryable, envelope.data.error.details);
|
|
110
|
+
}
|
|
111
|
+
const parsed = resultSchema.safeParse(envelope.data.result);
|
|
112
|
+
if (!parsed.success) {
|
|
113
|
+
throw new BridgeProtocolError(`Invalid result for ${operationCode}`, {
|
|
114
|
+
cause: parsed.error
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return parsed.data;
|
|
118
|
+
}
|
|
119
|
+
inspectSigningEnvironment(input, authorization) {
|
|
120
|
+
return this.execute('trust.signingEnvironment.inspect', signingEnvironmentInspectInputSchema.parse(input), authorization, signingEnvironmentInspectResultSchema);
|
|
121
|
+
}
|
|
122
|
+
configureSigningEnvironment(input, authorization) {
|
|
123
|
+
return this.execute('trust.signingEnvironment.configure', signingEnvironmentConfigureInputSchema.parse(input), authorization, signingEnvironmentConfigureResultSchema);
|
|
124
|
+
}
|
|
125
|
+
listDevices(input, authorization) {
|
|
126
|
+
return this.execute('trust.device.list', deviceListInputSchema.parse(input), authorization, deviceListResultSchema);
|
|
127
|
+
}
|
|
128
|
+
listCertificates(input, authorization) {
|
|
129
|
+
return this.execute('trust.certificate.list', certificateListInputSchema.parse(input), authorization, certificateListResultSchema);
|
|
130
|
+
}
|
|
131
|
+
resolveCertificate(input, authorization) {
|
|
132
|
+
return this.execute('trust.certificate.resolve', certificateResolveInputSchema.parse(input), authorization, certificateResolveResultSchema);
|
|
133
|
+
}
|
|
134
|
+
createDigitalSignature(input, authorization) {
|
|
135
|
+
return this.execute('trust.digitalSignature.create', digitalSignatureCreateInputSchema.parse(input), authorization, digitalSignatureCreateResultSchema);
|
|
136
|
+
}
|
|
137
|
+
async request(path, init, allowOperationError = false) {
|
|
138
|
+
const controller = new AbortController();
|
|
139
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
140
|
+
try {
|
|
141
|
+
const response = await this.fetch(`${this.baseUrl}${path}`, {
|
|
142
|
+
...init,
|
|
143
|
+
cache: 'no-store',
|
|
144
|
+
credentials: 'omit',
|
|
145
|
+
mode: 'cors',
|
|
146
|
+
signal: controller.signal
|
|
147
|
+
});
|
|
148
|
+
const value = await response.json().catch(() => undefined);
|
|
149
|
+
if (!response.ok && !allowOperationError) {
|
|
150
|
+
throw new BridgeProtocolError(`Local bridge request failed with HTTP ${response.status}`);
|
|
151
|
+
}
|
|
152
|
+
return value;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error instanceof BridgeProtocolError || error instanceof BridgeOperationError) {
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
throw new BridgeUnavailableError('Local OpsRegistry Bridge is unavailable', {
|
|
159
|
+
cause: error
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
clearTimeout(timeout);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class BridgeUnavailableError extends Error {
|
|
2
|
+
constructor(message: string, options?: ErrorOptions);
|
|
3
|
+
}
|
|
4
|
+
export declare class BridgeProtocolError extends Error {
|
|
5
|
+
constructor(message: string, options?: ErrorOptions);
|
|
6
|
+
}
|
|
7
|
+
export declare class BridgeOperationError extends Error {
|
|
8
|
+
readonly code: string;
|
|
9
|
+
readonly retryable: boolean;
|
|
10
|
+
readonly details: Record<string, unknown>;
|
|
11
|
+
constructor(code: string, message: string, retryable?: boolean, details?: Record<string, unknown>);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACD;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1C,YACC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,EACjB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAOrC;CACD"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class BridgeUnavailableError extends Error {
|
|
2
|
+
constructor(message, options) {
|
|
3
|
+
super(message, options);
|
|
4
|
+
this.name = 'BridgeUnavailableError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class BridgeProtocolError extends Error {
|
|
8
|
+
constructor(message, options) {
|
|
9
|
+
super(message, options);
|
|
10
|
+
this.name = 'BridgeProtocolError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class BridgeOperationError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
retryable;
|
|
16
|
+
details;
|
|
17
|
+
constructor(code, message, retryable = false, details = {}) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'BridgeOperationError';
|
|
20
|
+
this.code = code;
|
|
21
|
+
this.retryable = retryable;
|
|
22
|
+
this.details = details;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAChD,YAAY,OAAe,EAAE,OAAsB;QAClD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACtC,CAAC;CACD;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC7C,YAAY,OAAe,EAAE,OAAsB;QAClD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACnC,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACrC,IAAI,CAAS;IACb,SAAS,CAAU;IACnB,OAAO,CAA0B;IAE1C,YACC,IAAY,EACZ,OAAe,EACf,SAAS,GAAG,KAAK,EACjB,OAAO,GAA4B,EAAE;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opsregistry/bridge-client",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Browser client for secure communication with a local OpsRegistry Bridge.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"packageManager": "bun@1.4.0",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"files": ["dist", "README.md"],
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
19
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
20
|
+
"test": "bun test"
|
|
21
|
+
},
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"@opsregistry/contracts": ">=0.12.0 <1",
|
|
24
|
+
"zod": ">=4.5.0 <5"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@opsregistry/contracts": "file:../contracts",
|
|
28
|
+
"@types/bun": "^1.4.0",
|
|
29
|
+
"typescript": "7.0.2",
|
|
30
|
+
"zod": "^4.5.4"
|
|
31
|
+
}
|
|
32
|
+
}
|