@buildonspark/spark-sdk 0.1.45 → 0.1.47
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/CHANGELOG.md +22 -0
- package/dist/{chunk-I54FARY2.js → chunk-EAP3U3CW.js} +14 -14
- package/dist/chunk-GWFQ7EBA.js +3773 -0
- package/dist/{chunk-J2IE4Z7Y.js → chunk-NNX4OK44.js} +3487 -934
- package/dist/{RequestLightningSendInput-Du0z7Om7.d.cts → client-CvpTRpcw.d.cts} +422 -212
- package/dist/{RequestLightningSendInput-DEPd_fPO.d.ts → client-D7KgLN44.d.ts} +422 -212
- package/dist/graphql/objects/index.d.cts +5 -9
- package/dist/graphql/objects/index.d.ts +5 -9
- package/dist/graphql/objects/index.js +1 -1
- package/dist/index.cjs +20461 -23377
- package/dist/index.d.cts +15 -769
- package/dist/index.d.ts +15 -769
- package/dist/index.js +81 -71
- package/dist/index.node.cjs +21994 -25018
- package/dist/index.node.d.cts +312 -34
- package/dist/index.node.d.ts +312 -34
- package/dist/index.node.js +82 -176
- package/dist/native/index.cjs +22847 -25841
- package/dist/native/index.d.cts +974 -1138
- package/dist/native/index.d.ts +974 -1138
- package/dist/native/index.js +10604 -13592
- package/dist/proto/lrc20.d.cts +2 -2
- package/dist/proto/lrc20.d.ts +2 -2
- package/dist/proto/lrc20.js +3098 -46
- package/dist/proto/spark.d.cts +1 -1
- package/dist/proto/spark.d.ts +1 -1
- package/dist/proto/spark_token.d.cts +1 -1
- package/dist/proto/spark_token.d.ts +1 -1
- package/dist/{sdk-types-Cc4l4kb1.d.ts → sdk-types-BGCeea0G.d.ts} +1 -1
- package/dist/{sdk-types-B0SwjolI.d.cts → sdk-types-XUeQMLFP.d.cts} +1 -1
- package/dist/{spark-dM7EYXYQ.d.cts → spark-BbUrbvZz.d.cts} +1 -1
- package/dist/{spark-dM7EYXYQ.d.ts → spark-BbUrbvZz.d.ts} +1 -1
- package/dist/spark-wallet-BAFPpPtY.d.cts +923 -0
- package/dist/spark-wallet-CJkQW8pK.d.ts +923 -0
- package/dist/spark_bindings/native/index.d.cts +1 -1
- package/dist/spark_bindings/native/index.d.ts +1 -1
- package/dist/spark_bindings/wasm/index.d.cts +1 -1
- package/dist/spark_bindings/wasm/index.d.ts +1 -1
- package/dist/{services/index.cjs → tests/test-utils.cjs} +2512 -4380
- package/dist/tests/test-utils.d.cts +79 -0
- package/dist/tests/test-utils.d.ts +79 -0
- package/dist/tests/test-utils.js +85 -0
- package/dist/types/index.d.cts +5 -9
- package/dist/types/index.d.ts +5 -9
- package/dist/types/index.js +5 -5
- package/dist/{types-C-Rp0Oo7.d.cts → types-BADxR3bm.d.cts} +1 -1
- package/dist/{types-C-Rp0Oo7.d.ts → types-BADxR3bm.d.ts} +1 -1
- package/package.json +7 -35
- package/src/graphql/client.ts +59 -20
- package/src/index.node.ts +28 -2
- package/src/index.ts +31 -1
- package/src/native/index.ts +16 -2
- package/src/services/config.ts +4 -6
- package/src/services/connection.ts +131 -64
- package/src/services/lightning.ts +1 -2
- package/src/services/token-transactions.ts +7 -7
- package/src/services/transfer.ts +1 -1
- package/src/services/tree-creation.ts +1 -1
- package/src/services/wallet-config.ts +18 -10
- package/src/signer/signer.react-native.ts +2 -5
- package/src/signer/signer.ts +138 -64
- package/src/signer/types.ts +52 -0
- package/src/spark-wallet/spark-wallet.ts +79 -36
- package/src/spark-wallet/types.ts +4 -4
- package/src/tests/integration/coop-exit.test.ts +2 -1
- package/src/tests/integration/lightning.test.ts +2 -2
- package/src/tests/integration/swap.test.ts +1 -1
- package/src/tests/integration/transfer.test.ts +5 -5
- package/src/tests/integration/tree-creation.test.ts +1 -1
- package/src/tests/integration/wallet.test.ts +1 -0
- package/src/tests/isHermeticTest.ts +3 -24
- package/src/tests/{test-util.ts → test-utils.ts} +3 -7
- package/src/tests/wrapWithOtelSpan.test.ts +1 -1
- package/src/{address → utils}/address.ts +1 -1
- package/src/utils/crypto.ts +19 -9
- package/src/utils/index.ts +2 -0
- package/src/utils/network.ts +17 -0
- package/src/utils/secret-sharing.ts +1 -2
- package/src/utils/signing.ts +1 -1
- package/src/utils/token-transactions.ts +3 -3
- package/src/utils/unilateral-exit.ts +32 -0
- package/src/utils/xchain-address.ts +1 -1
- package/dist/BitcoinNetwork-TnABML0T.d.cts +0 -18
- package/dist/BitcoinNetwork-TnABML0T.d.ts +0 -18
- package/dist/LightningSendFeeEstimateInput-BgOhEAI-.d.cts +0 -10
- package/dist/LightningSendFeeEstimateInput-BgOhEAI-.d.ts +0 -10
- package/dist/address/index.cjs +0 -458
- package/dist/address/index.d.cts +0 -32
- package/dist/address/index.d.ts +0 -32
- package/dist/address/index.js +0 -17
- package/dist/chunk-5FUB65LX.js +0 -838
- package/dist/chunk-6264CGDM.js +0 -113
- package/dist/chunk-7V6N75CC.js +0 -24
- package/dist/chunk-C2S227QR.js +0 -2336
- package/dist/chunk-GSI4OLXZ.js +0 -117
- package/dist/chunk-GZ5IPPJ2.js +0 -170
- package/dist/chunk-HWJWKEIU.js +0 -75
- package/dist/chunk-KMUMFYFX.js +0 -137
- package/dist/chunk-L3EHBOUX.js +0 -0
- package/dist/chunk-NSJF5F5O.js +0 -325
- package/dist/chunk-NTFKFRQ2.js +0 -3146
- package/dist/chunk-PQN3C2MF.js +0 -1122
- package/dist/chunk-QNNSEJ4P.js +0 -232
- package/dist/chunk-R5PXJZQS.js +0 -277
- package/dist/chunk-VTUGIIWI.js +0 -0
- package/dist/chunk-YUPMXTCJ.js +0 -622
- package/dist/chunk-Z5HIAYFT.js +0 -84
- package/dist/index-B2AwKW5J.d.cts +0 -214
- package/dist/index-CJDi1HWc.d.ts +0 -214
- package/dist/network-BTJl-Sul.d.ts +0 -46
- package/dist/network-CqgsdUF2.d.cts +0 -46
- package/dist/services/config.cjs +0 -2354
- package/dist/services/config.d.cts +0 -42
- package/dist/services/config.d.ts +0 -42
- package/dist/services/config.js +0 -17
- package/dist/services/connection.cjs +0 -17691
- package/dist/services/connection.d.cts +0 -95
- package/dist/services/connection.d.ts +0 -95
- package/dist/services/connection.js +0 -11
- package/dist/services/index.d.cts +0 -21
- package/dist/services/index.d.ts +0 -21
- package/dist/services/index.js +0 -58
- package/dist/services/lrc-connection.cjs +0 -4713
- package/dist/services/lrc-connection.d.cts +0 -34
- package/dist/services/lrc-connection.d.ts +0 -34
- package/dist/services/lrc-connection.js +0 -11
- package/dist/services/token-transactions.cjs +0 -2877
- package/dist/services/token-transactions.d.cts +0 -75
- package/dist/services/token-transactions.d.ts +0 -75
- package/dist/services/token-transactions.js +0 -15
- package/dist/services/wallet-config.cjs +0 -340
- package/dist/services/wallet-config.d.cts +0 -56
- package/dist/services/wallet-config.d.ts +0 -56
- package/dist/services/wallet-config.js +0 -33
- package/dist/signer/signer.cjs +0 -2004
- package/dist/signer/signer.d.cts +0 -10
- package/dist/signer/signer.d.ts +0 -10
- package/dist/signer/signer.js +0 -24
- package/dist/signer-BocS_J6B.d.ts +0 -187
- package/dist/signer-DKS0AJkw.d.cts +0 -187
- package/dist/utils/index.cjs +0 -2947
- package/dist/utils/index.d.cts +0 -18
- package/dist/utils/index.d.ts +0 -18
- package/dist/utils/index.js +0 -157
- package/src/address/index.ts +0 -1
- package/src/services/lrc-connection.ts +0 -215
package/dist/chunk-PQN3C2MF.js
DELETED
|
@@ -1,1122 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SparkTokenServiceDefinition
|
|
3
|
-
} from "./chunk-LHRD2WT6.js";
|
|
4
|
-
import {
|
|
5
|
-
clientEnv,
|
|
6
|
-
isBun,
|
|
7
|
-
isReactNative
|
|
8
|
-
} from "./chunk-7V6N75CC.js";
|
|
9
|
-
import {
|
|
10
|
-
AuthenticationError,
|
|
11
|
-
NetworkError
|
|
12
|
-
} from "./chunk-GSI4OLXZ.js";
|
|
13
|
-
import {
|
|
14
|
-
Empty,
|
|
15
|
-
SparkServiceDefinition
|
|
16
|
-
} from "./chunk-BGGEVUJK.js";
|
|
17
|
-
|
|
18
|
-
// src/services/connection.ts
|
|
19
|
-
import { isNode } from "@lightsparkdev/core";
|
|
20
|
-
import { sha256 } from "@noble/hashes/sha2";
|
|
21
|
-
import { retryMiddleware } from "nice-grpc-client-middleware-retry";
|
|
22
|
-
import { Metadata } from "nice-grpc-common";
|
|
23
|
-
|
|
24
|
-
// src/proto/mock.ts
|
|
25
|
-
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
|
|
26
|
-
function interruptTransferRequest_InterruptTransferActionFromJSON(object) {
|
|
27
|
-
switch (object) {
|
|
28
|
-
case 0:
|
|
29
|
-
case "NONE":
|
|
30
|
-
return 0 /* NONE */;
|
|
31
|
-
case 1:
|
|
32
|
-
case "INTERRUPT":
|
|
33
|
-
return 1 /* INTERRUPT */;
|
|
34
|
-
case 2:
|
|
35
|
-
case "RESUME":
|
|
36
|
-
return 2 /* RESUME */;
|
|
37
|
-
case -1:
|
|
38
|
-
case "UNRECOGNIZED":
|
|
39
|
-
default:
|
|
40
|
-
return -1 /* UNRECOGNIZED */;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function interruptTransferRequest_InterruptTransferActionToJSON(object) {
|
|
44
|
-
switch (object) {
|
|
45
|
-
case 0 /* NONE */:
|
|
46
|
-
return "NONE";
|
|
47
|
-
case 1 /* INTERRUPT */:
|
|
48
|
-
return "INTERRUPT";
|
|
49
|
-
case 2 /* RESUME */:
|
|
50
|
-
return "RESUME";
|
|
51
|
-
case -1 /* UNRECOGNIZED */:
|
|
52
|
-
default:
|
|
53
|
-
return "UNRECOGNIZED";
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
function createBaseCleanUpPreimageShareRequest() {
|
|
57
|
-
return { paymentHash: new Uint8Array(0) };
|
|
58
|
-
}
|
|
59
|
-
var CleanUpPreimageShareRequest = {
|
|
60
|
-
encode(message, writer = new BinaryWriter()) {
|
|
61
|
-
if (message.paymentHash.length !== 0) {
|
|
62
|
-
writer.uint32(10).bytes(message.paymentHash);
|
|
63
|
-
}
|
|
64
|
-
return writer;
|
|
65
|
-
},
|
|
66
|
-
decode(input, length) {
|
|
67
|
-
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
|
|
68
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
69
|
-
const message = createBaseCleanUpPreimageShareRequest();
|
|
70
|
-
while (reader.pos < end) {
|
|
71
|
-
const tag = reader.uint32();
|
|
72
|
-
switch (tag >>> 3) {
|
|
73
|
-
case 1: {
|
|
74
|
-
if (tag !== 10) {
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
message.paymentHash = reader.bytes();
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
reader.skip(tag & 7);
|
|
85
|
-
}
|
|
86
|
-
return message;
|
|
87
|
-
},
|
|
88
|
-
fromJSON(object) {
|
|
89
|
-
return { paymentHash: isSet(object.paymentHash) ? bytesFromBase64(object.paymentHash) : new Uint8Array(0) };
|
|
90
|
-
},
|
|
91
|
-
toJSON(message) {
|
|
92
|
-
const obj = {};
|
|
93
|
-
if (message.paymentHash.length !== 0) {
|
|
94
|
-
obj.paymentHash = base64FromBytes(message.paymentHash);
|
|
95
|
-
}
|
|
96
|
-
return obj;
|
|
97
|
-
},
|
|
98
|
-
create(base) {
|
|
99
|
-
return CleanUpPreimageShareRequest.fromPartial(base ?? {});
|
|
100
|
-
},
|
|
101
|
-
fromPartial(object) {
|
|
102
|
-
const message = createBaseCleanUpPreimageShareRequest();
|
|
103
|
-
message.paymentHash = object.paymentHash ?? new Uint8Array(0);
|
|
104
|
-
return message;
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
function createBaseInterruptTransferRequest() {
|
|
108
|
-
return { action: 0 };
|
|
109
|
-
}
|
|
110
|
-
var InterruptTransferRequest = {
|
|
111
|
-
encode(message, writer = new BinaryWriter()) {
|
|
112
|
-
if (message.action !== 0) {
|
|
113
|
-
writer.uint32(8).int32(message.action);
|
|
114
|
-
}
|
|
115
|
-
return writer;
|
|
116
|
-
},
|
|
117
|
-
decode(input, length) {
|
|
118
|
-
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
|
|
119
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
120
|
-
const message = createBaseInterruptTransferRequest();
|
|
121
|
-
while (reader.pos < end) {
|
|
122
|
-
const tag = reader.uint32();
|
|
123
|
-
switch (tag >>> 3) {
|
|
124
|
-
case 1: {
|
|
125
|
-
if (tag !== 8) {
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
message.action = reader.int32();
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
reader.skip(tag & 7);
|
|
136
|
-
}
|
|
137
|
-
return message;
|
|
138
|
-
},
|
|
139
|
-
fromJSON(object) {
|
|
140
|
-
return {
|
|
141
|
-
action: isSet(object.action) ? interruptTransferRequest_InterruptTransferActionFromJSON(object.action) : 0
|
|
142
|
-
};
|
|
143
|
-
},
|
|
144
|
-
toJSON(message) {
|
|
145
|
-
const obj = {};
|
|
146
|
-
if (message.action !== 0) {
|
|
147
|
-
obj.action = interruptTransferRequest_InterruptTransferActionToJSON(message.action);
|
|
148
|
-
}
|
|
149
|
-
return obj;
|
|
150
|
-
},
|
|
151
|
-
create(base) {
|
|
152
|
-
return InterruptTransferRequest.fromPartial(base ?? {});
|
|
153
|
-
},
|
|
154
|
-
fromPartial(object) {
|
|
155
|
-
const message = createBaseInterruptTransferRequest();
|
|
156
|
-
message.action = object.action ?? 0;
|
|
157
|
-
return message;
|
|
158
|
-
}
|
|
159
|
-
};
|
|
160
|
-
function createBaseUpdateNodesStatusRequest() {
|
|
161
|
-
return { nodeIds: [], status: "" };
|
|
162
|
-
}
|
|
163
|
-
var UpdateNodesStatusRequest = {
|
|
164
|
-
encode(message, writer = new BinaryWriter()) {
|
|
165
|
-
for (const v of message.nodeIds) {
|
|
166
|
-
writer.uint32(10).string(v);
|
|
167
|
-
}
|
|
168
|
-
if (message.status !== "") {
|
|
169
|
-
writer.uint32(18).string(message.status);
|
|
170
|
-
}
|
|
171
|
-
return writer;
|
|
172
|
-
},
|
|
173
|
-
decode(input, length) {
|
|
174
|
-
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
|
|
175
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
176
|
-
const message = createBaseUpdateNodesStatusRequest();
|
|
177
|
-
while (reader.pos < end) {
|
|
178
|
-
const tag = reader.uint32();
|
|
179
|
-
switch (tag >>> 3) {
|
|
180
|
-
case 1: {
|
|
181
|
-
if (tag !== 10) {
|
|
182
|
-
break;
|
|
183
|
-
}
|
|
184
|
-
message.nodeIds.push(reader.string());
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
case 2: {
|
|
188
|
-
if (tag !== 18) {
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
message.status = reader.string();
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
reader.skip(tag & 7);
|
|
199
|
-
}
|
|
200
|
-
return message;
|
|
201
|
-
},
|
|
202
|
-
fromJSON(object) {
|
|
203
|
-
return {
|
|
204
|
-
nodeIds: globalThis.Array.isArray(object?.nodeIds) ? object.nodeIds.map((e) => globalThis.String(e)) : [],
|
|
205
|
-
status: isSet(object.status) ? globalThis.String(object.status) : ""
|
|
206
|
-
};
|
|
207
|
-
},
|
|
208
|
-
toJSON(message) {
|
|
209
|
-
const obj = {};
|
|
210
|
-
if (message.nodeIds?.length) {
|
|
211
|
-
obj.nodeIds = message.nodeIds;
|
|
212
|
-
}
|
|
213
|
-
if (message.status !== "") {
|
|
214
|
-
obj.status = message.status;
|
|
215
|
-
}
|
|
216
|
-
return obj;
|
|
217
|
-
},
|
|
218
|
-
create(base) {
|
|
219
|
-
return UpdateNodesStatusRequest.fromPartial(base ?? {});
|
|
220
|
-
},
|
|
221
|
-
fromPartial(object) {
|
|
222
|
-
const message = createBaseUpdateNodesStatusRequest();
|
|
223
|
-
message.nodeIds = object.nodeIds?.map((e) => e) || [];
|
|
224
|
-
message.status = object.status ?? "";
|
|
225
|
-
return message;
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
var MockServiceDefinition = {
|
|
229
|
-
name: "MockService",
|
|
230
|
-
fullName: "mock.MockService",
|
|
231
|
-
methods: {
|
|
232
|
-
clean_up_preimage_share: {
|
|
233
|
-
name: "clean_up_preimage_share",
|
|
234
|
-
requestType: CleanUpPreimageShareRequest,
|
|
235
|
-
requestStream: false,
|
|
236
|
-
responseType: Empty,
|
|
237
|
-
responseStream: false,
|
|
238
|
-
options: {}
|
|
239
|
-
},
|
|
240
|
-
interrupt_transfer: {
|
|
241
|
-
name: "interrupt_transfer",
|
|
242
|
-
requestType: InterruptTransferRequest,
|
|
243
|
-
requestStream: false,
|
|
244
|
-
responseType: Empty,
|
|
245
|
-
responseStream: false,
|
|
246
|
-
options: {}
|
|
247
|
-
},
|
|
248
|
-
update_nodes_status: {
|
|
249
|
-
name: "update_nodes_status",
|
|
250
|
-
requestType: UpdateNodesStatusRequest,
|
|
251
|
-
requestStream: false,
|
|
252
|
-
responseType: Empty,
|
|
253
|
-
responseStream: false,
|
|
254
|
-
options: {}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
};
|
|
258
|
-
function bytesFromBase64(b64) {
|
|
259
|
-
if (globalThis.Buffer) {
|
|
260
|
-
return Uint8Array.from(globalThis.Buffer.from(b64, "base64"));
|
|
261
|
-
} else {
|
|
262
|
-
const bin = globalThis.atob(b64);
|
|
263
|
-
const arr = new Uint8Array(bin.length);
|
|
264
|
-
for (let i = 0; i < bin.length; ++i) {
|
|
265
|
-
arr[i] = bin.charCodeAt(i);
|
|
266
|
-
}
|
|
267
|
-
return arr;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
function base64FromBytes(arr) {
|
|
271
|
-
if (globalThis.Buffer) {
|
|
272
|
-
return globalThis.Buffer.from(arr).toString("base64");
|
|
273
|
-
} else {
|
|
274
|
-
const bin = [];
|
|
275
|
-
arr.forEach((byte) => {
|
|
276
|
-
bin.push(globalThis.String.fromCharCode(byte));
|
|
277
|
-
});
|
|
278
|
-
return globalThis.btoa(bin.join(""));
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
function isSet(value) {
|
|
282
|
-
return value !== null && value !== void 0;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// src/proto/spark_authn.ts
|
|
286
|
-
import { BinaryReader as BinaryReader2, BinaryWriter as BinaryWriter2 } from "@bufbuild/protobuf/wire";
|
|
287
|
-
function createBaseChallenge() {
|
|
288
|
-
return { version: 0, timestamp: 0, nonce: new Uint8Array(0), publicKey: new Uint8Array(0) };
|
|
289
|
-
}
|
|
290
|
-
var Challenge = {
|
|
291
|
-
encode(message, writer = new BinaryWriter2()) {
|
|
292
|
-
if (message.version !== 0) {
|
|
293
|
-
writer.uint32(8).int32(message.version);
|
|
294
|
-
}
|
|
295
|
-
if (message.timestamp !== 0) {
|
|
296
|
-
writer.uint32(16).int64(message.timestamp);
|
|
297
|
-
}
|
|
298
|
-
if (message.nonce.length !== 0) {
|
|
299
|
-
writer.uint32(26).bytes(message.nonce);
|
|
300
|
-
}
|
|
301
|
-
if (message.publicKey.length !== 0) {
|
|
302
|
-
writer.uint32(34).bytes(message.publicKey);
|
|
303
|
-
}
|
|
304
|
-
return writer;
|
|
305
|
-
},
|
|
306
|
-
decode(input, length) {
|
|
307
|
-
const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
|
|
308
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
309
|
-
const message = createBaseChallenge();
|
|
310
|
-
while (reader.pos < end) {
|
|
311
|
-
const tag = reader.uint32();
|
|
312
|
-
switch (tag >>> 3) {
|
|
313
|
-
case 1: {
|
|
314
|
-
if (tag !== 8) {
|
|
315
|
-
break;
|
|
316
|
-
}
|
|
317
|
-
message.version = reader.int32();
|
|
318
|
-
continue;
|
|
319
|
-
}
|
|
320
|
-
case 2: {
|
|
321
|
-
if (tag !== 16) {
|
|
322
|
-
break;
|
|
323
|
-
}
|
|
324
|
-
message.timestamp = longToNumber(reader.int64());
|
|
325
|
-
continue;
|
|
326
|
-
}
|
|
327
|
-
case 3: {
|
|
328
|
-
if (tag !== 26) {
|
|
329
|
-
break;
|
|
330
|
-
}
|
|
331
|
-
message.nonce = reader.bytes();
|
|
332
|
-
continue;
|
|
333
|
-
}
|
|
334
|
-
case 4: {
|
|
335
|
-
if (tag !== 34) {
|
|
336
|
-
break;
|
|
337
|
-
}
|
|
338
|
-
message.publicKey = reader.bytes();
|
|
339
|
-
continue;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
343
|
-
break;
|
|
344
|
-
}
|
|
345
|
-
reader.skip(tag & 7);
|
|
346
|
-
}
|
|
347
|
-
return message;
|
|
348
|
-
},
|
|
349
|
-
fromJSON(object) {
|
|
350
|
-
return {
|
|
351
|
-
version: isSet2(object.version) ? globalThis.Number(object.version) : 0,
|
|
352
|
-
timestamp: isSet2(object.timestamp) ? globalThis.Number(object.timestamp) : 0,
|
|
353
|
-
nonce: isSet2(object.nonce) ? bytesFromBase642(object.nonce) : new Uint8Array(0),
|
|
354
|
-
publicKey: isSet2(object.publicKey) ? bytesFromBase642(object.publicKey) : new Uint8Array(0)
|
|
355
|
-
};
|
|
356
|
-
},
|
|
357
|
-
toJSON(message) {
|
|
358
|
-
const obj = {};
|
|
359
|
-
if (message.version !== 0) {
|
|
360
|
-
obj.version = Math.round(message.version);
|
|
361
|
-
}
|
|
362
|
-
if (message.timestamp !== 0) {
|
|
363
|
-
obj.timestamp = Math.round(message.timestamp);
|
|
364
|
-
}
|
|
365
|
-
if (message.nonce.length !== 0) {
|
|
366
|
-
obj.nonce = base64FromBytes2(message.nonce);
|
|
367
|
-
}
|
|
368
|
-
if (message.publicKey.length !== 0) {
|
|
369
|
-
obj.publicKey = base64FromBytes2(message.publicKey);
|
|
370
|
-
}
|
|
371
|
-
return obj;
|
|
372
|
-
},
|
|
373
|
-
create(base) {
|
|
374
|
-
return Challenge.fromPartial(base ?? {});
|
|
375
|
-
},
|
|
376
|
-
fromPartial(object) {
|
|
377
|
-
const message = createBaseChallenge();
|
|
378
|
-
message.version = object.version ?? 0;
|
|
379
|
-
message.timestamp = object.timestamp ?? 0;
|
|
380
|
-
message.nonce = object.nonce ?? new Uint8Array(0);
|
|
381
|
-
message.publicKey = object.publicKey ?? new Uint8Array(0);
|
|
382
|
-
return message;
|
|
383
|
-
}
|
|
384
|
-
};
|
|
385
|
-
function createBaseProtectedChallenge() {
|
|
386
|
-
return { version: 0, challenge: void 0, serverHmac: new Uint8Array(0) };
|
|
387
|
-
}
|
|
388
|
-
var ProtectedChallenge = {
|
|
389
|
-
encode(message, writer = new BinaryWriter2()) {
|
|
390
|
-
if (message.version !== 0) {
|
|
391
|
-
writer.uint32(8).int32(message.version);
|
|
392
|
-
}
|
|
393
|
-
if (message.challenge !== void 0) {
|
|
394
|
-
Challenge.encode(message.challenge, writer.uint32(18).fork()).join();
|
|
395
|
-
}
|
|
396
|
-
if (message.serverHmac.length !== 0) {
|
|
397
|
-
writer.uint32(26).bytes(message.serverHmac);
|
|
398
|
-
}
|
|
399
|
-
return writer;
|
|
400
|
-
},
|
|
401
|
-
decode(input, length) {
|
|
402
|
-
const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
|
|
403
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
404
|
-
const message = createBaseProtectedChallenge();
|
|
405
|
-
while (reader.pos < end) {
|
|
406
|
-
const tag = reader.uint32();
|
|
407
|
-
switch (tag >>> 3) {
|
|
408
|
-
case 1: {
|
|
409
|
-
if (tag !== 8) {
|
|
410
|
-
break;
|
|
411
|
-
}
|
|
412
|
-
message.version = reader.int32();
|
|
413
|
-
continue;
|
|
414
|
-
}
|
|
415
|
-
case 2: {
|
|
416
|
-
if (tag !== 18) {
|
|
417
|
-
break;
|
|
418
|
-
}
|
|
419
|
-
message.challenge = Challenge.decode(reader, reader.uint32());
|
|
420
|
-
continue;
|
|
421
|
-
}
|
|
422
|
-
case 3: {
|
|
423
|
-
if (tag !== 26) {
|
|
424
|
-
break;
|
|
425
|
-
}
|
|
426
|
-
message.serverHmac = reader.bytes();
|
|
427
|
-
continue;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
431
|
-
break;
|
|
432
|
-
}
|
|
433
|
-
reader.skip(tag & 7);
|
|
434
|
-
}
|
|
435
|
-
return message;
|
|
436
|
-
},
|
|
437
|
-
fromJSON(object) {
|
|
438
|
-
return {
|
|
439
|
-
version: isSet2(object.version) ? globalThis.Number(object.version) : 0,
|
|
440
|
-
challenge: isSet2(object.challenge) ? Challenge.fromJSON(object.challenge) : void 0,
|
|
441
|
-
serverHmac: isSet2(object.serverHmac) ? bytesFromBase642(object.serverHmac) : new Uint8Array(0)
|
|
442
|
-
};
|
|
443
|
-
},
|
|
444
|
-
toJSON(message) {
|
|
445
|
-
const obj = {};
|
|
446
|
-
if (message.version !== 0) {
|
|
447
|
-
obj.version = Math.round(message.version);
|
|
448
|
-
}
|
|
449
|
-
if (message.challenge !== void 0) {
|
|
450
|
-
obj.challenge = Challenge.toJSON(message.challenge);
|
|
451
|
-
}
|
|
452
|
-
if (message.serverHmac.length !== 0) {
|
|
453
|
-
obj.serverHmac = base64FromBytes2(message.serverHmac);
|
|
454
|
-
}
|
|
455
|
-
return obj;
|
|
456
|
-
},
|
|
457
|
-
create(base) {
|
|
458
|
-
return ProtectedChallenge.fromPartial(base ?? {});
|
|
459
|
-
},
|
|
460
|
-
fromPartial(object) {
|
|
461
|
-
const message = createBaseProtectedChallenge();
|
|
462
|
-
message.version = object.version ?? 0;
|
|
463
|
-
message.challenge = object.challenge !== void 0 && object.challenge !== null ? Challenge.fromPartial(object.challenge) : void 0;
|
|
464
|
-
message.serverHmac = object.serverHmac ?? new Uint8Array(0);
|
|
465
|
-
return message;
|
|
466
|
-
}
|
|
467
|
-
};
|
|
468
|
-
function createBaseGetChallengeRequest() {
|
|
469
|
-
return { publicKey: new Uint8Array(0) };
|
|
470
|
-
}
|
|
471
|
-
var GetChallengeRequest = {
|
|
472
|
-
encode(message, writer = new BinaryWriter2()) {
|
|
473
|
-
if (message.publicKey.length !== 0) {
|
|
474
|
-
writer.uint32(10).bytes(message.publicKey);
|
|
475
|
-
}
|
|
476
|
-
return writer;
|
|
477
|
-
},
|
|
478
|
-
decode(input, length) {
|
|
479
|
-
const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
|
|
480
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
481
|
-
const message = createBaseGetChallengeRequest();
|
|
482
|
-
while (reader.pos < end) {
|
|
483
|
-
const tag = reader.uint32();
|
|
484
|
-
switch (tag >>> 3) {
|
|
485
|
-
case 1: {
|
|
486
|
-
if (tag !== 10) {
|
|
487
|
-
break;
|
|
488
|
-
}
|
|
489
|
-
message.publicKey = reader.bytes();
|
|
490
|
-
continue;
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
494
|
-
break;
|
|
495
|
-
}
|
|
496
|
-
reader.skip(tag & 7);
|
|
497
|
-
}
|
|
498
|
-
return message;
|
|
499
|
-
},
|
|
500
|
-
fromJSON(object) {
|
|
501
|
-
return { publicKey: isSet2(object.publicKey) ? bytesFromBase642(object.publicKey) : new Uint8Array(0) };
|
|
502
|
-
},
|
|
503
|
-
toJSON(message) {
|
|
504
|
-
const obj = {};
|
|
505
|
-
if (message.publicKey.length !== 0) {
|
|
506
|
-
obj.publicKey = base64FromBytes2(message.publicKey);
|
|
507
|
-
}
|
|
508
|
-
return obj;
|
|
509
|
-
},
|
|
510
|
-
create(base) {
|
|
511
|
-
return GetChallengeRequest.fromPartial(base ?? {});
|
|
512
|
-
},
|
|
513
|
-
fromPartial(object) {
|
|
514
|
-
const message = createBaseGetChallengeRequest();
|
|
515
|
-
message.publicKey = object.publicKey ?? new Uint8Array(0);
|
|
516
|
-
return message;
|
|
517
|
-
}
|
|
518
|
-
};
|
|
519
|
-
function createBaseGetChallengeResponse() {
|
|
520
|
-
return { protectedChallenge: void 0 };
|
|
521
|
-
}
|
|
522
|
-
var GetChallengeResponse = {
|
|
523
|
-
encode(message, writer = new BinaryWriter2()) {
|
|
524
|
-
if (message.protectedChallenge !== void 0) {
|
|
525
|
-
ProtectedChallenge.encode(message.protectedChallenge, writer.uint32(10).fork()).join();
|
|
526
|
-
}
|
|
527
|
-
return writer;
|
|
528
|
-
},
|
|
529
|
-
decode(input, length) {
|
|
530
|
-
const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
|
|
531
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
532
|
-
const message = createBaseGetChallengeResponse();
|
|
533
|
-
while (reader.pos < end) {
|
|
534
|
-
const tag = reader.uint32();
|
|
535
|
-
switch (tag >>> 3) {
|
|
536
|
-
case 1: {
|
|
537
|
-
if (tag !== 10) {
|
|
538
|
-
break;
|
|
539
|
-
}
|
|
540
|
-
message.protectedChallenge = ProtectedChallenge.decode(reader, reader.uint32());
|
|
541
|
-
continue;
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
545
|
-
break;
|
|
546
|
-
}
|
|
547
|
-
reader.skip(tag & 7);
|
|
548
|
-
}
|
|
549
|
-
return message;
|
|
550
|
-
},
|
|
551
|
-
fromJSON(object) {
|
|
552
|
-
return {
|
|
553
|
-
protectedChallenge: isSet2(object.protectedChallenge) ? ProtectedChallenge.fromJSON(object.protectedChallenge) : void 0
|
|
554
|
-
};
|
|
555
|
-
},
|
|
556
|
-
toJSON(message) {
|
|
557
|
-
const obj = {};
|
|
558
|
-
if (message.protectedChallenge !== void 0) {
|
|
559
|
-
obj.protectedChallenge = ProtectedChallenge.toJSON(message.protectedChallenge);
|
|
560
|
-
}
|
|
561
|
-
return obj;
|
|
562
|
-
},
|
|
563
|
-
create(base) {
|
|
564
|
-
return GetChallengeResponse.fromPartial(base ?? {});
|
|
565
|
-
},
|
|
566
|
-
fromPartial(object) {
|
|
567
|
-
const message = createBaseGetChallengeResponse();
|
|
568
|
-
message.protectedChallenge = object.protectedChallenge !== void 0 && object.protectedChallenge !== null ? ProtectedChallenge.fromPartial(object.protectedChallenge) : void 0;
|
|
569
|
-
return message;
|
|
570
|
-
}
|
|
571
|
-
};
|
|
572
|
-
function createBaseVerifyChallengeRequest() {
|
|
573
|
-
return { protectedChallenge: void 0, signature: new Uint8Array(0), publicKey: new Uint8Array(0) };
|
|
574
|
-
}
|
|
575
|
-
var VerifyChallengeRequest = {
|
|
576
|
-
encode(message, writer = new BinaryWriter2()) {
|
|
577
|
-
if (message.protectedChallenge !== void 0) {
|
|
578
|
-
ProtectedChallenge.encode(message.protectedChallenge, writer.uint32(10).fork()).join();
|
|
579
|
-
}
|
|
580
|
-
if (message.signature.length !== 0) {
|
|
581
|
-
writer.uint32(18).bytes(message.signature);
|
|
582
|
-
}
|
|
583
|
-
if (message.publicKey.length !== 0) {
|
|
584
|
-
writer.uint32(26).bytes(message.publicKey);
|
|
585
|
-
}
|
|
586
|
-
return writer;
|
|
587
|
-
},
|
|
588
|
-
decode(input, length) {
|
|
589
|
-
const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
|
|
590
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
591
|
-
const message = createBaseVerifyChallengeRequest();
|
|
592
|
-
while (reader.pos < end) {
|
|
593
|
-
const tag = reader.uint32();
|
|
594
|
-
switch (tag >>> 3) {
|
|
595
|
-
case 1: {
|
|
596
|
-
if (tag !== 10) {
|
|
597
|
-
break;
|
|
598
|
-
}
|
|
599
|
-
message.protectedChallenge = ProtectedChallenge.decode(reader, reader.uint32());
|
|
600
|
-
continue;
|
|
601
|
-
}
|
|
602
|
-
case 2: {
|
|
603
|
-
if (tag !== 18) {
|
|
604
|
-
break;
|
|
605
|
-
}
|
|
606
|
-
message.signature = reader.bytes();
|
|
607
|
-
continue;
|
|
608
|
-
}
|
|
609
|
-
case 3: {
|
|
610
|
-
if (tag !== 26) {
|
|
611
|
-
break;
|
|
612
|
-
}
|
|
613
|
-
message.publicKey = reader.bytes();
|
|
614
|
-
continue;
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
618
|
-
break;
|
|
619
|
-
}
|
|
620
|
-
reader.skip(tag & 7);
|
|
621
|
-
}
|
|
622
|
-
return message;
|
|
623
|
-
},
|
|
624
|
-
fromJSON(object) {
|
|
625
|
-
return {
|
|
626
|
-
protectedChallenge: isSet2(object.protectedChallenge) ? ProtectedChallenge.fromJSON(object.protectedChallenge) : void 0,
|
|
627
|
-
signature: isSet2(object.signature) ? bytesFromBase642(object.signature) : new Uint8Array(0),
|
|
628
|
-
publicKey: isSet2(object.publicKey) ? bytesFromBase642(object.publicKey) : new Uint8Array(0)
|
|
629
|
-
};
|
|
630
|
-
},
|
|
631
|
-
toJSON(message) {
|
|
632
|
-
const obj = {};
|
|
633
|
-
if (message.protectedChallenge !== void 0) {
|
|
634
|
-
obj.protectedChallenge = ProtectedChallenge.toJSON(message.protectedChallenge);
|
|
635
|
-
}
|
|
636
|
-
if (message.signature.length !== 0) {
|
|
637
|
-
obj.signature = base64FromBytes2(message.signature);
|
|
638
|
-
}
|
|
639
|
-
if (message.publicKey.length !== 0) {
|
|
640
|
-
obj.publicKey = base64FromBytes2(message.publicKey);
|
|
641
|
-
}
|
|
642
|
-
return obj;
|
|
643
|
-
},
|
|
644
|
-
create(base) {
|
|
645
|
-
return VerifyChallengeRequest.fromPartial(base ?? {});
|
|
646
|
-
},
|
|
647
|
-
fromPartial(object) {
|
|
648
|
-
const message = createBaseVerifyChallengeRequest();
|
|
649
|
-
message.protectedChallenge = object.protectedChallenge !== void 0 && object.protectedChallenge !== null ? ProtectedChallenge.fromPartial(object.protectedChallenge) : void 0;
|
|
650
|
-
message.signature = object.signature ?? new Uint8Array(0);
|
|
651
|
-
message.publicKey = object.publicKey ?? new Uint8Array(0);
|
|
652
|
-
return message;
|
|
653
|
-
}
|
|
654
|
-
};
|
|
655
|
-
function createBaseVerifyChallengeResponse() {
|
|
656
|
-
return { sessionToken: "", expirationTimestamp: 0 };
|
|
657
|
-
}
|
|
658
|
-
var VerifyChallengeResponse = {
|
|
659
|
-
encode(message, writer = new BinaryWriter2()) {
|
|
660
|
-
if (message.sessionToken !== "") {
|
|
661
|
-
writer.uint32(10).string(message.sessionToken);
|
|
662
|
-
}
|
|
663
|
-
if (message.expirationTimestamp !== 0) {
|
|
664
|
-
writer.uint32(16).int64(message.expirationTimestamp);
|
|
665
|
-
}
|
|
666
|
-
return writer;
|
|
667
|
-
},
|
|
668
|
-
decode(input, length) {
|
|
669
|
-
const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
|
|
670
|
-
const end = length === void 0 ? reader.len : reader.pos + length;
|
|
671
|
-
const message = createBaseVerifyChallengeResponse();
|
|
672
|
-
while (reader.pos < end) {
|
|
673
|
-
const tag = reader.uint32();
|
|
674
|
-
switch (tag >>> 3) {
|
|
675
|
-
case 1: {
|
|
676
|
-
if (tag !== 10) {
|
|
677
|
-
break;
|
|
678
|
-
}
|
|
679
|
-
message.sessionToken = reader.string();
|
|
680
|
-
continue;
|
|
681
|
-
}
|
|
682
|
-
case 2: {
|
|
683
|
-
if (tag !== 16) {
|
|
684
|
-
break;
|
|
685
|
-
}
|
|
686
|
-
message.expirationTimestamp = longToNumber(reader.int64());
|
|
687
|
-
continue;
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
if ((tag & 7) === 4 || tag === 0) {
|
|
691
|
-
break;
|
|
692
|
-
}
|
|
693
|
-
reader.skip(tag & 7);
|
|
694
|
-
}
|
|
695
|
-
return message;
|
|
696
|
-
},
|
|
697
|
-
fromJSON(object) {
|
|
698
|
-
return {
|
|
699
|
-
sessionToken: isSet2(object.sessionToken) ? globalThis.String(object.sessionToken) : "",
|
|
700
|
-
expirationTimestamp: isSet2(object.expirationTimestamp) ? globalThis.Number(object.expirationTimestamp) : 0
|
|
701
|
-
};
|
|
702
|
-
},
|
|
703
|
-
toJSON(message) {
|
|
704
|
-
const obj = {};
|
|
705
|
-
if (message.sessionToken !== "") {
|
|
706
|
-
obj.sessionToken = message.sessionToken;
|
|
707
|
-
}
|
|
708
|
-
if (message.expirationTimestamp !== 0) {
|
|
709
|
-
obj.expirationTimestamp = Math.round(message.expirationTimestamp);
|
|
710
|
-
}
|
|
711
|
-
return obj;
|
|
712
|
-
},
|
|
713
|
-
create(base) {
|
|
714
|
-
return VerifyChallengeResponse.fromPartial(base ?? {});
|
|
715
|
-
},
|
|
716
|
-
fromPartial(object) {
|
|
717
|
-
const message = createBaseVerifyChallengeResponse();
|
|
718
|
-
message.sessionToken = object.sessionToken ?? "";
|
|
719
|
-
message.expirationTimestamp = object.expirationTimestamp ?? 0;
|
|
720
|
-
return message;
|
|
721
|
-
}
|
|
722
|
-
};
|
|
723
|
-
var SparkAuthnServiceDefinition = {
|
|
724
|
-
name: "SparkAuthnService",
|
|
725
|
-
fullName: "spark_authn.SparkAuthnService",
|
|
726
|
-
methods: {
|
|
727
|
-
/** Request a new authentication challenge for a public key */
|
|
728
|
-
get_challenge: {
|
|
729
|
-
name: "get_challenge",
|
|
730
|
-
requestType: GetChallengeRequest,
|
|
731
|
-
requestStream: false,
|
|
732
|
-
responseType: GetChallengeResponse,
|
|
733
|
-
responseStream: false,
|
|
734
|
-
options: {}
|
|
735
|
-
},
|
|
736
|
-
/** Verify a signed challenge and return a session token */
|
|
737
|
-
verify_challenge: {
|
|
738
|
-
name: "verify_challenge",
|
|
739
|
-
requestType: VerifyChallengeRequest,
|
|
740
|
-
requestStream: false,
|
|
741
|
-
responseType: VerifyChallengeResponse,
|
|
742
|
-
responseStream: false,
|
|
743
|
-
options: {}
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
};
|
|
747
|
-
function bytesFromBase642(b64) {
|
|
748
|
-
if (globalThis.Buffer) {
|
|
749
|
-
return Uint8Array.from(globalThis.Buffer.from(b64, "base64"));
|
|
750
|
-
} else {
|
|
751
|
-
const bin = globalThis.atob(b64);
|
|
752
|
-
const arr = new Uint8Array(bin.length);
|
|
753
|
-
for (let i = 0; i < bin.length; ++i) {
|
|
754
|
-
arr[i] = bin.charCodeAt(i);
|
|
755
|
-
}
|
|
756
|
-
return arr;
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
function base64FromBytes2(arr) {
|
|
760
|
-
if (globalThis.Buffer) {
|
|
761
|
-
return globalThis.Buffer.from(arr).toString("base64");
|
|
762
|
-
} else {
|
|
763
|
-
const bin = [];
|
|
764
|
-
arr.forEach((byte) => {
|
|
765
|
-
bin.push(globalThis.String.fromCharCode(byte));
|
|
766
|
-
});
|
|
767
|
-
return globalThis.btoa(bin.join(""));
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
function longToNumber(int64) {
|
|
771
|
-
const num = globalThis.Number(int64.toString());
|
|
772
|
-
if (num > globalThis.Number.MAX_SAFE_INTEGER) {
|
|
773
|
-
throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
|
|
774
|
-
}
|
|
775
|
-
if (num < globalThis.Number.MIN_SAFE_INTEGER) {
|
|
776
|
-
throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER");
|
|
777
|
-
}
|
|
778
|
-
return num;
|
|
779
|
-
}
|
|
780
|
-
function isSet2(value) {
|
|
781
|
-
return value !== null && value !== void 0;
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
// src/services/connection.ts
|
|
785
|
-
var ConnectionManager = class {
|
|
786
|
-
config;
|
|
787
|
-
clients = /* @__PURE__ */ new Map();
|
|
788
|
-
tokenClients = /* @__PURE__ */ new Map();
|
|
789
|
-
// We are going to .unref() the underlying channels for stream clients
|
|
790
|
-
// to prevent the stream from keeping the process alive
|
|
791
|
-
// Using a different map to avoid unforeseen problems with unary calls
|
|
792
|
-
streamClients = /* @__PURE__ */ new Map();
|
|
793
|
-
constructor(config) {
|
|
794
|
-
this.config = config;
|
|
795
|
-
}
|
|
796
|
-
// When initializing wallet, go ahead and instantiate all clients
|
|
797
|
-
async createClients() {
|
|
798
|
-
await Promise.all(
|
|
799
|
-
Object.values(this.config.getSigningOperators()).map((operator) => {
|
|
800
|
-
this.createSparkClient(operator.address);
|
|
801
|
-
})
|
|
802
|
-
);
|
|
803
|
-
}
|
|
804
|
-
async closeConnections() {
|
|
805
|
-
await Promise.all(
|
|
806
|
-
Array.from(this.clients.values()).map(
|
|
807
|
-
(client) => client.client.close?.()
|
|
808
|
-
)
|
|
809
|
-
);
|
|
810
|
-
this.clients.clear();
|
|
811
|
-
}
|
|
812
|
-
async createMockClient(address) {
|
|
813
|
-
const channel = await this.createChannelWithTLS(address);
|
|
814
|
-
const isNodeChannel = "close" in channel;
|
|
815
|
-
if (isNode && isNodeChannel && !isBun) {
|
|
816
|
-
const grpcModule = await import("nice-grpc");
|
|
817
|
-
const { createClient } = "default" in grpcModule ? grpcModule.default : grpcModule;
|
|
818
|
-
const client = createClient(MockServiceDefinition, channel);
|
|
819
|
-
return { ...client, close: () => channel.close() };
|
|
820
|
-
} else if (!isNodeChannel) {
|
|
821
|
-
const grpcModule = await import("nice-grpc-web");
|
|
822
|
-
const { createClient } = "default" in grpcModule ? grpcModule.default : grpcModule;
|
|
823
|
-
const client = createClient(MockServiceDefinition, channel);
|
|
824
|
-
return { ...client, close: () => {
|
|
825
|
-
} };
|
|
826
|
-
} else {
|
|
827
|
-
throw new Error("Channel does not have close in NodeJS environment");
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
async createChannelWithTLS(address, certPath) {
|
|
831
|
-
try {
|
|
832
|
-
if (isNode && !isBun) {
|
|
833
|
-
const grpcModule = await import("nice-grpc");
|
|
834
|
-
const { ChannelCredentials, createChannel } = "default" in grpcModule ? grpcModule.default : grpcModule;
|
|
835
|
-
if (certPath) {
|
|
836
|
-
try {
|
|
837
|
-
const fs = await import("fs");
|
|
838
|
-
const cert = fs.readFileSync(certPath);
|
|
839
|
-
return createChannel(address, ChannelCredentials.createSsl(cert));
|
|
840
|
-
} catch (error) {
|
|
841
|
-
console.error("Error reading certificate:", error);
|
|
842
|
-
return createChannel(
|
|
843
|
-
address,
|
|
844
|
-
ChannelCredentials.createSsl(null, null, null, {
|
|
845
|
-
rejectUnauthorized: false
|
|
846
|
-
})
|
|
847
|
-
);
|
|
848
|
-
}
|
|
849
|
-
} else {
|
|
850
|
-
return createChannel(
|
|
851
|
-
address,
|
|
852
|
-
ChannelCredentials.createSsl(null, null, null, {
|
|
853
|
-
rejectUnauthorized: false
|
|
854
|
-
})
|
|
855
|
-
);
|
|
856
|
-
}
|
|
857
|
-
} else {
|
|
858
|
-
const grpcModule = await import("nice-grpc-web");
|
|
859
|
-
const { createChannel, FetchTransport } = "default" in grpcModule ? grpcModule.default : grpcModule;
|
|
860
|
-
const { XHRTransport } = await import("./xhr-transport-RH6LDRXS.js");
|
|
861
|
-
return createChannel(
|
|
862
|
-
address,
|
|
863
|
-
isReactNative ? XHRTransport() : FetchTransport()
|
|
864
|
-
);
|
|
865
|
-
}
|
|
866
|
-
} catch (error) {
|
|
867
|
-
console.error("Channel creation error:", error);
|
|
868
|
-
throw new NetworkError(
|
|
869
|
-
"Failed to create channel",
|
|
870
|
-
{
|
|
871
|
-
url: address,
|
|
872
|
-
operation: "createChannel",
|
|
873
|
-
errorCount: 1,
|
|
874
|
-
errors: error instanceof Error ? error.message : String(error)
|
|
875
|
-
},
|
|
876
|
-
error
|
|
877
|
-
);
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
async createSparkStreamClient(address, certPath) {
|
|
881
|
-
if (this.streamClients.has(address)) {
|
|
882
|
-
return this.streamClients.get(address).client;
|
|
883
|
-
}
|
|
884
|
-
const authToken = await this.authenticate(address);
|
|
885
|
-
const channel = await this.createChannelWithTLS(address, certPath);
|
|
886
|
-
const middleware = this.createMiddleware(address, authToken);
|
|
887
|
-
const client = await this.createGrpcClient(
|
|
888
|
-
SparkServiceDefinition,
|
|
889
|
-
channel,
|
|
890
|
-
true,
|
|
891
|
-
middleware
|
|
892
|
-
);
|
|
893
|
-
this.streamClients.set(address, { client, authToken, channel });
|
|
894
|
-
return client;
|
|
895
|
-
}
|
|
896
|
-
async createSparkClient(address, certPath) {
|
|
897
|
-
if (this.clients.has(address)) {
|
|
898
|
-
return this.clients.get(address).client;
|
|
899
|
-
}
|
|
900
|
-
const authToken = await this.authenticate(address);
|
|
901
|
-
const channel = await this.createChannelWithTLS(address, certPath);
|
|
902
|
-
const middleware = this.createMiddleware(address, authToken);
|
|
903
|
-
const client = await this.createGrpcClient(
|
|
904
|
-
SparkServiceDefinition,
|
|
905
|
-
channel,
|
|
906
|
-
true,
|
|
907
|
-
middleware
|
|
908
|
-
);
|
|
909
|
-
this.clients.set(address, { client, authToken });
|
|
910
|
-
return client;
|
|
911
|
-
}
|
|
912
|
-
async createSparkTokenClient(address, certPath) {
|
|
913
|
-
if (this.tokenClients.has(address)) {
|
|
914
|
-
return this.tokenClients.get(address).client;
|
|
915
|
-
}
|
|
916
|
-
const authToken = await this.authenticate(address);
|
|
917
|
-
const channel = await this.createChannelWithTLS(address, certPath);
|
|
918
|
-
const middleware = this.createMiddleware(address, authToken);
|
|
919
|
-
const tokenClient = await this.createGrpcClient(
|
|
920
|
-
SparkTokenServiceDefinition,
|
|
921
|
-
channel,
|
|
922
|
-
true,
|
|
923
|
-
middleware
|
|
924
|
-
);
|
|
925
|
-
this.tokenClients.set(address, { client: tokenClient, authToken });
|
|
926
|
-
return tokenClient;
|
|
927
|
-
}
|
|
928
|
-
async getStreamChannel(address) {
|
|
929
|
-
return this.streamClients.get(address)?.channel;
|
|
930
|
-
}
|
|
931
|
-
async authenticate(address, certPath) {
|
|
932
|
-
try {
|
|
933
|
-
const identityPublicKey = await this.config.signer.getIdentityPublicKey();
|
|
934
|
-
const sparkAuthnClient = await this.createSparkAuthnGrpcConnection(
|
|
935
|
-
address,
|
|
936
|
-
certPath
|
|
937
|
-
);
|
|
938
|
-
const challengeResp = await sparkAuthnClient.get_challenge({
|
|
939
|
-
publicKey: identityPublicKey
|
|
940
|
-
});
|
|
941
|
-
if (!challengeResp.protectedChallenge?.challenge) {
|
|
942
|
-
throw new AuthenticationError("Invalid challenge response", {
|
|
943
|
-
endpoint: "get_challenge",
|
|
944
|
-
reason: "Missing challenge in response"
|
|
945
|
-
});
|
|
946
|
-
}
|
|
947
|
-
const challengeBytes = Challenge.encode(
|
|
948
|
-
challengeResp.protectedChallenge.challenge
|
|
949
|
-
).finish();
|
|
950
|
-
const hash = sha256(challengeBytes);
|
|
951
|
-
const derSignatureBytes = await this.config.signer.signMessageWithIdentityKey(hash);
|
|
952
|
-
const verifyResp = await sparkAuthnClient.verify_challenge({
|
|
953
|
-
protectedChallenge: challengeResp.protectedChallenge,
|
|
954
|
-
signature: derSignatureBytes,
|
|
955
|
-
publicKey: identityPublicKey
|
|
956
|
-
});
|
|
957
|
-
sparkAuthnClient.close?.();
|
|
958
|
-
return verifyResp.sessionToken;
|
|
959
|
-
} catch (error) {
|
|
960
|
-
console.error("Authentication error:", error);
|
|
961
|
-
throw new AuthenticationError(
|
|
962
|
-
"Authentication failed",
|
|
963
|
-
{
|
|
964
|
-
endpoint: "authenticate",
|
|
965
|
-
reason: error.message
|
|
966
|
-
},
|
|
967
|
-
error
|
|
968
|
-
);
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
async createSparkAuthnGrpcConnection(address, certPath) {
|
|
972
|
-
const channel = await this.createChannelWithTLS(address, certPath);
|
|
973
|
-
const authnMiddleware = this.createAuthnMiddleware();
|
|
974
|
-
return this.createGrpcClient(
|
|
975
|
-
SparkAuthnServiceDefinition,
|
|
976
|
-
channel,
|
|
977
|
-
false,
|
|
978
|
-
authnMiddleware
|
|
979
|
-
);
|
|
980
|
-
}
|
|
981
|
-
createAuthnMiddleware() {
|
|
982
|
-
if (isNode) {
|
|
983
|
-
return async function* (call, options) {
|
|
984
|
-
const metadata = Metadata(options.metadata).set(
|
|
985
|
-
"X-Client-Env",
|
|
986
|
-
clientEnv
|
|
987
|
-
);
|
|
988
|
-
return yield* call.next(call.request, {
|
|
989
|
-
...options,
|
|
990
|
-
metadata
|
|
991
|
-
});
|
|
992
|
-
}.bind(this);
|
|
993
|
-
} else {
|
|
994
|
-
return async function* (call, options) {
|
|
995
|
-
const metadata = Metadata(options.metadata).set("X-Requested-With", "XMLHttpRequest").set("X-Grpc-Web", "1").set("X-Client-Env", clientEnv).set("Content-Type", "application/grpc-web+proto");
|
|
996
|
-
return yield* call.next(call.request, {
|
|
997
|
-
...options,
|
|
998
|
-
metadata
|
|
999
|
-
});
|
|
1000
|
-
}.bind(this);
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
createMiddleware(address, authToken) {
|
|
1004
|
-
if (isNode) {
|
|
1005
|
-
return this.createNodeMiddleware(address, authToken);
|
|
1006
|
-
} else {
|
|
1007
|
-
return this.createBrowserMiddleware(address, authToken);
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
createNodeMiddleware(address, initialAuthToken) {
|
|
1011
|
-
return async function* (call, options) {
|
|
1012
|
-
const metadata = Metadata(options.metadata).set(
|
|
1013
|
-
"X-Client-Env",
|
|
1014
|
-
clientEnv
|
|
1015
|
-
);
|
|
1016
|
-
try {
|
|
1017
|
-
return yield* call.next(call.request, {
|
|
1018
|
-
...options,
|
|
1019
|
-
metadata: metadata.set(
|
|
1020
|
-
"Authorization",
|
|
1021
|
-
`Bearer ${this.clients.get(address)?.authToken || initialAuthToken}`
|
|
1022
|
-
)
|
|
1023
|
-
});
|
|
1024
|
-
} catch (error) {
|
|
1025
|
-
if (error.message?.includes("token has expired")) {
|
|
1026
|
-
const newAuthToken = await this.authenticate(address);
|
|
1027
|
-
const clientData = this.clients.get(address);
|
|
1028
|
-
if (!clientData) {
|
|
1029
|
-
throw new Error(`No client found for address: ${address}`);
|
|
1030
|
-
}
|
|
1031
|
-
clientData.authToken = newAuthToken;
|
|
1032
|
-
return yield* call.next(call.request, {
|
|
1033
|
-
...options,
|
|
1034
|
-
metadata: metadata.set("Authorization", `Bearer ${newAuthToken}`)
|
|
1035
|
-
});
|
|
1036
|
-
}
|
|
1037
|
-
throw error;
|
|
1038
|
-
}
|
|
1039
|
-
}.bind(this);
|
|
1040
|
-
}
|
|
1041
|
-
createBrowserMiddleware(address, initialAuthToken) {
|
|
1042
|
-
return async function* (call, options) {
|
|
1043
|
-
const metadata = Metadata(options.metadata).set("X-Requested-With", "XMLHttpRequest").set("X-Grpc-Web", "1").set("X-Client-Env", clientEnv).set("Content-Type", "application/grpc-web+proto");
|
|
1044
|
-
try {
|
|
1045
|
-
return yield* call.next(call.request, {
|
|
1046
|
-
...options,
|
|
1047
|
-
metadata: metadata.set(
|
|
1048
|
-
"Authorization",
|
|
1049
|
-
`Bearer ${this.clients.get(address)?.authToken || initialAuthToken}`
|
|
1050
|
-
)
|
|
1051
|
-
});
|
|
1052
|
-
} catch (error) {
|
|
1053
|
-
if (error.message?.includes("token has expired")) {
|
|
1054
|
-
const newAuthToken = await this.authenticate(address);
|
|
1055
|
-
const clientData = this.clients.get(address);
|
|
1056
|
-
if (!clientData) {
|
|
1057
|
-
throw new Error(`No client found for address: ${address}`);
|
|
1058
|
-
}
|
|
1059
|
-
clientData.authToken = newAuthToken;
|
|
1060
|
-
return yield* call.next(call.request, {
|
|
1061
|
-
...options,
|
|
1062
|
-
metadata: metadata.set("Authorization", `Bearer ${newAuthToken}`)
|
|
1063
|
-
});
|
|
1064
|
-
}
|
|
1065
|
-
throw error;
|
|
1066
|
-
}
|
|
1067
|
-
}.bind(this);
|
|
1068
|
-
}
|
|
1069
|
-
async createGrpcClient(defintion, channel, withRetries, middleware) {
|
|
1070
|
-
let clientFactory;
|
|
1071
|
-
const retryOptions = {
|
|
1072
|
-
retry: true,
|
|
1073
|
-
retryMaxAttempts: 3
|
|
1074
|
-
};
|
|
1075
|
-
let options = {};
|
|
1076
|
-
const isNodeChannel = "close" in channel;
|
|
1077
|
-
if (isNode && isNodeChannel && !isBun) {
|
|
1078
|
-
const grpcModule = await import("nice-grpc");
|
|
1079
|
-
const { openTelemetryClientMiddleware } = await import("nice-grpc-opentelemetry");
|
|
1080
|
-
const { createClientFactory } = "default" in grpcModule ? grpcModule.default : grpcModule;
|
|
1081
|
-
clientFactory = createClientFactory();
|
|
1082
|
-
if (withRetries) {
|
|
1083
|
-
options = retryOptions;
|
|
1084
|
-
clientFactory = clientFactory.use(openTelemetryClientMiddleware()).use(retryMiddleware);
|
|
1085
|
-
}
|
|
1086
|
-
if (middleware) {
|
|
1087
|
-
clientFactory = clientFactory.use(middleware);
|
|
1088
|
-
}
|
|
1089
|
-
const client = clientFactory.create(defintion, channel, {
|
|
1090
|
-
"*": options
|
|
1091
|
-
});
|
|
1092
|
-
return {
|
|
1093
|
-
...client,
|
|
1094
|
-
close: channel.close.bind(channel)
|
|
1095
|
-
};
|
|
1096
|
-
} else if (!isNodeChannel) {
|
|
1097
|
-
const grpcModule = await import("nice-grpc-web");
|
|
1098
|
-
const { createClientFactory } = "default" in grpcModule ? grpcModule.default : grpcModule;
|
|
1099
|
-
clientFactory = createClientFactory();
|
|
1100
|
-
if (withRetries) {
|
|
1101
|
-
options = retryOptions;
|
|
1102
|
-
clientFactory = clientFactory.use(retryMiddleware);
|
|
1103
|
-
}
|
|
1104
|
-
if (middleware) {
|
|
1105
|
-
clientFactory = clientFactory.use(middleware);
|
|
1106
|
-
}
|
|
1107
|
-
const client = clientFactory.create(defintion, channel, {
|
|
1108
|
-
"*": options
|
|
1109
|
-
});
|
|
1110
|
-
return {
|
|
1111
|
-
...client,
|
|
1112
|
-
close: void 0
|
|
1113
|
-
};
|
|
1114
|
-
} else {
|
|
1115
|
-
throw new Error("Channel does not have close in NodeJS environment");
|
|
1116
|
-
}
|
|
1117
|
-
}
|
|
1118
|
-
};
|
|
1119
|
-
|
|
1120
|
-
export {
|
|
1121
|
-
ConnectionManager
|
|
1122
|
-
};
|