@holochain/client 0.11.6 → 0.11.8
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/lib/api/admin/websocket.d.ts +2 -2
- package/lib/api/admin/websocket.js.map +1 -1
- package/lib/api/app/index.d.ts +0 -2
- package/lib/api/app/index.js +0 -2
- package/lib/api/app/index.js.map +1 -1
- package/lib/api/app/websocket.d.ts +3 -3
- package/lib/api/app/websocket.js +14 -63
- package/lib/api/app/websocket.js.map +1 -1
- package/lib/api/app-agent/types.d.ts +1 -1
- package/lib/api/app-agent/websocket.d.ts +5 -25
- package/lib/api/app-agent/websocket.js +32 -43
- package/lib/api/app-agent/websocket.js.map +1 -1
- package/lib/api/index.d.ts +1 -0
- package/lib/api/index.js +1 -0
- package/lib/api/index.js.map +1 -1
- package/lib/api/zome-call-signing.d.ts +24 -5
- package/lib/api/zome-call-signing.js +69 -1
- package/lib/api/zome-call-signing.js.map +1 -1
- package/lib/environments/launcher.d.ts +2 -0
- package/lib/environments/launcher.js +30 -0
- package/lib/environments/launcher.js.map +1 -1
- package/lib/utils/fake-hash.js +1 -1
- package/lib/utils/fake-hash.js.map +1 -1
- package/package.json +1 -1
- package/lib/api/app/util.d.ts +0 -23
- package/lib/api/app/util.js +0 -73
- package/lib/api/app/util.js.map +0 -1
|
@@ -18,9 +18,9 @@ import * as Api from "./types.js";
|
|
|
18
18
|
import { WsClient } from "../client.js";
|
|
19
19
|
import { Transformer, Requester } from "../common.js";
|
|
20
20
|
export declare class AdminWebsocket implements Api.AdminApi {
|
|
21
|
-
client: WsClient;
|
|
21
|
+
readonly client: WsClient;
|
|
22
22
|
defaultTimeout: number;
|
|
23
|
-
constructor(
|
|
23
|
+
private constructor();
|
|
24
24
|
static connect(url: string, defaultTimeout?: number): Promise<AdminWebsocket>;
|
|
25
25
|
_requester: <ReqO, ReqI, ResI, ResO>(tag: string, transformer?: Transformer<ReqO, ReqI, ResI, ResO> | undefined) => (req: ReqO, timeout?: number | undefined) => Promise<ResO>;
|
|
26
26
|
attachAppInterface: Requester<Api.AttachAppInterfaceRequest, Api.AttachAppInterfaceResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/admin/websocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAe,oBAAoB,EAAa,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/admin/websocket.ts"],"names":[],"mappings":"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"}
|
package/lib/api/app/index.d.ts
CHANGED
package/lib/api/app/index.js
CHANGED
package/lib/api/app/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
@@ -3,12 +3,13 @@ import { CapSecret } from "../../hdk/capabilities.js";
|
|
|
3
3
|
import { InstalledAppId } from "../../types.js";
|
|
4
4
|
import { WsClient } from "../client.js";
|
|
5
5
|
import { Requester, Transformer } from "../common.js";
|
|
6
|
+
import { Nonce256Bit } from "../zome-call-signing.js";
|
|
6
7
|
import { AppApi, AppInfoRequest, AppInfoResponse, AppSignalCb, CallZomeRequest, CallZomeResponse, CreateCloneCellRequest, CreateCloneCellResponse, DisableCloneCellRequest, DisableCloneCellResponse, EnableCloneCellRequest, EnableCloneCellResponse, NetworkInfoRequest, NetworkInfoResponse } from "./types.js";
|
|
7
8
|
export declare class AppWebsocket extends Emittery implements AppApi {
|
|
8
|
-
client: WsClient;
|
|
9
|
+
readonly client: WsClient;
|
|
9
10
|
defaultTimeout: number;
|
|
10
11
|
overrideInstalledAppId?: InstalledAppId;
|
|
11
|
-
constructor(
|
|
12
|
+
private constructor();
|
|
12
13
|
static connect(url: string, defaultTimeout?: number, signalCb?: AppSignalCb): Promise<AppWebsocket>;
|
|
13
14
|
_requester: <ReqI, ReqO, ResI, ResO>(tag: string, transformer?: Transformer<ReqI, ReqO, ResI, ResO> | undefined) => (req: ReqI, timeout?: number | undefined) => Promise<ResO>;
|
|
14
15
|
appInfo: Requester<AppInfoRequest, AppInfoResponse>;
|
|
@@ -18,7 +19,6 @@ export declare class AppWebsocket extends Emittery implements AppApi {
|
|
|
18
19
|
disableCloneCell: Requester<DisableCloneCellRequest, DisableCloneCellResponse>;
|
|
19
20
|
networkInfo: Requester<NetworkInfoRequest, NetworkInfoResponse>;
|
|
20
21
|
}
|
|
21
|
-
export declare type Nonce256Bit = Uint8Array;
|
|
22
22
|
export interface CallZomeRequestUnsigned extends CallZomeRequest {
|
|
23
23
|
cap_secret: CapSecret | null;
|
|
24
24
|
nonce: Nonce256Bit;
|
package/lib/api/app/websocket.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { decode
|
|
2
|
-
import { invoke } from "@tauri-apps/api/tauri";
|
|
1
|
+
import { decode } from "@msgpack/msgpack";
|
|
3
2
|
import Emittery from "emittery";
|
|
4
|
-
import { getLauncherEnvironment, isLauncher, } from "../../environments/launcher.js";
|
|
3
|
+
import { getLauncherEnvironment, isLauncher, signZomeCallTauri, } from "../../environments/launcher.js";
|
|
5
4
|
import { WsClient } from "../client.js";
|
|
6
5
|
import { catchError, DEFAULT_TIMEOUT, promiseTimeout, requesterTransformer, } from "../common.js";
|
|
7
|
-
import {
|
|
8
|
-
import { getNonceExpiration, randomNonce, signZomeCall } from "./util.js";
|
|
6
|
+
import { signZomeCall } from "../zome-call-signing.js";
|
|
9
7
|
export class AppWebsocket extends Emittery {
|
|
10
8
|
client;
|
|
11
9
|
defaultTimeout;
|
|
@@ -40,73 +38,26 @@ export class AppWebsocket extends Emittery {
|
|
|
40
38
|
networkInfo = this._requester("network_info");
|
|
41
39
|
}
|
|
42
40
|
const callZomeTransform = {
|
|
43
|
-
input: async (
|
|
44
|
-
if ("signature" in
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
if (isLauncher) {
|
|
48
|
-
const zomeCallUnsigned = {
|
|
49
|
-
provenance: Array.from(req.provenance),
|
|
50
|
-
cell_id: [Array.from(req.cell_id[0]), Array.from(req.cell_id[1])],
|
|
51
|
-
zome_name: req.zome_name,
|
|
52
|
-
fn_name: req.fn_name,
|
|
53
|
-
payload: Array.from(encode(req.payload)),
|
|
54
|
-
nonce: Array.from(randomNonce()),
|
|
55
|
-
expires_at: getNonceExpiration(),
|
|
56
|
-
};
|
|
57
|
-
const signedZomeCallTauri = await invoke("sign_zome_call", { zomeCallUnsigned });
|
|
58
|
-
const signedZomeCall = {
|
|
59
|
-
provenance: Uint8Array.from(signedZomeCallTauri.provenance),
|
|
60
|
-
cap_secret: null,
|
|
61
|
-
cell_id: [
|
|
62
|
-
Uint8Array.from(signedZomeCallTauri.cell_id[0]),
|
|
63
|
-
Uint8Array.from(signedZomeCallTauri.cell_id[1]),
|
|
64
|
-
],
|
|
65
|
-
zome_name: signedZomeCallTauri.zome_name,
|
|
66
|
-
fn_name: signedZomeCallTauri.fn_name,
|
|
67
|
-
payload: Uint8Array.from(signedZomeCallTauri.payload),
|
|
68
|
-
signature: Uint8Array.from(signedZomeCallTauri.signature),
|
|
69
|
-
expires_at: signedZomeCallTauri.expires_at,
|
|
70
|
-
nonce: Uint8Array.from(signedZomeCallTauri.nonce),
|
|
71
|
-
};
|
|
72
|
-
return signedZomeCall;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
const signingPropsForCell = getSigningCredentials(req.cell_id);
|
|
76
|
-
if (!signingPropsForCell) {
|
|
77
|
-
throw new Error("cannot sign zome call: signing properties have not been set");
|
|
78
|
-
}
|
|
79
|
-
// const unsignedZomeCall: CallZomeRequestUnsigned = {
|
|
80
|
-
// ...req,
|
|
81
|
-
// cap_secret: signingPropsForCell.capSecret,
|
|
82
|
-
// provenance: signingPropsForCell.signingKey,
|
|
83
|
-
// payload: encode(req.payload),
|
|
84
|
-
// nonce: randomNonce(),
|
|
85
|
-
// expires_at: getNonceExpiration(),
|
|
86
|
-
// };
|
|
87
|
-
// const hashedZomeCall = await hashZomeCall(unsignedZomeCall);
|
|
88
|
-
// const signature = nacl
|
|
89
|
-
// .sign(hashedZomeCall, signingPropsForCell.keyPair.secretKey)
|
|
90
|
-
// .subarray(0, nacl.sign.signatureLength);
|
|
91
|
-
// const signedZomeCall: CallZomeRequestSigned = {
|
|
92
|
-
// ...unsignedZomeCall,
|
|
93
|
-
// signature,
|
|
94
|
-
// };
|
|
95
|
-
const signedZomeCall = await signZomeCall(signingPropsForCell.capSecret, signingPropsForCell.signingKey, signingPropsForCell.keyPair, req);
|
|
96
|
-
return signedZomeCall;
|
|
41
|
+
input: async (request) => {
|
|
42
|
+
if ("signature" in request) {
|
|
43
|
+
return request;
|
|
97
44
|
}
|
|
45
|
+
const signedZomeCall = isLauncher
|
|
46
|
+
? await signZomeCallTauri(request)
|
|
47
|
+
: await signZomeCall(request);
|
|
48
|
+
return signedZomeCall;
|
|
98
49
|
},
|
|
99
|
-
output: (
|
|
50
|
+
output: (response) => decode(response),
|
|
100
51
|
};
|
|
101
52
|
const appInfoTransform = (appWs) => ({
|
|
102
|
-
input: (
|
|
53
|
+
input: (request) => {
|
|
103
54
|
if (appWs.overrideInstalledAppId) {
|
|
104
55
|
return {
|
|
105
56
|
installed_app_id: appWs.overrideInstalledAppId,
|
|
106
57
|
};
|
|
107
58
|
}
|
|
108
|
-
return
|
|
59
|
+
return request;
|
|
109
60
|
},
|
|
110
|
-
output: (
|
|
61
|
+
output: (response) => response,
|
|
111
62
|
});
|
|
112
63
|
//# sourceMappingURL=websocket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app/websocket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ export interface AppAgentClient {
|
|
|
20
20
|
callZome(args: AppAgentCallZomeRequest, timeout?: number): Promise<any>;
|
|
21
21
|
on<Name extends keyof AppAgentEvents>(eventName: Name | readonly Name[], listener: (eventData: AppAgentEvents[Name]) => void | Promise<void>): UnsubscribeFunction;
|
|
22
22
|
appInfo(): Promise<AppInfoResponse>;
|
|
23
|
-
myPubKey
|
|
23
|
+
myPubKey: AgentPubKey;
|
|
24
24
|
createCloneCell(args: AppCreateCloneCellRequest): Promise<CreateCloneCellResponse>;
|
|
25
25
|
enableCloneCell(args: AppEnableCloneCellRequest): Promise<EnableCloneCellResponse>;
|
|
26
26
|
disableCloneCell(args: AppDisableCloneCellRequest): Promise<DisableCloneCellResponse>;
|
|
@@ -1,36 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Defines AppAgentWebsocket, an easy-to-use websocket implementation of the
|
|
3
|
-
* Conductor API for apps, restricted to a single app provided on initialization
|
|
4
|
-
*
|
|
5
|
-
* const appWs = AppWebsocket.connect('ws://127.0.0.1:9000')
|
|
6
|
-
*
|
|
7
|
-
* const client = new AppAgentWebsocket(appWs, 'my_installed_app_id')
|
|
8
|
-
*
|
|
9
|
-
* client.callZome({
|
|
10
|
-
* role_name: 'my_role_name' // role_name is unique per app, so you can unambiguously identify your dna with role_name in this client,
|
|
11
|
-
* zome_name: 'zome',
|
|
12
|
-
* fn_name: 'fn',
|
|
13
|
-
* payload: { value: 'v' }
|
|
14
|
-
* })
|
|
15
|
-
* .then(result => {
|
|
16
|
-
* console.log('callZome returned with:', result)
|
|
17
|
-
* })
|
|
18
|
-
* .catch(err => {
|
|
19
|
-
* console.error('callZome errored with:', err)
|
|
20
|
-
* })
|
|
21
|
-
*/
|
|
22
1
|
import Emittery, { UnsubscribeFunction } from "emittery";
|
|
23
2
|
import { AgentPubKey, InstalledAppId, RoleName } from "../../types.js";
|
|
24
3
|
import { AppInfo, AppInfoResponse, AppWebsocket, CallZomeResponse, CreateCloneCellResponse, DisableCloneCellResponse, EnableCloneCellResponse } from "../index.js";
|
|
25
4
|
import { AppAgentCallZomeRequest, AppAgentClient, AppAgentEvents, AppCreateCloneCellRequest, AppDisableCloneCellRequest, AppEnableCloneCellRequest } from "./types.js";
|
|
26
5
|
export declare class AppAgentWebsocket implements AppAgentClient {
|
|
27
|
-
|
|
6
|
+
myPubKey: AgentPubKey;
|
|
7
|
+
readonly appWebsocket: AppWebsocket;
|
|
28
8
|
installedAppId: InstalledAppId;
|
|
29
9
|
cachedAppInfo?: AppInfo;
|
|
30
|
-
emitter: Emittery<AppAgentEvents
|
|
31
|
-
constructor(
|
|
10
|
+
readonly emitter: Emittery<AppAgentEvents>;
|
|
11
|
+
private constructor();
|
|
32
12
|
appInfo(): Promise<AppInfoResponse>;
|
|
33
|
-
|
|
13
|
+
static connect(appWebsocket: AppWebsocket, installedAppId: InstalledAppId): Promise<AppAgentWebsocket>;
|
|
34
14
|
getCellIdFromRoleName(roleName: RoleName, appInfo: AppInfo): import("../../types.js").CellId;
|
|
35
15
|
callZome(request: AppAgentCallZomeRequest, timeout?: number): Promise<CallZomeResponse>;
|
|
36
16
|
createCloneCell(args: AppCreateCloneCellRequest): Promise<CreateCloneCellResponse>;
|
|
@@ -1,35 +1,33 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Defines AppAgentWebsocket, an easy-to-use websocket implementation of the
|
|
3
|
-
* Conductor API for apps, restricted to a single app provided on initialization
|
|
4
|
-
*
|
|
5
|
-
* const appWs = AppWebsocket.connect('ws://127.0.0.1:9000')
|
|
6
|
-
*
|
|
7
|
-
* const client = new AppAgentWebsocket(appWs, 'my_installed_app_id')
|
|
8
|
-
*
|
|
9
|
-
* client.callZome({
|
|
10
|
-
* role_name: 'my_role_name' // role_name is unique per app, so you can unambiguously identify your dna with role_name in this client,
|
|
11
|
-
* zome_name: 'zome',
|
|
12
|
-
* fn_name: 'fn',
|
|
13
|
-
* payload: { value: 'v' }
|
|
14
|
-
* })
|
|
15
|
-
* .then(result => {
|
|
16
|
-
* console.log('callZome returned with:', result)
|
|
17
|
-
* })
|
|
18
|
-
* .catch(err => {
|
|
19
|
-
* console.error('callZome errored with:', err)
|
|
20
|
-
* })
|
|
21
|
-
*/
|
|
22
1
|
import Emittery from "emittery";
|
|
23
2
|
import { omit } from "lodash-es";
|
|
24
3
|
import { getLauncherEnvironment } from "../../environments/launcher.js";
|
|
25
4
|
import { getBaseRoleNameFromCloneId, isCloneId } from "../common.js";
|
|
5
|
+
import { CellType, } from "../index.js";
|
|
6
|
+
function getPubKey(appInfo) {
|
|
7
|
+
// This is fine for now cause `UseExisting` as a provisioning strategy doesn't work yet.
|
|
8
|
+
// TODO: change this when AppInfo contains the `AgentPubKey` for this app, like `return appInfo.my_pub_key`
|
|
9
|
+
for (const cells of Object.values(appInfo.cell_info)) {
|
|
10
|
+
for (const cell of cells) {
|
|
11
|
+
if (CellType.Provisioned in cell) {
|
|
12
|
+
return cell.Provisioned.cell_id[1];
|
|
13
|
+
}
|
|
14
|
+
else if (CellType.Cloned in cell) {
|
|
15
|
+
return cell.Cloned.cell_id[1];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`This app doesn't have any cells, so we can't return the agent public key for it. This is a known issue, and is going to be fixed in the near future.`);
|
|
20
|
+
}
|
|
26
21
|
export class AppAgentWebsocket {
|
|
22
|
+
myPubKey;
|
|
27
23
|
appWebsocket;
|
|
28
24
|
installedAppId;
|
|
29
25
|
cachedAppInfo;
|
|
30
|
-
emitter
|
|
31
|
-
constructor(appWebsocket, installedAppId) {
|
|
26
|
+
emitter;
|
|
27
|
+
constructor(appWebsocket, installedAppId, myPubKey) {
|
|
28
|
+
this.myPubKey = myPubKey;
|
|
32
29
|
this.appWebsocket = appWebsocket;
|
|
30
|
+
this.emitter = new Emittery();
|
|
33
31
|
const env = getLauncherEnvironment();
|
|
34
32
|
this.installedAppId = env?.INSTALLED_APP_ID || installedAppId;
|
|
35
33
|
this.appWebsocket.on("signal", (signal) => this.emitter.emit("signal", signal));
|
|
@@ -41,21 +39,12 @@ export class AppAgentWebsocket {
|
|
|
41
39
|
this.cachedAppInfo = appInfo;
|
|
42
40
|
return appInfo;
|
|
43
41
|
}
|
|
44
|
-
async
|
|
45
|
-
const appInfo =
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if ("Provisioned" in cell) {
|
|
51
|
-
return cell.Provisioned.cell_id[1];
|
|
52
|
-
}
|
|
53
|
-
else if ("Cloned" in cell) {
|
|
54
|
-
return cell.Cloned.cell_id[1];
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
throw new Error(`This app doesn't have any cells, so we can't return the agent public key for it. This is a known issue, and is going to be fixed in the near future.`);
|
|
42
|
+
static async connect(appWebsocket, installedAppId) {
|
|
43
|
+
const appInfo = await appWebsocket.appInfo({
|
|
44
|
+
installed_app_id: installedAppId,
|
|
45
|
+
});
|
|
46
|
+
const myPubKey = getPubKey(appInfo);
|
|
47
|
+
return new AppAgentWebsocket(appWebsocket, installedAppId, myPubKey);
|
|
59
48
|
}
|
|
60
49
|
getCellIdFromRoleName(roleName, appInfo) {
|
|
61
50
|
if (isCloneId(roleName)) {
|
|
@@ -72,17 +61,17 @@ export class AppAgentWebsocket {
|
|
|
72
61
|
if (!(roleName in appInfo.cell_info)) {
|
|
73
62
|
throw new Error(`No cell found with role_name ${roleName}`);
|
|
74
63
|
}
|
|
75
|
-
const cell = appInfo.cell_info[roleName].find((c) =>
|
|
76
|
-
if (!cell || !(
|
|
64
|
+
const cell = appInfo.cell_info[roleName].find((c) => CellType.Provisioned in c);
|
|
65
|
+
if (!cell || !(CellType.Provisioned in cell)) {
|
|
77
66
|
throw new Error(`No provisioned cell found with role_name ${roleName}`);
|
|
78
67
|
}
|
|
79
|
-
return cell.Provisioned.cell_id;
|
|
68
|
+
return cell[CellType.Provisioned].cell_id;
|
|
80
69
|
}
|
|
81
70
|
async callZome(request, timeout) {
|
|
82
71
|
if (!("provenance" in request)) {
|
|
83
72
|
request = {
|
|
84
73
|
...request,
|
|
85
|
-
provenance:
|
|
74
|
+
provenance: this.myPubKey,
|
|
86
75
|
};
|
|
87
76
|
}
|
|
88
77
|
if ("role_name" in request && request.role_name) {
|
|
@@ -90,7 +79,7 @@ export class AppAgentWebsocket {
|
|
|
90
79
|
const cell_id = this.getCellIdFromRoleName(request.role_name, appInfo);
|
|
91
80
|
const zomeCallPayload = {
|
|
92
81
|
...omit(request, "role_name"),
|
|
93
|
-
provenance:
|
|
82
|
+
provenance: this.myPubKey,
|
|
94
83
|
cell_id,
|
|
95
84
|
};
|
|
96
85
|
return this.appWebsocket.callZome(zomeCallPayload, timeout);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app-agent/websocket.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app-agent/websocket.ts"],"names":[],"mappings":"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"}
|
package/lib/api/index.d.ts
CHANGED
package/lib/api/index.js
CHANGED
package/lib/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
@@ -3,6 +3,14 @@ import { CapSecret } from "../hdk/capabilities.js";
|
|
|
3
3
|
import { AgentPubKey, CellId } from "../types.js";
|
|
4
4
|
import { FunctionName, ZomeName } from "./admin/types.js";
|
|
5
5
|
import { AdminWebsocket } from "./admin/websocket.js";
|
|
6
|
+
import { CallZomeRequest } from "./app/types.js";
|
|
7
|
+
import { CallZomeRequestSigned } from "./app/websocket.js";
|
|
8
|
+
export interface SigningCredentials {
|
|
9
|
+
capSecret: CapSecret;
|
|
10
|
+
keyPair: nacl.SignKeyPair;
|
|
11
|
+
signingKey: AgentPubKey;
|
|
12
|
+
}
|
|
13
|
+
export declare type Nonce256Bit = Uint8Array;
|
|
6
14
|
/**
|
|
7
15
|
* Generate and authorize a new key pair for signing zome calls.
|
|
8
16
|
*
|
|
@@ -18,8 +26,19 @@ export declare const authorizeSigningCredentials: (adminWs: Pick<AdminWebsocket,
|
|
|
18
26
|
* @param cellId - Cell id to be called.
|
|
19
27
|
* @returns The keys and cap secret required for signing a zome call.
|
|
20
28
|
*/
|
|
21
|
-
export declare const getSigningCredentials: (cellId: CellId) =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
export declare const getSigningCredentials: (cellId: CellId) => SigningCredentials | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Generates a key pair for signing zome calls.
|
|
32
|
+
*
|
|
33
|
+
* @returns The signing key pair and an agent pub key based on the public key.
|
|
34
|
+
*/
|
|
35
|
+
export declare const generateSigningKeyPair: () => [
|
|
36
|
+
nacl.SignKeyPair,
|
|
37
|
+
AgentPubKey
|
|
38
|
+
];
|
|
39
|
+
export declare const randomCapSecret: () => CapSecret;
|
|
40
|
+
export declare const randomNonce: () => Nonce256Bit;
|
|
41
|
+
export declare const randomByteArray: (length: number) => Uint8Array;
|
|
42
|
+
export declare const getNonceExpiration: () => number;
|
|
43
|
+
export declare const grantSigningKey: (admin: Pick<AdminWebsocket, "grantZomeCallCapability">, cellId: CellId, functions: Array<[ZomeName, FunctionName]>, signingKey: AgentPubKey) => Promise<CapSecret>;
|
|
44
|
+
export declare const signZomeCall: (request: CallZomeRequest) => Promise<CallZomeRequestSigned>;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { hashZomeCall } from "@holochain/serialization";
|
|
2
|
+
import { encode } from "@msgpack/msgpack";
|
|
3
|
+
import crypto from "crypto";
|
|
4
|
+
import nacl from "tweetnacl";
|
|
1
5
|
import { encodeHashToBase64 } from "../utils/base64.js";
|
|
2
|
-
import { generateSigningKeyPair, grantSigningKey } from "./app/util.js";
|
|
3
6
|
const signingProps = new Map();
|
|
4
7
|
/**
|
|
5
8
|
* Generate and authorize a new key pair for signing zome calls.
|
|
@@ -25,4 +28,69 @@ export const getSigningCredentials = (cellId) => {
|
|
|
25
28
|
const cellIdB64 = encodeHashToBase64(cellId[0]).concat(encodeHashToBase64(cellId[1]));
|
|
26
29
|
return signingProps.get(cellIdB64);
|
|
27
30
|
};
|
|
31
|
+
/**
|
|
32
|
+
* Generates a key pair for signing zome calls.
|
|
33
|
+
*
|
|
34
|
+
* @returns The signing key pair and an agent pub key based on the public key.
|
|
35
|
+
*/
|
|
36
|
+
export const generateSigningKeyPair = () => {
|
|
37
|
+
const keyPair = nacl.sign.keyPair();
|
|
38
|
+
const signingKey = new Uint8Array([132, 32, 36].concat(...keyPair.publicKey).concat(...[0, 0, 0, 0]));
|
|
39
|
+
return [keyPair, signingKey];
|
|
40
|
+
};
|
|
41
|
+
export const randomCapSecret = () => randomByteArray(64);
|
|
42
|
+
export const randomNonce = () => randomByteArray(32);
|
|
43
|
+
export const randomByteArray = (length) => {
|
|
44
|
+
if (typeof window !== "undefined" &&
|
|
45
|
+
"crypto" in window &&
|
|
46
|
+
"getRandomValues" in window.crypto) {
|
|
47
|
+
return window.crypto.getRandomValues(new Uint8Array(length));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
return new Uint8Array(crypto.randomBytes(length));
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
export const getNonceExpiration = () => (Date.now() + 5 * 60 * 1000) * 1000; // 5 mins from now in microseconds
|
|
54
|
+
export const grantSigningKey = async (admin, cellId, functions, signingKey) => {
|
|
55
|
+
const capSecret = randomCapSecret();
|
|
56
|
+
await admin.grantZomeCallCapability({
|
|
57
|
+
cell_id: cellId,
|
|
58
|
+
cap_grant: {
|
|
59
|
+
tag: "zome-call-signing-key",
|
|
60
|
+
functions,
|
|
61
|
+
access: {
|
|
62
|
+
Assigned: {
|
|
63
|
+
secret: capSecret,
|
|
64
|
+
assignees: [signingKey],
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
return capSecret;
|
|
70
|
+
};
|
|
71
|
+
export const signZomeCall = async (request) => {
|
|
72
|
+
const signingCredentialsForCell = getSigningCredentials(request.cell_id);
|
|
73
|
+
if (!signingCredentialsForCell) {
|
|
74
|
+
throw new Error(`cannot sign zome call: no signing credentials have been authorized for cell ${request.cell_id}`);
|
|
75
|
+
}
|
|
76
|
+
const unsignedZomeCallPayload = {
|
|
77
|
+
cap_secret: signingCredentialsForCell.capSecret,
|
|
78
|
+
cell_id: request.cell_id,
|
|
79
|
+
zome_name: request.zome_name,
|
|
80
|
+
fn_name: request.fn_name,
|
|
81
|
+
provenance: signingCredentialsForCell.signingKey,
|
|
82
|
+
payload: encode(request.payload),
|
|
83
|
+
nonce: randomNonce(),
|
|
84
|
+
expires_at: getNonceExpiration(),
|
|
85
|
+
};
|
|
86
|
+
const hashedZomeCall = await hashZomeCall(unsignedZomeCallPayload);
|
|
87
|
+
const signature = nacl
|
|
88
|
+
.sign(hashedZomeCall, signingCredentialsForCell.keyPair.secretKey)
|
|
89
|
+
.subarray(0, nacl.sign.signatureLength);
|
|
90
|
+
const signedZomeCall = {
|
|
91
|
+
...unsignedZomeCallPayload,
|
|
92
|
+
signature,
|
|
93
|
+
};
|
|
94
|
+
return signedZomeCall;
|
|
95
|
+
};
|
|
28
96
|
//# sourceMappingURL=zome-call-signing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zome-call-signing.js","sourceRoot":"","sources":["../../src/api/zome-call-signing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"zome-call-signing.js","sourceRoot":"","sources":["../../src/api/zome-call-signing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAgBxD,MAAM,YAAY,GAAoC,IAAI,GAAG,EAAE,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAC9C,OAAwD,EACxD,MAAc,EACd,SAAqC,EACrC,EAAE;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,sBAAsB,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,eAAe,CACrC,OAAO,EACP,MAAM,EACN,SAAS,EACT,UAAU,CACX,CAAC;IACF,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CACvD,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC9B,CAAC;IACF,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAE,EAAE;IACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CACpD,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC9B,CAAC;IACF,OAAO,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAG/B,GAAG,EAAE;IACP,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,UAAU,CAC/B,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CACnE,CAAC;IACF,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAoB,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,WAAW,GAAsB,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE;IAChD,IACE,OAAO,MAAM,KAAK,WAAW;QAC7B,QAAQ,IAAI,MAAM;QAClB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAClC;QACA,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;KAC9D;SAAM;QACL,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;KACnD;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,kCAAkC;AAE/G,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,KAAsD,EACtD,MAAc,EACd,SAA0C,EAC1C,UAAuB,EACH,EAAE;IACtB,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,KAAK,CAAC,uBAAuB,CAAC;QAClC,OAAO,EAAE,MAAM;QACf,SAAS,EAAE;YACT,GAAG,EAAE,uBAAuB;YAC5B,SAAS;YACT,MAAM,EAAE;gBACN,QAAQ,EAAE;oBACR,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,CAAC,UAAU,CAAC;iBACxB;aACF;SACF;KACF,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,OAAwB,EAAE,EAAE;IAC7D,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,CAAC,yBAAyB,EAAE;QAC9B,MAAM,IAAI,KAAK,CACb,+EAA+E,OAAO,CAAC,OAAO,EAAE,CACjG,CAAC;KACH;IACD,MAAM,uBAAuB,GAA4B;QACvD,UAAU,EAAE,yBAAyB,CAAC,SAAS;QAC/C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,yBAAyB,CAAC,UAAU;QAChD,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAChC,KAAK,EAAE,WAAW,EAAE;QACpB,UAAU,EAAE,kBAAkB,EAAE;KACjC,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,uBAAuB,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI;SACnB,IAAI,CAAC,cAAc,EAAE,yBAAyB,CAAC,OAAO,CAAC,SAAS,CAAC;SACjE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE1C,MAAM,cAAc,GAA0B;QAC5C,GAAG,uBAAuB;QAC1B,SAAS;KACV,CAAC;IACF,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { InstalledAppId } from "../types.js";
|
|
2
|
+
import { CallZomeRequest, CallZomeRequestSigned } from "../api/index.js";
|
|
2
3
|
export interface LauncherEnvironment {
|
|
3
4
|
APP_INTERFACE_PORT: number;
|
|
4
5
|
ADMIN_INTERFACE_PORT: number;
|
|
@@ -12,4 +13,5 @@ declare global {
|
|
|
12
13
|
[__HC_LAUNCHER_ENV__]: LauncherEnvironment | undefined;
|
|
13
14
|
}
|
|
14
15
|
}
|
|
16
|
+
export declare const signZomeCallTauri: (request: CallZomeRequest) => Promise<CallZomeRequestSigned>;
|
|
15
17
|
export {};
|
|
@@ -1,4 +1,34 @@
|
|
|
1
|
+
import { invoke } from "@tauri-apps/api/tauri";
|
|
2
|
+
import { getNonceExpiration, randomNonce, } from "../api/index.js";
|
|
3
|
+
import { encode } from "js-base64";
|
|
1
4
|
const __HC_LAUNCHER_ENV__ = "__HC_LAUNCHER_ENV__";
|
|
2
5
|
export const isLauncher = typeof window === "object" && __HC_LAUNCHER_ENV__ in window;
|
|
3
6
|
export const getLauncherEnvironment = () => isLauncher ? window[__HC_LAUNCHER_ENV__] : undefined;
|
|
7
|
+
export const signZomeCallTauri = async (request) => {
|
|
8
|
+
const zomeCallUnsigned = {
|
|
9
|
+
provenance: Array.from(request.provenance),
|
|
10
|
+
cell_id: [Array.from(request.cell_id[0]), Array.from(request.cell_id[1])],
|
|
11
|
+
zome_name: request.zome_name,
|
|
12
|
+
fn_name: request.fn_name,
|
|
13
|
+
payload: Array.from(encode(request.payload)),
|
|
14
|
+
nonce: Array.from(randomNonce()),
|
|
15
|
+
expires_at: getNonceExpiration(),
|
|
16
|
+
};
|
|
17
|
+
const signedZomeCallTauri = await invoke("sign_zome_call", { zomeCallUnsigned });
|
|
18
|
+
const signedZomeCall = {
|
|
19
|
+
provenance: Uint8Array.from(signedZomeCallTauri.provenance),
|
|
20
|
+
cap_secret: null,
|
|
21
|
+
cell_id: [
|
|
22
|
+
Uint8Array.from(signedZomeCallTauri.cell_id[0]),
|
|
23
|
+
Uint8Array.from(signedZomeCallTauri.cell_id[1]),
|
|
24
|
+
],
|
|
25
|
+
zome_name: signedZomeCallTauri.zome_name,
|
|
26
|
+
fn_name: signedZomeCallTauri.fn_name,
|
|
27
|
+
payload: Uint8Array.from(signedZomeCallTauri.payload),
|
|
28
|
+
signature: Uint8Array.from(signedZomeCallTauri.signature),
|
|
29
|
+
expires_at: signedZomeCallTauri.expires_at,
|
|
30
|
+
nonce: Uint8Array.from(signedZomeCallTauri.nonce),
|
|
31
|
+
};
|
|
32
|
+
return signedZomeCall;
|
|
33
|
+
};
|
|
4
34
|
//# sourceMappingURL=launcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/environments/launcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/environments/launcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAIL,kBAAkB,EAClB,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAQnC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAElD,MAAM,CAAC,MAAM,UAAU,GACrB,OAAO,MAAM,KAAK,QAAQ,IAAI,mBAAmB,IAAI,MAAM,CAAC;AAE9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAoC,EAAE,CAC1E,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AA+BvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAwB,EAAE,EAAE;IAClE,MAAM,gBAAgB,GAAiC;QACrD,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1C,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,UAAU,EAAE,kBAAkB,EAAE;KACjC,CAAC;IAEF,MAAM,mBAAmB,GAA+B,MAAM,MAAM,CAClE,gBAAgB,EAChB,EAAE,gBAAgB,EAAE,CACrB,CAAC;IAEF,MAAM,cAAc,GAA0B;QAC5C,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;QAC3D,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAChD;QACD,SAAS,EAAE,mBAAmB,CAAC,SAAS;QACxC,OAAO,EAAE,mBAAmB,CAAC,OAAO;QACpC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;QACrD,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;QACzD,UAAU,EAAE,mBAAmB,CAAC,UAAU;QAC1C,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;KAClD,CAAC;IAEF,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
|
package/lib/utils/fake-hash.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { randomByteArray } from "../api/
|
|
1
|
+
import { randomByteArray } from "../api/zome-call-signing.js";
|
|
2
2
|
/** From https://github.com/holochain/holochain/blob/develop/crates/holo_hash/src/hash_type/primitive.rs */
|
|
3
3
|
export function fakeEntryHash() {
|
|
4
4
|
return new Uint8Array([0x84, 0x21, 0x24, ...randomByteArray(36)]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-hash.js","sourceRoot":"","sources":["../../src/utils/fake-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"fake-hash.js","sourceRoot":"","sources":["../../src/utils/fake-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,2GAA2G;AAC3G,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
package/package.json
CHANGED
package/lib/api/app/util.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import nacl from "tweetnacl";
|
|
2
|
-
import { CapSecret } from "../../hdk/capabilities.js";
|
|
3
|
-
import { AgentPubKey, CellId } from "../../types.js";
|
|
4
|
-
import { FunctionName, ZomeName } from "../admin/types.js";
|
|
5
|
-
import { AdminWebsocket } from "../admin/websocket.js";
|
|
6
|
-
import { CallZomeRequest } from "./types.js";
|
|
7
|
-
import { CallZomeRequestSigned, Nonce256Bit } from "./websocket.js";
|
|
8
|
-
/**
|
|
9
|
-
* Generates a key pair for signing zome calls.
|
|
10
|
-
*
|
|
11
|
-
* @returns The signing key pair and an agent pub key based on the public key.
|
|
12
|
-
*/
|
|
13
|
-
export declare const generateSigningKeyPair: () => [
|
|
14
|
-
nacl.SignKeyPair,
|
|
15
|
-
AgentPubKey
|
|
16
|
-
];
|
|
17
|
-
export declare const randomCapSecret: () => CapSecret;
|
|
18
|
-
export declare const randomNonce: () => Nonce256Bit;
|
|
19
|
-
export declare const randomByteArray: (length: number) => Uint8Array;
|
|
20
|
-
export declare const getNonceExpiration: () => number;
|
|
21
|
-
export declare const grantSigningKey: (admin: Pick<AdminWebsocket, "grantZomeCallCapability">, cellId: CellId, functions: Array<[ZomeName, FunctionName]>, signingKey: AgentPubKey) => Promise<CapSecret>;
|
|
22
|
-
export declare const signZomeCall: (capSecret: CapSecret, signingKey: AgentPubKey, keyPair: nacl.SignKeyPair, request: CallZomeRequest) => Promise<CallZomeRequestSigned>;
|
|
23
|
-
export declare const grantSigningKeyAndSignZomeCall: (admin: AdminWebsocket, payload: any) => Promise<CallZomeRequestSigned>;
|
package/lib/api/app/util.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { hashZomeCall } from "@holochain/serialization";
|
|
2
|
-
import { encode } from "@msgpack/msgpack";
|
|
3
|
-
import crypto from "crypto";
|
|
4
|
-
import nacl from "tweetnacl";
|
|
5
|
-
/**
|
|
6
|
-
* Generates a key pair for signing zome calls.
|
|
7
|
-
*
|
|
8
|
-
* @returns The signing key pair and an agent pub key based on the public key.
|
|
9
|
-
*/
|
|
10
|
-
export const generateSigningKeyPair = () => {
|
|
11
|
-
const keyPair = nacl.sign.keyPair();
|
|
12
|
-
const signingKey = new Uint8Array([132, 32, 36].concat(...keyPair.publicKey).concat(...[0, 0, 0, 0]));
|
|
13
|
-
return [keyPair, signingKey];
|
|
14
|
-
};
|
|
15
|
-
export const randomCapSecret = () => randomByteArray(64);
|
|
16
|
-
export const randomNonce = () => randomByteArray(32);
|
|
17
|
-
export const randomByteArray = (length) => {
|
|
18
|
-
if (typeof window !== "undefined" &&
|
|
19
|
-
"crypto" in window &&
|
|
20
|
-
"getRandomValues" in window.crypto) {
|
|
21
|
-
return window.crypto.getRandomValues(new Uint8Array(length));
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
return new Uint8Array(crypto.randomBytes(length));
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
export const getNonceExpiration = () => (Date.now() + 5 * 60 * 1000) * 1000; // 5 mins from now in microseconds
|
|
28
|
-
export const grantSigningKey = async (admin, cellId, functions, signingKey) => {
|
|
29
|
-
const capSecret = randomCapSecret();
|
|
30
|
-
await admin.grantZomeCallCapability({
|
|
31
|
-
cell_id: cellId,
|
|
32
|
-
cap_grant: {
|
|
33
|
-
tag: "zome-call-signing-key",
|
|
34
|
-
functions,
|
|
35
|
-
access: {
|
|
36
|
-
Assigned: {
|
|
37
|
-
secret: capSecret,
|
|
38
|
-
assignees: [signingKey],
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
return capSecret;
|
|
44
|
-
};
|
|
45
|
-
export const signZomeCall = async (capSecret, signingKey, keyPair, request) => {
|
|
46
|
-
const unsignedZomeCallPayload = {
|
|
47
|
-
cap_secret: capSecret,
|
|
48
|
-
cell_id: request.cell_id,
|
|
49
|
-
zome_name: request.zome_name,
|
|
50
|
-
fn_name: request.fn_name,
|
|
51
|
-
provenance: signingKey,
|
|
52
|
-
payload: encode(request.payload),
|
|
53
|
-
nonce: randomNonce(),
|
|
54
|
-
expires_at: getNonceExpiration(),
|
|
55
|
-
};
|
|
56
|
-
const hashedZomeCall = await hashZomeCall(unsignedZomeCallPayload);
|
|
57
|
-
const signature = nacl
|
|
58
|
-
.sign(hashedZomeCall, keyPair.secretKey)
|
|
59
|
-
.subarray(0, nacl.sign.signatureLength);
|
|
60
|
-
const signedZomeCall = {
|
|
61
|
-
...unsignedZomeCallPayload,
|
|
62
|
-
signature,
|
|
63
|
-
};
|
|
64
|
-
return signedZomeCall;
|
|
65
|
-
};
|
|
66
|
-
export const grantSigningKeyAndSignZomeCall = async (admin, payload) => {
|
|
67
|
-
const [keyPair, signingKey] = generateSigningKeyPair();
|
|
68
|
-
const capSecret = await grantSigningKey(admin, payload.cell_id, [[payload.zome_name, payload.fn_name]], signingKey);
|
|
69
|
-
payload = { ...payload, cap_secret: capSecret };
|
|
70
|
-
const signedZomeCall = signZomeCall(capSecret, signingKey, keyPair, payload);
|
|
71
|
-
return signedZomeCall;
|
|
72
|
-
};
|
|
73
|
-
//# sourceMappingURL=util.js.map
|
package/lib/api/app/util.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/api/app/util.ts"],"names":[],"mappings":"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"}
|