@astrox/agent 0.0.24 → 0.0.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. package/lib/cjs/actor.d.ts +126 -0
  2. package/lib/cjs/actor.js +207 -0
  3. package/lib/cjs/actor.js.map +1 -0
  4. package/lib/cjs/agent/api.d.ts +140 -0
  5. package/lib/cjs/agent/api.js +16 -0
  6. package/lib/cjs/agent/api.js.map +1 -0
  7. package/lib/cjs/agent/http/index.d.ts +49 -0
  8. package/lib/cjs/agent/http/index.js +355 -0
  9. package/lib/cjs/agent/http/index.js.map +1 -0
  10. package/lib/cjs/agent/http/transforms.d.ts +20 -0
  11. package/lib/cjs/agent/http/transforms.js +70 -0
  12. package/lib/cjs/agent/http/transforms.js.map +1 -0
  13. package/lib/cjs/agent/http/types.d.ts +77 -0
  14. package/lib/cjs/agent/http/types.js +24 -0
  15. package/lib/cjs/agent/http/types.js.map +1 -0
  16. package/lib/cjs/agent/index.d.ts +7 -0
  17. package/lib/cjs/agent/index.js +42 -0
  18. package/lib/cjs/agent/index.js.map +1 -0
  19. package/lib/cjs/agent/proxy.d.ts +85 -0
  20. package/lib/cjs/agent/proxy.js +159 -0
  21. package/lib/cjs/agent/proxy.js.map +1 -0
  22. package/lib/cjs/auth.d.ts +87 -0
  23. package/lib/cjs/auth.js +70 -0
  24. package/lib/cjs/auth.js.map +1 -0
  25. package/lib/cjs/canisters/asset.d.ts +10 -0
  26. package/lib/cjs/canisters/asset.js +18 -0
  27. package/lib/cjs/canisters/asset.js.map +1 -0
  28. package/lib/cjs/canisters/asset_idl.d.ts +7 -0
  29. package/lib/cjs/canisters/asset_idl.js +14 -0
  30. package/lib/cjs/canisters/asset_idl.js.map +1 -0
  31. package/lib/cjs/canisters/management.d.ts +33 -0
  32. package/lib/cjs/canisters/management.js +30 -0
  33. package/lib/cjs/canisters/management.js.map +1 -0
  34. package/lib/cjs/canisters/management_idl.d.ts +7 -0
  35. package/lib/cjs/canisters/management_idl.js +29 -0
  36. package/lib/cjs/canisters/management_idl.js.map +1 -0
  37. package/lib/cjs/cbor.d.ts +9 -0
  38. package/lib/cjs/cbor.js +138 -0
  39. package/lib/cjs/cbor.js.map +1 -0
  40. package/lib/cjs/certificate.d.ts +43 -0
  41. package/lib/cjs/certificate.js +227 -0
  42. package/lib/cjs/certificate.js.map +1 -0
  43. package/lib/cjs/errors.d.ts +8 -0
  44. package/lib/cjs/errors.js +13 -0
  45. package/lib/cjs/errors.js.map +1 -0
  46. package/lib/cjs/index.d.ts +52 -0
  47. package/lib/cjs/index.js +38 -0
  48. package/lib/cjs/index.js.map +1 -0
  49. package/lib/cjs/polling/index.d.ts +16 -0
  50. package/lib/cjs/polling/index.js +81 -0
  51. package/lib/cjs/polling/index.js.map +1 -0
  52. package/lib/cjs/polling/strategy.d.ts +47 -0
  53. package/lib/cjs/polling/strategy.js +106 -0
  54. package/lib/cjs/polling/strategy.js.map +1 -0
  55. package/lib/cjs/request_id.d.ts +15 -0
  56. package/lib/cjs/request_id.js +89 -0
  57. package/lib/cjs/request_id.js.map +1 -0
  58. package/lib/cjs/utils/bls.d.ts +9 -0
  59. package/lib/cjs/utils/bls.js +65 -0
  60. package/lib/cjs/utils/bls.js.map +1 -0
  61. package/lib/cjs/utils/buffer.d.ts +16 -0
  62. package/lib/cjs/utils/buffer.js +59 -0
  63. package/lib/cjs/utils/buffer.js.map +1 -0
  64. package/lib/cjs/vendor/bls/bls.d.ts +28 -0
  65. package/lib/cjs/vendor/bls/bls.js +894 -0
  66. package/lib/cjs/vendor/bls/bls.js.map +1 -0
  67. package/lib/esm/actor.d.ts +126 -0
  68. package/lib/esm/actor.js +200 -0
  69. package/lib/esm/actor.js.map +1 -0
  70. package/lib/esm/agent/api.d.ts +140 -0
  71. package/lib/esm/agent/api.js +13 -0
  72. package/lib/esm/agent/api.js.map +1 -0
  73. package/lib/esm/agent/http/index.d.ts +49 -0
  74. package/lib/esm/agent/http/index.js +328 -0
  75. package/lib/esm/agent/http/index.js.map +1 -0
  76. package/lib/esm/agent/http/transforms.d.ts +20 -0
  77. package/lib/esm/agent/http/transforms.js +45 -0
  78. package/lib/esm/agent/http/transforms.js.map +1 -0
  79. package/lib/esm/agent/http/types.d.ts +77 -0
  80. package/lib/esm/agent/http/types.js +20 -0
  81. package/lib/esm/agent/http/types.js.map +1 -0
  82. package/lib/esm/agent/index.d.ts +7 -0
  83. package/lib/esm/agent/index.js +27 -0
  84. package/lib/esm/agent/index.js.map +1 -0
  85. package/lib/esm/agent/proxy.d.ts +85 -0
  86. package/lib/esm/agent/proxy.js +154 -0
  87. package/lib/esm/agent/proxy.js.map +1 -0
  88. package/lib/esm/auth.d.ts +87 -0
  89. package/lib/esm/auth.js +64 -0
  90. package/lib/esm/auth.js.map +1 -0
  91. package/lib/esm/canisters/asset.d.ts +10 -0
  92. package/lib/esm/canisters/asset.js +11 -0
  93. package/lib/esm/canisters/asset.js.map +1 -0
  94. package/lib/esm/canisters/asset_idl.d.ts +7 -0
  95. package/lib/esm/canisters/asset_idl.js +12 -0
  96. package/lib/esm/canisters/asset_idl.js.map +1 -0
  97. package/lib/esm/canisters/management.d.ts +37 -0
  98. package/lib/esm/canisters/management.js +23 -0
  99. package/lib/esm/canisters/management.js.map +1 -0
  100. package/lib/esm/canisters/management_idl.d.ts +7 -0
  101. package/lib/esm/canisters/management_idl.js +27 -0
  102. package/lib/esm/canisters/management_idl.js.map +1 -0
  103. package/lib/esm/cbor.d.ts +9 -0
  104. package/lib/esm/cbor.js +111 -0
  105. package/lib/esm/cbor.js.map +1 -0
  106. package/lib/esm/certificate.d.ts +43 -0
  107. package/lib/esm/certificate.js +200 -0
  108. package/lib/esm/certificate.js.map +1 -0
  109. package/lib/esm/errors.d.ts +8 -0
  110. package/lib/esm/errors.js +9 -0
  111. package/lib/esm/errors.js.map +1 -0
  112. package/lib/esm/index.d.ts +52 -0
  113. package/lib/esm/index.js +14 -0
  114. package/lib/esm/index.js.map +1 -0
  115. package/lib/esm/polling/index.d.ts +16 -0
  116. package/lib/esm/polling/index.js +57 -0
  117. package/lib/esm/polling/index.js.map +1 -0
  118. package/lib/esm/polling/strategy.d.ts +47 -0
  119. package/lib/esm/polling/strategy.js +95 -0
  120. package/lib/esm/polling/strategy.js.map +1 -0
  121. package/lib/esm/request_id.d.ts +15 -0
  122. package/lib/esm/request_id.js +81 -0
  123. package/lib/esm/request_id.js.map +1 -0
  124. package/lib/esm/utils/bls.d.ts +9 -0
  125. package/lib/esm/utils/bls.js +43 -0
  126. package/lib/esm/utils/bls.js.map +1 -0
  127. package/lib/esm/utils/buffer.d.ts +16 -0
  128. package/lib/esm/utils/buffer.js +52 -0
  129. package/lib/esm/utils/buffer.js.map +1 -0
  130. package/lib/esm/vendor/bls/bls.d.ts +28 -0
  131. package/lib/esm/vendor/bls/bls.js +870 -0
  132. package/lib/esm/vendor/bls/bls.js.map +1 -0
  133. package/package.json +4 -4
@@ -0,0 +1,328 @@
1
+ import { getKraken } from '@astrox/agent';
2
+ import { Principal } from '@astrox/principal';
3
+ import { AnonymousIdentity } from '../../auth';
4
+ import * as cbor from '../../cbor';
5
+ import { requestIdOf } from '../../request_id';
6
+ import { fromHex, toHex } from '../../utils/buffer';
7
+ import { Expiry } from './transforms';
8
+ import { SubmitRequestType, } from './types';
9
+ export * from './transforms';
10
+ export { makeNonce } from './types';
11
+ export var RequestStatusResponseStatus;
12
+ (function (RequestStatusResponseStatus) {
13
+ RequestStatusResponseStatus["Received"] = "received";
14
+ RequestStatusResponseStatus["Processing"] = "processing";
15
+ RequestStatusResponseStatus["Replied"] = "replied";
16
+ RequestStatusResponseStatus["Rejected"] = "rejected";
17
+ RequestStatusResponseStatus["Unknown"] = "unknown";
18
+ RequestStatusResponseStatus["Done"] = "done";
19
+ })(RequestStatusResponseStatus || (RequestStatusResponseStatus = {}));
20
+ // Default delta for ingress expiry is 5 minutes.
21
+ const DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS = 5 * 60 * 1000;
22
+ // Root public key for the IC, encoded as hex
23
+ const IC_ROOT_KEY = '308182301d060d2b0601040182dc7c0503010201060c2b0601040182dc7c05030201036100814' +
24
+ 'c0e6ec71fab583b08bd81373c255c3c371b2e84863c98a4f1e08b74235d14fb5d9c0cd546d968' +
25
+ '5f913a0c0b2cc5341583bf4b4392e467db96d65b9bb4cb717112f8472e0d5a4d14505ffd7484' +
26
+ 'b01291091c5f87b98883463f98091a0baaae';
27
+ function getDefaultFetch() {
28
+ const result = typeof window === 'undefined'
29
+ ? typeof global === 'undefined'
30
+ ? typeof self === 'undefined'
31
+ ? undefined
32
+ : self.fetch.bind(self)
33
+ : global.fetch.bind(global)
34
+ : window.fetch.bind(window);
35
+ if (!result) {
36
+ throw new Error('Could not find default `fetch` implementation.');
37
+ }
38
+ return result;
39
+ }
40
+ function getKrakenFetch() {
41
+ if (getKraken()) {
42
+ const result = typeof window === 'undefined'
43
+ ? typeof global === 'undefined'
44
+ ? typeof self === 'undefined'
45
+ ? undefined
46
+ : self.fetchAgent.bind(self)
47
+ : global.fetchAgent.bind(global)
48
+ : window.fetchAgent.bind(window);
49
+ if (!result) {
50
+ throw new Error('Could not find default `fetch` implementation.');
51
+ }
52
+ return result;
53
+ }
54
+ else {
55
+ return getDefaultFetch();
56
+ }
57
+ }
58
+ // A HTTP agent allows users to interact with a client of the internet computer
59
+ // using the available methods. It exposes an API that closely follows the
60
+ // public view of the internet computer, and is not intended to be exposed
61
+ // directly to the majority of users due to its low-level interface.
62
+ //
63
+ // There is a pipeline to apply transformations to the request before sending
64
+ // it to the client. This is to decouple signature, nonce generation and
65
+ // other computations so that this class can stay as simple as possible while
66
+ // allowing extensions.
67
+ export class HttpAgent {
68
+ constructor(options = {}) {
69
+ this.rootKey = fromHex(IC_ROOT_KEY);
70
+ this._pipeline = [];
71
+ this._rootKeyFetched = false;
72
+ if (options.source) {
73
+ if (!(options.source instanceof HttpAgent)) {
74
+ throw new Error("An Agent's source can only be another HttpAgent");
75
+ }
76
+ this._pipeline = [...options.source._pipeline];
77
+ this._identity = options.source._identity;
78
+ this._fetch = options.source._fetch;
79
+ this._fetchAgent = options.source._fetchAgent;
80
+ this._host = options.source._host;
81
+ this._credentials = options.source._credentials;
82
+ }
83
+ else {
84
+ this._fetch = options.fetch || getDefaultFetch() || fetch.bind(global);
85
+ this._fetchAgent = options.fetchAgent || getKrakenFetch() || fetch.bind(global);
86
+ }
87
+ if (options.host !== undefined) {
88
+ if (!options.host.match(/^[a-z]+:/) && typeof window !== 'undefined') {
89
+ this._host = new URL(window.location.protocol + '//' + options.host);
90
+ }
91
+ else {
92
+ this._host = new URL(options.host);
93
+ }
94
+ }
95
+ else if (options.source !== undefined) {
96
+ // Safe to ignore here.
97
+ this._host = options.source._host;
98
+ }
99
+ else {
100
+ const location = typeof window !== 'undefined' ? window.location : undefined;
101
+ if (!location) {
102
+ throw new Error('Must specify a host to connect to.');
103
+ }
104
+ this._host = new URL(location + '');
105
+ }
106
+ if (options.credentials) {
107
+ const { name, password } = options.credentials;
108
+ this._credentials = `${name}${password ? ':' + password : ''}`;
109
+ }
110
+ this._identity = Promise.resolve(options.identity || new AnonymousIdentity());
111
+ }
112
+ addTransform(fn, priority = fn.priority || 0) {
113
+ // Keep the pipeline sorted at all time, by priority.
114
+ const i = this._pipeline.findIndex(x => (x.priority || 0) < priority);
115
+ this._pipeline.splice(i >= 0 ? i : this._pipeline.length, 0, Object.assign(fn, { priority }));
116
+ }
117
+ async getPrincipal() {
118
+ return (await this._identity).getPrincipal();
119
+ }
120
+ async call(canisterId, options, identity) {
121
+ const id = (await (identity !== undefined ? await identity : await this._identity));
122
+ const canister = Principal.from(canisterId);
123
+ const ecid = options.effectiveCanisterId
124
+ ? Principal.from(options.effectiveCanisterId)
125
+ : canister;
126
+ const sender = id.getPrincipal() || Principal.anonymous();
127
+ const submit = {
128
+ request_type: SubmitRequestType.Call,
129
+ canister_id: canister,
130
+ method_name: options.methodName,
131
+ arg: options.arg,
132
+ sender,
133
+ ingress_expiry: new Expiry(DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS),
134
+ };
135
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
+ let transformedRequest = (await this._transform({
137
+ request: {
138
+ body: null,
139
+ method: 'POST',
140
+ headers: Object.assign({ 'Content-Type': 'application/cbor' }, (this._credentials ? { Authorization: 'Basic ' + btoa(this._credentials) } : {})),
141
+ },
142
+ endpoint: "call" /* Call */,
143
+ body: submit,
144
+ }));
145
+ // Apply transform for identity.
146
+ transformedRequest = await id.transformRequest(transformedRequest);
147
+ const body = cbor.encode(transformedRequest.body);
148
+ const kraken = getKraken();
149
+ if (!kraken) {
150
+ // Run both in parallel. The fetch is quite expensive, so we have plenty of time to
151
+ // calculate the requestId locally.
152
+ const [response, requestId] = await Promise.all([
153
+ this._fetch('' + new URL(`/api/v2/canister/${ecid.toText()}/call`, this._host), Object.assign(Object.assign({}, transformedRequest.request), { body })),
154
+ requestIdOf(submit),
155
+ ]);
156
+ console.log('astorx call');
157
+ if (!response.ok) {
158
+ throw new Error(`Server returned an error:\n` +
159
+ ` Code: ${response.status} (${response.statusText})\n` +
160
+ ` Body: ${await response.text()}\n`);
161
+ }
162
+ return {
163
+ requestId,
164
+ response: {
165
+ ok: response.ok,
166
+ status: response.status,
167
+ statusText: response.statusText,
168
+ },
169
+ };
170
+ }
171
+ else {
172
+ const [response, requestId] = await Promise.all([
173
+ this._fetchAgent('' + new URL(`/api/v2/canister/${ecid.toText()}/call`, this._host), Object.assign(Object.assign({}, transformedRequest.request), { body: toHex(body) })),
174
+ requestIdOf(submit),
175
+ ]);
176
+ if (!response.ok) {
177
+ throw new Error(`Server returned an error:\n` +
178
+ ` Code: ${response.status} (${response.statusText})\n` +
179
+ ` Body: ${response.body}\n`);
180
+ }
181
+ return {
182
+ requestId,
183
+ response: {
184
+ ok: response.ok,
185
+ status: response.status,
186
+ statusText: response.statusText,
187
+ },
188
+ };
189
+ }
190
+ }
191
+ async query(canisterId, fields, identity) {
192
+ const id = await (identity !== undefined ? await identity : await this._identity);
193
+ const canister = typeof canisterId === 'string' ? Principal.fromText(canisterId) : canisterId;
194
+ const sender = (id === null || id === void 0 ? void 0 : id.getPrincipal()) || Principal.anonymous();
195
+ const request = {
196
+ request_type: "query" /* Query */,
197
+ canister_id: canister,
198
+ method_name: fields.methodName,
199
+ arg: fields.arg,
200
+ sender,
201
+ ingress_expiry: new Expiry(DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS),
202
+ };
203
+ // TODO: remove this any. This can be a Signed or UnSigned request.
204
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
205
+ let transformedRequest = await this._transform({
206
+ request: {
207
+ method: 'POST',
208
+ headers: Object.assign({ 'Content-Type': 'application/cbor' }, (this._credentials ? { Authorization: 'Basic ' + btoa(this._credentials) } : {})),
209
+ },
210
+ endpoint: "read" /* Query */,
211
+ body: request,
212
+ });
213
+ // Apply transform for identity.
214
+ transformedRequest = await id.transformRequest(transformedRequest);
215
+ const body = cbor.encode(transformedRequest.body);
216
+ const kraken = getKraken();
217
+ if (!kraken) {
218
+ const response = await this._fetch('' + new URL(`/api/v2/canister/${canister.toText()}/query`, this._host), Object.assign(Object.assign({}, transformedRequest.request), { body }));
219
+ console.log('astorx query');
220
+ if (!response.ok) {
221
+ throw new Error(`Server returned an error:\n` +
222
+ ` Code: ${response.status} (${response.statusText})\n` +
223
+ ` Body: ${await response.text()}\n`);
224
+ }
225
+ return cbor.decode(await response.arrayBuffer());
226
+ }
227
+ else {
228
+ const response = await this._fetchAgent('' + new URL(`/api/v2/canister/${canister.toText()}/query`, this._host), Object.assign(Object.assign({}, transformedRequest.request), { body: toHex(body) }));
229
+ console.log('astrox query');
230
+ if (!response.ok) {
231
+ throw new Error(`Server returned an error:\n` +
232
+ ` Code: ${response.status} (${response.statusText})\n` +
233
+ ` Body: ${response.body}\n`);
234
+ }
235
+ return cbor.decode(fromHex(response.body));
236
+ }
237
+ }
238
+ async readState(canisterId, fields, identity) {
239
+ const canister = typeof canisterId === 'string' ? Principal.fromText(canisterId) : canisterId;
240
+ const id = await (identity !== undefined ? await identity : await this._identity);
241
+ const sender = (id === null || id === void 0 ? void 0 : id.getPrincipal()) || Principal.anonymous();
242
+ // TODO: remove this any. This can be a Signed or UnSigned request.
243
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
244
+ let transformedRequest = await this._transform({
245
+ request: {
246
+ method: 'POST',
247
+ headers: Object.assign({ 'Content-Type': 'application/cbor' }, (this._credentials ? { Authorization: 'Basic ' + btoa(this._credentials) } : {})),
248
+ },
249
+ endpoint: "read_state" /* ReadState */,
250
+ body: {
251
+ request_type: "read_state" /* ReadState */,
252
+ paths: fields.paths,
253
+ sender,
254
+ ingress_expiry: new Expiry(DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS),
255
+ },
256
+ });
257
+ // Apply transform for identity.
258
+ transformedRequest = await id.transformRequest(transformedRequest);
259
+ const body = cbor.encode(transformedRequest.body);
260
+ const kraken = getKraken();
261
+ if (!kraken) {
262
+ const response = await this._fetch('' + new URL(`/api/v2/canister/${canister}/read_state`, this._host), Object.assign(Object.assign({}, transformedRequest.request), { body }));
263
+ console.log('astorx read_state');
264
+ if (!response.ok) {
265
+ throw new Error(`Server returned an error:\n` +
266
+ ` Code: ${response.status} (${response.statusText})\n` +
267
+ ` Body: ${await response.text()}\n`);
268
+ }
269
+ return cbor.decode(await response.arrayBuffer());
270
+ }
271
+ else {
272
+ const response = await this._fetchAgent('' + new URL(`/api/v2/canister/${canister}/read_state`, this._host), Object.assign(Object.assign({}, transformedRequest.request), { body: toHex(body) }));
273
+ console.log('astorx read_state');
274
+ if (!response.ok) {
275
+ throw new Error(`Server returned an error:\n` +
276
+ ` Code: ${response.status} (${response.statusText})\n` +
277
+ ` Body: ${response.body}\n`);
278
+ }
279
+ return cbor.decode(fromHex(response.body));
280
+ }
281
+ }
282
+ async status() {
283
+ const headers = this._credentials
284
+ ? {
285
+ Authorization: 'Basic ' + btoa(this._credentials),
286
+ }
287
+ : {};
288
+ const kraken = getKraken();
289
+ if (!kraken) {
290
+ const response = await this._fetch('' + new URL(`/api/v2/status`, this._host), { headers });
291
+ console.log('astorx status');
292
+ if (!response.ok) {
293
+ throw new Error(`Server returned an error:\n` +
294
+ ` Code: ${response.status} (${response.statusText})\n` +
295
+ ` Body: ${await response.text()}\n`);
296
+ }
297
+ return cbor.decode(await response.arrayBuffer());
298
+ }
299
+ else {
300
+ const response = await this._fetchAgent('' + new URL(`/api/v2/status`, this._host), {
301
+ headers,
302
+ });
303
+ console.log('astrox status');
304
+ if (!response.ok) {
305
+ throw new Error(`Server returned an error:\n` +
306
+ ` Code: ${response.status} (${response.statusText})\n` +
307
+ ` Body: ${response.body}\n`);
308
+ }
309
+ return cbor.decode(fromHex(response.body));
310
+ }
311
+ }
312
+ async fetchRootKey() {
313
+ if (!this._rootKeyFetched) {
314
+ // Hex-encoded version of the replica root key
315
+ this.rootKey = (await this.status()).root_key;
316
+ this._rootKeyFetched = true;
317
+ }
318
+ return this.rootKey;
319
+ }
320
+ _transform(request) {
321
+ let p = Promise.resolve(request);
322
+ for (const fn of this._pipeline) {
323
+ p = p.then(r => fn(r).then(r2 => r2 || r));
324
+ }
325
+ return p;
326
+ }
327
+ }
328
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/agent/http/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import * as cbor from 'simple-cbor';
2
+ import { HttpAgentRequestTransformFn, Nonce } from './types';
3
+ export declare class Expiry {
4
+ private readonly _value;
5
+ constructor(deltaInMSec: number);
6
+ toCBOR(): cbor.CborValue;
7
+ toHash(): ArrayBuffer;
8
+ }
9
+ /**
10
+ * Create a Nonce transform, which takes a function that returns a Buffer, and adds it
11
+ * as the nonce to every call requests.
12
+ * @param nonceFn A function that returns a buffer. By default uses a semi-random method.
13
+ */
14
+ export declare function makeNonceTransform(nonceFn?: () => Nonce): HttpAgentRequestTransformFn;
15
+ /**
16
+ * Create a transform that adds a delay (by default 5 minutes) to the expiry.
17
+ *
18
+ * @param delayInMilliseconds The delay to add to the call time, in milliseconds.
19
+ */
20
+ export declare function makeExpiryTransform(delayInMilliseconds: number): HttpAgentRequestTransformFn;
@@ -0,0 +1,45 @@
1
+ import { lebEncode } from '@astrox/candid';
2
+ import * as cbor from 'simple-cbor';
3
+ import { makeNonce } from './types';
4
+ const NANOSECONDS_PER_MILLISECONDS = BigInt(1000000);
5
+ const REPLICA_PERMITTED_DRIFT_MILLISECONDS = BigInt(60 * 1000);
6
+ export class Expiry {
7
+ constructor(deltaInMSec) {
8
+ // Use bigint because it can overflow the maximum number allowed in a double float.
9
+ this._value =
10
+ (BigInt(Date.now()) + BigInt(deltaInMSec) - REPLICA_PERMITTED_DRIFT_MILLISECONDS) *
11
+ NANOSECONDS_PER_MILLISECONDS;
12
+ }
13
+ toCBOR() {
14
+ // TODO: change this to take the minimum amount of space (it always takes 8 bytes now).
15
+ return cbor.value.u64(this._value.toString(16), 16);
16
+ }
17
+ toHash() {
18
+ return lebEncode(this._value);
19
+ }
20
+ }
21
+ /**
22
+ * Create a Nonce transform, which takes a function that returns a Buffer, and adds it
23
+ * as the nonce to every call requests.
24
+ * @param nonceFn A function that returns a buffer. By default uses a semi-random method.
25
+ */
26
+ export function makeNonceTransform(nonceFn = makeNonce) {
27
+ return async (request) => {
28
+ // Nonce are only useful for async calls, to prevent replay attacks. Other types of
29
+ // calls don't need Nonce so we just skip creating one.
30
+ if (request.endpoint === "call" /* Call */) {
31
+ request.body.nonce = nonceFn();
32
+ }
33
+ };
34
+ }
35
+ /**
36
+ * Create a transform that adds a delay (by default 5 minutes) to the expiry.
37
+ *
38
+ * @param delayInMilliseconds The delay to add to the call time, in milliseconds.
39
+ */
40
+ export function makeExpiryTransform(delayInMilliseconds) {
41
+ return async (request) => {
42
+ request.body.ingress_expiry = new Expiry(delayInMilliseconds);
43
+ };
44
+ }
45
+ //# sourceMappingURL=transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../../../src/agent/http/transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,EAA2D,SAAS,EAAS,MAAM,SAAS,CAAC;AAEpG,MAAM,4BAA4B,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAErD,MAAM,oCAAoC,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;AAE/D,MAAM,OAAO,MAAM;IAGjB,YAAY,WAAmB;QAC7B,mFAAmF;QACnF,IAAI,CAAC,MAAM;YACT,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,oCAAoC,CAAC;gBACjF,4BAA4B,CAAC;IACjC,CAAC;IAEM,MAAM;QACX,uFAAuF;QACvF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,MAAM;QACX,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAuB,SAAS;IACjE,OAAO,KAAK,EAAE,OAAyB,EAAE,EAAE;QACzC,mFAAmF;QACnF,uDAAuD;QACvD,IAAI,OAAO,CAAC,QAAQ,sBAAkB,EAAE;YACtC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,CAAC;SAChC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,mBAA2B;IAC7D,OAAO,KAAK,EAAE,OAAyB,EAAE,EAAE;QACzC,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAChE,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { Principal } from '@astrox/principal';
2
+ import { Expiry } from './transforms';
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare const enum Endpoint {
7
+ Query = "read",
8
+ ReadState = "read_state",
9
+ Call = "call"
10
+ }
11
+ export declare type HttpAgentRequest = HttpAgentQueryRequest | HttpAgentSubmitRequest | HttpAgentReadStateRequest;
12
+ export interface HttpAgentBaseRequest {
13
+ readonly endpoint: Endpoint;
14
+ request: RequestInit;
15
+ }
16
+ export interface HttpAgentSubmitRequest extends HttpAgentBaseRequest {
17
+ readonly endpoint: Endpoint.Call;
18
+ body: CallRequest;
19
+ }
20
+ export interface HttpAgentQueryRequest extends HttpAgentBaseRequest {
21
+ readonly endpoint: Endpoint.Query;
22
+ body: ReadRequest;
23
+ }
24
+ export interface HttpAgentReadStateRequest extends HttpAgentBaseRequest {
25
+ readonly endpoint: Endpoint.ReadState;
26
+ body: ReadRequest;
27
+ }
28
+ export interface Signed<T> {
29
+ content: T;
30
+ sender_pubkey: ArrayBuffer;
31
+ sender_sig: ArrayBuffer;
32
+ }
33
+ export interface UnSigned<T> {
34
+ content: T;
35
+ }
36
+ export declare type Envelope<T> = Signed<T> | UnSigned<T>;
37
+ export interface HttpAgentRequestTransformFn {
38
+ (args: HttpAgentRequest): Promise<HttpAgentRequest | undefined | void>;
39
+ priority?: number;
40
+ }
41
+ export interface CallRequest extends Record<string, any> {
42
+ request_type: SubmitRequestType.Call;
43
+ canister_id: Principal;
44
+ method_name: string;
45
+ arg: ArrayBuffer;
46
+ sender: Uint8Array | Principal;
47
+ ingress_expiry: Expiry;
48
+ }
49
+ export declare enum SubmitRequestType {
50
+ Call = "call"
51
+ }
52
+ export declare const enum ReadRequestType {
53
+ Query = "query",
54
+ ReadState = "read_state"
55
+ }
56
+ export interface QueryRequest extends Record<string, any> {
57
+ request_type: ReadRequestType.Query;
58
+ canister_id: Principal;
59
+ method_name: string;
60
+ arg: ArrayBuffer;
61
+ sender: Uint8Array | Principal;
62
+ ingress_expiry: Expiry;
63
+ }
64
+ export interface ReadStateRequest extends Record<string, any> {
65
+ request_type: ReadRequestType.ReadState;
66
+ paths: ArrayBuffer[][];
67
+ ingress_expiry: Expiry;
68
+ sender: Uint8Array | Principal;
69
+ }
70
+ export declare type ReadRequest = QueryRequest | ReadStateRequest;
71
+ export declare type Nonce = Uint8Array & {
72
+ __nonce__: void;
73
+ };
74
+ /**
75
+ * Create a random Nonce, based on date and a random suffix.
76
+ */
77
+ export declare function makeNonce(): Nonce;
@@ -0,0 +1,20 @@
1
+ // tslint:enable:camel-case
2
+ // The types of values allowed in the `request_type` field for submit requests.
3
+ export var SubmitRequestType;
4
+ (function (SubmitRequestType) {
5
+ SubmitRequestType["Call"] = "call";
6
+ })(SubmitRequestType || (SubmitRequestType = {}));
7
+ /**
8
+ * Create a random Nonce, based on date and a random suffix.
9
+ */
10
+ export function makeNonce() {
11
+ // Encode 128 bits.
12
+ const buffer = new ArrayBuffer(16);
13
+ const view = new DataView(buffer);
14
+ const value = BigInt(+Date.now()) * BigInt(100000) + BigInt(Math.floor(Math.random() * 100000));
15
+ view.setBigUint64(0, value);
16
+ // tslint:disable-next-line:no-bitwise
17
+ view.setBigUint64(1, value >> BigInt(64));
18
+ return buffer;
19
+ }
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/agent/http/types.ts"],"names":[],"mappings":"AAmEA,2BAA2B;AAE3B,+EAA+E;AAC/E,MAAM,CAAN,IAAY,iBAEX;AAFD,WAAY,iBAAiB;IAC3B,kCAAa,CAAA;AACf,CAAC,EAFW,iBAAiB,KAAjB,iBAAiB,QAE5B;AA8BD;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,mBAAmB;IACnB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAChG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5B,sCAAsC;IACtC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1C,OAAO,MAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Kraken } from '../index';
2
+ import { Agent } from './api';
3
+ export * from './api';
4
+ export * from './http';
5
+ export * from './proxy';
6
+ export declare function getDefaultAgent(): Agent;
7
+ export declare function getKraken(): Kraken | undefined;
@@ -0,0 +1,27 @@
1
+ export * from './api';
2
+ export * from './http';
3
+ export * from './proxy';
4
+ export function getDefaultAgent() {
5
+ const agent = typeof window === 'undefined'
6
+ ? typeof global === 'undefined'
7
+ ? typeof self === 'undefined'
8
+ ? undefined
9
+ : self.ic.agent
10
+ : global.ic.agent
11
+ : window.ic.agent;
12
+ if (!agent) {
13
+ throw new Error('No Agent could be found.');
14
+ }
15
+ return agent;
16
+ }
17
+ export function getKraken() {
18
+ const kraken = typeof window === 'undefined'
19
+ ? typeof global === 'undefined'
20
+ ? typeof self === 'undefined'
21
+ ? undefined
22
+ : self.kraken
23
+ : global.kraken
24
+ : window.kraken;
25
+ return kraken;
26
+ }
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/index.ts"],"names":[],"mappings":"AAGA,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AAMxB,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GACT,OAAO,MAAM,KAAK,WAAW;QAC3B,CAAC,CAAC,OAAO,MAAM,KAAK,WAAW;YAC7B,CAAC,CAAC,OAAO,IAAI,KAAK,WAAW;gBAC3B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK;YACjB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK;QACnB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;IAEtB,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;KAC7C;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GACV,OAAO,MAAM,KAAK,WAAW;QAC3B,CAAC,CAAC,OAAO,MAAM,KAAK,WAAW;YAC7B,CAAC,CAAC,OAAO,IAAI,KAAK,WAAW;gBAC3B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,MAAM;YACf,CAAC,CAAC,MAAM,CAAC,MAAM;QACjB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAEpB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { CallOptions, QueryFields, QueryResponse, ReadStateOptions, ReadStateResponse, SubmitResponse } from '..';
2
+ import { JsonObject } from '@astrox/candid';
3
+ import { Agent } from './api';
4
+ import { Principal } from '@astrox/principal';
5
+ export declare enum ProxyMessageKind {
6
+ Error = "err",
7
+ GetPrincipal = "gp",
8
+ GetPrincipalResponse = "gpr",
9
+ Query = "q",
10
+ QueryResponse = "qr",
11
+ Call = "c",
12
+ CallResponse = "cr",
13
+ ReadState = "rs",
14
+ ReadStateResponse = "rsr",
15
+ Status = "s",
16
+ StatusResponse = "sr"
17
+ }
18
+ export interface ProxyMessageBase {
19
+ id: number;
20
+ type: ProxyMessageKind;
21
+ }
22
+ export interface ProxyMessageError extends ProxyMessageBase {
23
+ type: ProxyMessageKind.Error;
24
+ error: any;
25
+ }
26
+ export interface ProxyMessageGetPrincipal extends ProxyMessageBase {
27
+ type: ProxyMessageKind.GetPrincipal;
28
+ }
29
+ export interface ProxyMessageGetPrincipalResponse extends ProxyMessageBase {
30
+ type: ProxyMessageKind.GetPrincipalResponse;
31
+ response: string;
32
+ }
33
+ export interface ProxyMessageQuery extends ProxyMessageBase {
34
+ type: ProxyMessageKind.Query;
35
+ args: [string, QueryFields];
36
+ }
37
+ export interface ProxyMessageQueryResponse extends ProxyMessageBase {
38
+ type: ProxyMessageKind.QueryResponse;
39
+ response: QueryResponse;
40
+ }
41
+ export interface ProxyMessageCall extends ProxyMessageBase {
42
+ type: ProxyMessageKind.Call;
43
+ args: [string, CallOptions];
44
+ }
45
+ export interface ProxyMessageCallResponse extends ProxyMessageBase {
46
+ type: ProxyMessageKind.CallResponse;
47
+ response: SubmitResponse;
48
+ }
49
+ export interface ProxyMessageReadState extends ProxyMessageBase {
50
+ type: ProxyMessageKind.ReadState;
51
+ args: [string, ReadStateOptions];
52
+ }
53
+ export interface ProxyMessageReadStateResponse extends ProxyMessageBase {
54
+ type: ProxyMessageKind.ReadStateResponse;
55
+ response: ReadStateResponse;
56
+ }
57
+ export interface ProxyMessageStatus extends ProxyMessageBase {
58
+ type: ProxyMessageKind.Status;
59
+ }
60
+ export interface ProxyMessageStatusResponse extends ProxyMessageBase {
61
+ type: ProxyMessageKind.StatusResponse;
62
+ response: JsonObject;
63
+ }
64
+ export declare type ProxyMessage = ProxyMessageError | ProxyMessageGetPrincipal | ProxyMessageGetPrincipalResponse | ProxyMessageQuery | ProxyMessageQueryResponse | ProxyMessageCall | ProxyMessageReadState | ProxyMessageReadStateResponse | ProxyMessageCallResponse | ProxyMessageStatus | ProxyMessageStatusResponse;
65
+ export declare class ProxyStubAgent {
66
+ private _frontend;
67
+ private _agent;
68
+ constructor(_frontend: (msg: ProxyMessage) => void, _agent: Agent);
69
+ onmessage(msg: ProxyMessage): void;
70
+ }
71
+ export declare class ProxyAgent implements Agent {
72
+ private _backend;
73
+ private _nextId;
74
+ private _pendingCalls;
75
+ rootKey: null;
76
+ constructor(_backend: (msg: ProxyMessage) => void);
77
+ onmessage(msg: ProxyMessage): void;
78
+ getPrincipal(): Promise<Principal>;
79
+ readState(canisterId: Principal | string, fields: ReadStateOptions): Promise<ReadStateResponse>;
80
+ call(canisterId: Principal | string, fields: CallOptions): Promise<SubmitResponse>;
81
+ status(): Promise<JsonObject>;
82
+ query(canisterId: Principal | string, fields: QueryFields): Promise<QueryResponse>;
83
+ private _sendAndWait;
84
+ fetchRootKey(): Promise<ArrayBuffer>;
85
+ }