15
15
*/
16
16
17
17
const Caver = require ( 'caver-js' )
18
+ const _ = require ( 'lodash' )
18
19
const KAS = require ( './src/kas/kas' )
19
20
const KASWallet = require ( './src/wallet/kasWallet' )
20
21
@@ -47,8 +48,9 @@ class CaverExtKAS extends Caver {
47
48
* @param {number } chainId The chain id.
48
49
* @param {string } accessKeyId The access key id.
49
50
* @param {string } secretAccessKey The secret access key.
51
+ * @param {object } [opt] An object that defines the option value used when initializing to use the KAS API.
50
52
*/
51
- constructor ( chainId , accessKeyId , secretAccessKey ) {
53
+ constructor ( chainId , accessKeyId , secretAccessKey , opt ) {
52
54
super ( )
53
55
54
56
this . kas = new KAS ( )
@@ -78,7 +80,7 @@ class CaverExtKAS extends Caver {
78
80
this . keyringContainer . keyring = this . wallet . keyring
79
81
this . wallet = kasWallet
80
82
81
- if ( chainId !== undefined && accessKeyId && secretAccessKey ) this . initKASAPI ( chainId , accessKeyId , secretAccessKey )
83
+ if ( chainId !== undefined && accessKeyId && secretAccessKey ) this . initKASAPI ( chainId , accessKeyId , secretAccessKey , opt )
82
84
}
83
85
84
86
/**
@@ -111,14 +113,17 @@ class CaverExtKAS extends Caver {
111
113
*
112
114
* @example
113
115
* caver.initKASAPI(1001, 'accessKeyId', 'secretAccessKey')
116
+ * caver.initKASAPI(1001, 'accessKeyId', 'secretAccessKey', { useNodeAPIWithHttp: true }) // use HttpProvider with Node API
117
+ * caver.initKASAPI(1001, 'accessKeyId', 'secretAccessKey', { useNodeAPIWithHttp: false }) // use WebsocketProvider with Node API
114
118
*
115
119
* @param {number } chainId The chain id.
116
120
* @param {string } accessKeyId The access key id.
117
121
* @param {string } secretAccessKey The secret access key.
122
+ * @param {object } [opt] An object that defines the option value used when initializing to use the KAS API.
118
123
* @return {void }
119
124
*/
120
- initKASAPI ( chainId , accessKeyId , secretAccessKey ) {
121
- this . initNodeAPI ( chainId , accessKeyId , secretAccessKey )
125
+ initKASAPI ( chainId , accessKeyId , secretAccessKey , opt = { useNodeAPIWithHttp : true } ) {
126
+ this . initNodeAPI ( chainId , accessKeyId , secretAccessKey , opt . useNodeAPIWithHttp )
122
127
this . initTokenHistoryAPI ( chainId , accessKeyId , secretAccessKey )
123
128
this . initWalletAPI ( chainId , accessKeyId , secretAccessKey )
124
129
this . initAnchorAPI ( chainId , accessKeyId , secretAccessKey )
@@ -130,16 +135,52 @@ class CaverExtKAS extends Caver {
130
135
* Sets chain id and authentication key for Node API.
131
136
*
132
137
* @example
133
- * caver.initNodeAPI(1001, 'accessKeyId', 'secretAccessKey')
134
- * caver.initNodeAPI(1001, 'accessKeyId', 'secretAccessKey', 'Node API url to use')
138
+ * caver.initNodeAPI(1001, 'accessKeyId', 'secretAccessKey', true) // HttpProvider
139
+ * caver.initNodeAPI(1001, 'accessKeyId', 'secretAccessKey', true, 'Node API url to use') // HttpProvider
140
+ *
141
+ * caver.initNodeAPI(1001, 'accessKeyId', 'secretAccessKey', false) // WebsocketProvider
142
+ * caver.initNodeAPI(1001, 'accessKeyId', 'secretAccessKey', false, 'Node API url to use') // WebsocketProvider
135
143
*
136
144
* @param {number } chainId The chain id.
137
145
* @param {string } accessKeyId The access key id.
138
146
* @param {string } secretAccessKey The secret access key.
147
+ * @param {boolean } [useHttp] If `true`, `HttpProvider` is used. If `false`, `WebsocketProvider` is used. (defaults to `true`)
139
148
* @param {string } [url] The end point url.
140
149
* @return {void }
141
150
*/
142
- initNodeAPI ( chainId , accessKeyId , secretAccessKey , url = productionEndpoints . node ) {
151
+ initNodeAPI ( chainId , accessKeyId , secretAccessKey , useHttp , url ) {
152
+ // chainId, accessKeyId, secretAccessKey
153
+ // chainId, accessKeyId, secretAccessKey, useHttp
154
+ // chainId, accessKeyId, secretAccessKey, url
155
+ // chainId, accessKeyId, secretAccessKey, useHttp, url
156
+ if ( _ . isString ( useHttp ) ) {
157
+ url = useHttp
158
+ useHttp = undefined
159
+ }
160
+ useHttp = useHttp === undefined ? true : useHttp
161
+ url = url === undefined ? productionEndpoints . node : url
162
+
163
+ if ( useHttp ) {
164
+ return this . initNodeAPIWithHttp ( chainId , accessKeyId , secretAccessKey , url )
165
+ }
166
+
167
+ return this . initNodeAPIWithWebSocket ( chainId , accessKeyId , secretAccessKey , url )
168
+ }
169
+
170
+ /**
171
+ * Sets chain id and authentication key for Node API.
172
+ * This function will set caver's provider with HttpProvider.
173
+ *
174
+ * @example
175
+ * caver.initNodeAPIWithHttp(1001, 'accessKeyId', 'secretAccessKey', 'Node API url to use')
176
+ *
177
+ * @param {number } chainId The chain id.
178
+ * @param {string } accessKeyId The access key id.
179
+ * @param {string } secretAccessKey The secret access key.
180
+ * @param {string } url The end point url.
181
+ * @return {void }
182
+ */
183
+ initNodeAPIWithHttp ( chainId , accessKeyId , secretAccessKey , url ) {
143
184
if ( url . endsWith ( '/' ) ) url = url . slice ( 0 , url . length - 1 )
144
185
145
186
const splitted = url . split ( '/' )
@@ -157,6 +198,34 @@ class CaverExtKAS extends Caver {
157
198
this . _requestManager . provider . headers = this . _requestManager . provider . headers . concat ( auth )
158
199
}
159
200
201
+ /**
202
+ * Sets chain id and authentication key for Node API with web socket.
203
+ * This function will set caver's provider with WebsocketProvider.
204
+ *
205
+ * @example
206
+ * caver.initNodeAPIWithWebSocket(1001, 'accessKeyId', 'secretAccessKey', 'Node API url to use')
207
+ *
208
+ * @param {number } chainId The chain id.
209
+ * @param {string } accessKeyId The access key id.
210
+ * @param {string } secretAccessKey The secret access key.
211
+ * @param {string } url The end point url.
212
+ * @return {void }
213
+ */
214
+ initNodeAPIWithWebSocket ( chainId , accessKeyId , secretAccessKey , url ) {
215
+ const regex = / [ ` ! @ # $ % ^ & * ( ) _ + \- = [ \] { } ; ' : " \\ | , . < > / ? ~ ] /
216
+ if ( regex . test ( accessKeyId ) || regex . test ( secretAccessKey ) )
217
+ throw new Error (
218
+ `Invalid auth: To use the websocket provider, you must use an accessKey and seretAccessKey that do not contain special characters. Please obtain a new AccessKey through the KAS Console.`
219
+ )
220
+
221
+ const endpoint = `wss://${ accessKeyId } :${ secretAccessKey } @${ url
222
+ . slice ( url . indexOf ( '//' ) + 2 )
223
+ . replace ( '/v1/klaytn' , '' ) } /v1/ws/open?chain-id=${ chainId } `
224
+
225
+ const ws = new this . providers . WebsocketProvider ( endpoint )
226
+ this . setProvider ( ws )
227
+ }
228
+
160
229
/**
161
230
* Sets chain id and authentication key for Token History API.
162
231
*
0 commit comments