| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 | 1x
1x
1x
1x
1x
1x
4x
26x
26x
26x
26x
26x
1x
1x
1x
1x
29x
1x | const debug = require('debug')('socketcluster-api:API');
const Codec = require('sc-codec-protobuf');
const Router = require('./Router');
const protobuf = require('./protobuf');
const { serialize, deserialize } = require('./protobufCodec');
const { defineProperty } = Object;
const request = (scSocket, method, pbRoot) => (resource, [ dataType, plain ]) => new Promise((resolve, reject) => {
debug('request: %s %s', method, resource);
const buffer = serialize(pbRoot.lookupType(dataType), plain);
scSocket.emit('#api', { resource, method, dataType, buffer }, (err, data) => {
debug('response: %o', data);
if (err) {
// This is *not* a socketclusterapi error. This is a lower level stack error.
return reject(err);
}
const clientData = deserialize(pbRoot.lookupType(data.dataType), data.buffer);
if (data.isError) {
reject(clientData);
} else {
resolve(clientData);
}
});
});
class API {
constructor(protobufs = []) {
const { encode, decode, messageTypes, pbRoot } = Codec(...protobufs, protobuf);
messageTypes.addEvent('#api', '.socketclusterapi.ApiCall', '.socketclusterapi.ApiResponse');
this._pbRoot = pbRoot;
this._encode = encode;
this._decode = decode;
}
defineEndpoints(scSocket) {
defineProperty(scSocket, 'get', {
configurable: false,
enumerable: false,
writable: false,
value: request(scSocket, 'get', this._pbRoot)
});
defineProperty(scSocket, 'post', {
configurable: false,
enumerable: false,
writable: false,
value: request(scSocket, 'post', this._pbRoot)
});
defineProperty(scSocket, 'put', {
configurable: false,
enumerable: false,
writable: false,
value: request(scSocket, 'put', this._pbRoot)
});
defineProperty(scSocket, 'delete', {
configurable: false,
enumerable: false,
writable: false,
value: request(scSocket, 'delete', this._pbRoot)
});
}
router() {
return new Router(this._pbRoot);
}
get codec() {
return ({ encode: this._encode, decode: this._decode });
}
}
module.exports = API; |