@holochain/client 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +92 -0
  2. package/lib/api/admin.d.ts +224 -0
  3. package/lib/api/admin.js +12 -0
  4. package/lib/api/admin.js.map +1 -0
  5. package/lib/api/app.d.ts +32 -0
  6. package/lib/api/app.js +3 -0
  7. package/lib/api/app.js.map +1 -0
  8. package/lib/api/common.d.ts +16 -0
  9. package/lib/api/common.js +21 -0
  10. package/lib/api/common.js.map +1 -0
  11. package/lib/api/state-dump.d.ts +36 -0
  12. package/lib/api/state-dump.js +3 -0
  13. package/lib/api/state-dump.js.map +1 -0
  14. package/lib/api/types.d.ts +39 -0
  15. package/lib/api/types.js +8 -0
  16. package/lib/api/types.js.map +1 -0
  17. package/lib/environments/launcher.d.ts +8 -0
  18. package/lib/environments/launcher.js +42 -0
  19. package/lib/environments/launcher.js.map +1 -0
  20. package/lib/index.d.ts +5 -0
  21. package/lib/index.js +18 -0
  22. package/lib/index.js.map +1 -0
  23. package/lib/types/capabilities.d.ts +30 -0
  24. package/lib/types/capabilities.js +3 -0
  25. package/lib/types/capabilities.js.map +1 -0
  26. package/lib/types/common.d.ts +22 -0
  27. package/lib/types/common.js +3 -0
  28. package/lib/types/common.js.map +1 -0
  29. package/lib/types/dht-ops.d.ts +45 -0
  30. package/lib/types/dht-ops.js +42 -0
  31. package/lib/types/dht-ops.js.map +1 -0
  32. package/lib/types/entry.d.ts +16 -0
  33. package/lib/types/entry.js +3 -0
  34. package/lib/types/entry.js.map +1 -0
  35. package/lib/types/header.d.ts +108 -0
  36. package/lib/types/header.js +17 -0
  37. package/lib/types/header.js.map +1 -0
  38. package/lib/types/index.d.ts +5 -0
  39. package/lib/types/index.js +18 -0
  40. package/lib/types/index.js.map +1 -0
  41. package/lib/websocket/admin.d.ts +47 -0
  42. package/lib/websocket/admin.js +127 -0
  43. package/lib/websocket/admin.js.map +1 -0
  44. package/lib/websocket/app.d.ts +13 -0
  45. package/lib/websocket/app.js +70 -0
  46. package/lib/websocket/app.js.map +1 -0
  47. package/lib/websocket/client.d.ts +25 -0
  48. package/lib/websocket/client.js +129 -0
  49. package/lib/websocket/client.js.map +1 -0
  50. package/lib/websocket/common.d.ts +3 -0
  51. package/lib/websocket/common.js +34 -0
  52. package/lib/websocket/common.js.map +1 -0
  53. package/package.json +49 -0
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WsClient = void 0;
7
+ const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
8
+ const msgpack_1 = require("@msgpack/msgpack");
9
+ /**
10
+ * A Websocket client which can make requests and receive responses,
11
+ * as well as send and receive signals
12
+ *
13
+ * Uses Holochain's websocket WireMessage for communication.
14
+ */
15
+ class WsClient {
16
+ constructor(socket, signalCb) {
17
+ this.socket = socket;
18
+ this.pendingRequests = {};
19
+ this.index = 0;
20
+ // TODO: allow adding signal handlers later
21
+ this.alreadyWarnedNoSignalCb = false;
22
+ socket.onmessage = async (encodedMsg) => {
23
+ let data = encodedMsg.data;
24
+ // If data is not a buffer (nodejs), it will be a blob (browser)
25
+ if (typeof Buffer === "undefined" || !Buffer.isBuffer(data)) {
26
+ data = await data.arrayBuffer();
27
+ }
28
+ const msg = (0, msgpack_1.decode)(data);
29
+ if (msg.type === "Signal") {
30
+ if (signalCb) {
31
+ const decodedMessage = (0, msgpack_1.decode)(msg.data);
32
+ if (!decodedMessage.App) {
33
+ // We have received a system signal, do nothing
34
+ return;
35
+ }
36
+ // Note: holochain currently returns signals as an array of two values: cellId and the serialized signal payload
37
+ // and this array is nested within the App key within the returned message.
38
+ const decodedCellId = decodedMessage.App[0];
39
+ // Note:In order to return readible content to the UI, the signal payload must also be decoded.
40
+ const decodedPayload = signalTransform(decodedMessage.App[1]);
41
+ // Return a uniform format to UI (ie: { type, data } - the same format as with callZome and appInfo...)
42
+ const signal = {
43
+ type: msg.type,
44
+ data: { cellId: decodedCellId, payload: decodedPayload },
45
+ };
46
+ signalCb(signal);
47
+ }
48
+ else {
49
+ if (!this.alreadyWarnedNoSignalCb)
50
+ console.log('Received signal but no signal callback was set in constructor');
51
+ this.alreadyWarnedNoSignalCb = true;
52
+ }
53
+ }
54
+ else if (msg.type === 'Response') {
55
+ this.handleResponse(msg);
56
+ }
57
+ else {
58
+ console.error(`Got unrecognized Websocket message type: ${msg.type}`);
59
+ }
60
+ };
61
+ }
62
+ emitSignal(data) {
63
+ const encodedMsg = (0, msgpack_1.encode)({
64
+ type: 'Signal',
65
+ data: (0, msgpack_1.encode)(data),
66
+ });
67
+ this.socket.send(encodedMsg);
68
+ }
69
+ request(data) {
70
+ const id = this.index;
71
+ this.index += 1;
72
+ const encodedMsg = (0, msgpack_1.encode)({
73
+ id,
74
+ type: 'Request',
75
+ data: (0, msgpack_1.encode)(data),
76
+ });
77
+ const promise = new Promise((fulfill, reject) => {
78
+ this.pendingRequests[id] = { fulfill, reject };
79
+ });
80
+ if (this.socket.readyState === this.socket.OPEN) {
81
+ this.socket.send(encodedMsg);
82
+ }
83
+ else {
84
+ return Promise.reject(new Error('Socket is not open'));
85
+ }
86
+ return promise;
87
+ }
88
+ handleResponse(msg) {
89
+ const id = msg.id;
90
+ if (this.pendingRequests[id]) {
91
+ // resolve response
92
+ if (msg.data === null || msg.data === undefined) {
93
+ this.pendingRequests[id].reject(new Error('Response canceled by responder'));
94
+ }
95
+ else {
96
+ this.pendingRequests[id].fulfill((0, msgpack_1.decode)(msg.data));
97
+ }
98
+ }
99
+ else {
100
+ console.error(`Got response with no matching request. id=${id}`);
101
+ }
102
+ }
103
+ close() {
104
+ this.socket.close();
105
+ return this.awaitClose();
106
+ }
107
+ awaitClose() {
108
+ return new Promise((resolve) => this.socket.on('close', resolve));
109
+ }
110
+ static connect(url, signalCb) {
111
+ return new Promise((resolve, reject) => {
112
+ const socket = new isomorphic_ws_1.default(url);
113
+ // make sure that there are no uncaught connection
114
+ // errors because that causes nodejs thread to crash
115
+ // with uncaught exception
116
+ socket.onerror = () => {
117
+ reject(new Error(`could not connect to holochain conductor, please check that a conductor service is running and available at ${url}`));
118
+ };
119
+ socket.onopen = () => {
120
+ resolve(new WsClient(socket, signalCb));
121
+ };
122
+ });
123
+ }
124
+ }
125
+ exports.WsClient = WsClient;
126
+ const signalTransform = (res) => {
127
+ return (0, msgpack_1.decode)(res);
128
+ };
129
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/websocket/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_TIMEOUT = 15000;
2
+ export declare const catchError: (res: any) => Promise<any>;
3
+ export declare const promiseTimeout: (promise: Promise<any>, tag: string, ms: number) => Promise<unknown>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.promiseTimeout = exports.catchError = exports.DEFAULT_TIMEOUT = void 0;
4
+ const ERROR_TYPE = 'error';
5
+ exports.DEFAULT_TIMEOUT = 15000;
6
+ const catchError = (res) => {
7
+ return res.type === ERROR_TYPE
8
+ ? Promise.reject(res)
9
+ : Promise.resolve(res);
10
+ };
11
+ exports.catchError = catchError;
12
+ const promiseTimeout = (promise, tag, ms) => {
13
+ let id;
14
+ const timeout = new Promise((_, reject) => {
15
+ id = setTimeout(() => {
16
+ clearTimeout(id);
17
+ reject(new Error(`Timed out in ${ms}ms: ${tag}`));
18
+ }, ms);
19
+ });
20
+ return new Promise((res, rej) => {
21
+ Promise.race([
22
+ promise,
23
+ timeout
24
+ ]).then((a) => {
25
+ clearTimeout(id);
26
+ return res(a);
27
+ })
28
+ .catch(e => {
29
+ return rej(e);
30
+ });
31
+ });
32
+ };
33
+ exports.promiseTimeout = promiseTimeout;
34
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/websocket/common.ts"],"names":[],"mappings":";;;AAAA,MAAM,UAAU,GAAG,OAAO,CAAA;AACb,QAAA,eAAe,GAAG,KAAK,CAAA;AAE7B,MAAM,UAAU,GAAG,CAAC,GAAQ,EAAE,EAAE;IACrC,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU;QAC5B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC,CAAA;AAJY,QAAA,UAAU,cAItB;AAEM,MAAM,cAAc,GAAG,CAAC,OAAqB,EAAE,GAAW,EAAE,EAAU,EAAE,EAAE;IAC/E,IAAI,EAAkB,CAAA;IAEtB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACxC,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YACnB,YAAY,CAAC,EAAE,CAAC,CAAA;YAChB,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC,CAAA;QACnD,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC9B,OAAO,CAAC,IAAI,CAAC;YACX,OAAO;YACP,OAAO;SACR,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,YAAY,CAAC,EAAE,CAAC,CAAA;YAChB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;QACf,CAAC,CAAC;aACC,KAAK,CAAC,CAAC,CAAC,EAAE;YACT,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAtBY,QAAA,cAAc,kBAsB1B"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@holochain/client",
3
+ "version": "0.3.0",
4
+ "description": "A Nodejs client for the Holochain conductor API",
5
+ "author": "Holochain Foundation <info@holochain.org> (http://holochain.org)",
6
+ "license": "CAL 1.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/holochain/holochain-client-js.git"
10
+ },
11
+ "keywords": [
12
+ "holochain",
13
+ "client",
14
+ "conductor api"
15
+ ],
16
+ "bugs": {
17
+ "url": "https://github.com/holochain/holochain-client-js/issues"
18
+ },
19
+ "homepage": "https://github.com/holochain/holochain-client-js#readme",
20
+
21
+ "files": [
22
+ "lib"
23
+ ],
24
+ "main": "lib/index.js",
25
+ "types": "lib/index.d.ts",
26
+
27
+ "scripts": {
28
+ "lint": "eslint src/**/*.ts test/**/*.ts --fix",
29
+ "test": "RUST_LOG=error RUST_BACKTRACE=1 ts-node test",
30
+ "build": "tsc -b"
31
+ },
32
+
33
+ "dependencies": {
34
+ "@msgpack/msgpack": "^2.7.1",
35
+ "cross-fetch": "^3.1.4",
36
+ "isomorphic-ws": "^4.0.1"
37
+ },
38
+ "devDependencies": {
39
+ "@types/js-yaml": "^3.12.7",
40
+ "@types/tape": "^4.13.2",
41
+ "@typescript-eslint/eslint-plugin": "^5.9.0",
42
+ "@typescript-eslint/parser": "^5.9.0",
43
+ "eslint": "^8.6.0",
44
+ "js-yaml": "^3.14.1",
45
+ "tape": "^5.4.0",
46
+ "ts-node": "^10.4.0",
47
+ "typescript": "^4.5.4"
48
+ }
49
+ }