@crmcom/self-service-sdk 3.0.0-build.8 → 3.0.0-build.9
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/README.md +165 -0
- package/httpBackOfficeUtil.js +21 -3
- package/httpUtil.js +23 -3
- package/index.d.ts +22 -7
- package/index.js +17 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# @crmcom/self-service-sdk
|
|
2
|
+
|
|
3
|
+
Official CRM.COM Self-Service JavaScript SDK for consumer-facing API integration.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @crmcom/self-service-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Peer Dependencies
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install jwt-decode js-sha256 xml2js
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
### 1. Initialize the SDK
|
|
20
|
+
|
|
21
|
+
You **must** call `init()` before using any other SDK method. This configures the HTTP layer with your API credentials and session management callbacks.
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { init } from '@crmcom/self-service-sdk';
|
|
25
|
+
|
|
26
|
+
await init({
|
|
27
|
+
apiKey: 'YOUR_API_KEY',
|
|
28
|
+
host: 'https://api.crm.com',
|
|
29
|
+
storeKVFn: (key, value) => localStorage.setItem(key, value),
|
|
30
|
+
getKVFn: (key) => localStorage.getItem(key),
|
|
31
|
+
sessionInvalidCallback: (shouldLogout) => {
|
|
32
|
+
if (shouldLogout) {
|
|
33
|
+
// redirect to login
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Use SDK modules
|
|
40
|
+
|
|
41
|
+
Once initialized, import and use any module:
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
import { authentication, contacts, orders, wallet } from '@crmcom/self-service-sdk';
|
|
45
|
+
|
|
46
|
+
// Authenticate
|
|
47
|
+
const authResult = await authentication.authenticateEmail({
|
|
48
|
+
username: 'user@example.com',
|
|
49
|
+
password: 'password',
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Get contact profile
|
|
53
|
+
const profile = await contacts.getContact();
|
|
54
|
+
|
|
55
|
+
// Browse products
|
|
56
|
+
const products = await orders.getProducts({ page: 1, size: 20 });
|
|
57
|
+
|
|
58
|
+
// Check wallet balance
|
|
59
|
+
const myWallet = await wallet.getWallet();
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### React Example
|
|
63
|
+
|
|
64
|
+
```jsx
|
|
65
|
+
// App.jsx
|
|
66
|
+
import { useEffect, useState } from 'react';
|
|
67
|
+
import { init } from '@crmcom/self-service-sdk';
|
|
68
|
+
|
|
69
|
+
function App() {
|
|
70
|
+
const [ready, setReady] = useState(false);
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
init({
|
|
74
|
+
apiKey: process.env.REACT_APP_CRM_API_KEY,
|
|
75
|
+
host: process.env.REACT_APP_CRM_HOST,
|
|
76
|
+
storeKVFn: (key, value) => localStorage.setItem(key, JSON.stringify(value)),
|
|
77
|
+
getKVFn: (key) => JSON.parse(localStorage.getItem(key)),
|
|
78
|
+
sessionInvalidCallback: () => {
|
|
79
|
+
window.location.href = '/login';
|
|
80
|
+
},
|
|
81
|
+
}).then(() => setReady(true));
|
|
82
|
+
}, []);
|
|
83
|
+
|
|
84
|
+
if (!ready) return <div>Loading...</div>;
|
|
85
|
+
|
|
86
|
+
return <YourApp />;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Init Options
|
|
91
|
+
|
|
92
|
+
| Parameter | Type | Required | Description |
|
|
93
|
+
|-----------|------|----------|-------------|
|
|
94
|
+
| `apiKey` | `string` | Yes | Your CRM.COM API key |
|
|
95
|
+
| `host` | `string` | Yes | Base API URL (e.g. `https://api.crm.com`) |
|
|
96
|
+
| `storeKVFn` | `(key, value) => void \| Promise<void>` | Yes | Function to persist key-value pairs (tokens, session data) |
|
|
97
|
+
| `getKVFn` | `(key) => any \| Promise<any>` | Yes | Function to retrieve persisted values |
|
|
98
|
+
| `sessionInvalidCallback` | `(shouldLogout) => void` | Yes | Called when session is invalid and refresh fails |
|
|
99
|
+
| `fetchFn` | `typeof fetch` | No | Custom fetch implementation (defaults to global `fetch`) |
|
|
100
|
+
| `enableSslPinning` | `boolean` | No | Enable SSL pinning (mobile apps) |
|
|
101
|
+
| `sslPinningOptions` | `Record<string, any>` | No | SSL pinning configuration |
|
|
102
|
+
| `isBackend` | `boolean` | No | Set `true` for backend/server usage |
|
|
103
|
+
| `middlewareHost` | `string` | No | Middleware service host URL |
|
|
104
|
+
| `middlewareApiKey` | `string` | No | Middleware API key |
|
|
105
|
+
| `mwNodejsHost` | `string` | No | Node.js middleware host URL |
|
|
106
|
+
| `mwNodejsApiKey` | `string` | No | Node.js middleware API key |
|
|
107
|
+
|
|
108
|
+
## Available Modules
|
|
109
|
+
|
|
110
|
+
| Module | Description |
|
|
111
|
+
|--------|-------------|
|
|
112
|
+
| `authentication` | Phone, email, Facebook, SSO/OIDC auth flows |
|
|
113
|
+
| `contacts` | Contact profile, addresses, preferences |
|
|
114
|
+
| `orders` | Catalogue, products, order estimation and placement |
|
|
115
|
+
| `wallet` | Balance, transactions, top-ups, transfers |
|
|
116
|
+
| `payment` | Payment methods, forms, top-ups |
|
|
117
|
+
| `subscriptions` | Services, devices, billing |
|
|
118
|
+
| `rewards` | Offers, promotions, schemes |
|
|
119
|
+
| `account` | Journals, balances, rewards |
|
|
120
|
+
| `communications` | Messages, notifications |
|
|
121
|
+
| `community` | Members, relations, groups |
|
|
122
|
+
| `config` | App config, languages, address lookup |
|
|
123
|
+
| `organisations` | Organisation search, locations |
|
|
124
|
+
| `servicerequest` | Support tickets |
|
|
125
|
+
| `connectx` | SIM management |
|
|
126
|
+
| `jcccards` | Card operations |
|
|
127
|
+
| `mobilepass` | Mobile wallet passes |
|
|
128
|
+
| `paymentgateway` | Payment gateway client tokens |
|
|
129
|
+
| `payouts` | Payout creation |
|
|
130
|
+
|
|
131
|
+
## Error Handling
|
|
132
|
+
|
|
133
|
+
All SDK methods return an `SDKResult` object:
|
|
134
|
+
|
|
135
|
+
```js
|
|
136
|
+
const result = await contacts.getContact();
|
|
137
|
+
|
|
138
|
+
if (result.code === 'OK') {
|
|
139
|
+
console.log(result.data);
|
|
140
|
+
} else {
|
|
141
|
+
console.error('Error:', result.code, result.error);
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
If the SDK is used before calling `init()`, it throws:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
Error: CRM.COM SDK not initialized. Call init() before using any SDK methods.
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Migration from v2
|
|
152
|
+
|
|
153
|
+
If you were using `setupChannel`, it still works but is deprecated:
|
|
154
|
+
|
|
155
|
+
```diff
|
|
156
|
+
- import { httpUtil } from '@crmcom/self-service-sdk';
|
|
157
|
+
- await httpUtil.setupChannel({ apiKey, host, ... });
|
|
158
|
+
|
|
159
|
+
+ import { init } from '@crmcom/self-service-sdk';
|
|
160
|
+
+ await init({ apiKey, host, ... });
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## License
|
|
164
|
+
|
|
165
|
+
MIT
|
package/httpBackOfficeUtil.js
CHANGED
|
@@ -6,8 +6,13 @@
|
|
|
6
6
|
import {jwtDecode} from 'jwt-decode';
|
|
7
7
|
import { logger } from './logger';
|
|
8
8
|
|
|
9
|
+
let _initialized = false;
|
|
10
|
+
|
|
9
11
|
export const httpBackOfficeUtil = {
|
|
10
|
-
|
|
12
|
+
init,
|
|
13
|
+
/** @deprecated Use init() instead */
|
|
14
|
+
setupChannel: init,
|
|
15
|
+
isInitialized: () => _initialized,
|
|
11
16
|
put,
|
|
12
17
|
post,
|
|
13
18
|
get,
|
|
@@ -29,6 +34,15 @@ const initOptionHeader = () => {
|
|
|
29
34
|
|
|
30
35
|
/** local variables */
|
|
31
36
|
|
|
37
|
+
function _assertInitialized() {
|
|
38
|
+
if (!_initialized) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
'CRM.COM Back-Office SDK not initialized. Call initBackOffice() before using any back-office SDK methods. ' +
|
|
41
|
+
'Example: import { initBackOffice } from "@crmcom/self-service-sdk"; await initBackOffice({ apiKey, host, ... });'
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
32
46
|
let _storeKVFn;
|
|
33
47
|
let _getKVFn;
|
|
34
48
|
let _sessionInvalidCallback;
|
|
@@ -48,7 +62,7 @@ let _backofficePath = 'backoffice/v1/';
|
|
|
48
62
|
* when no connection refresh token will not be available -> should not kick user out.
|
|
49
63
|
*/
|
|
50
64
|
|
|
51
|
-
async function
|
|
65
|
+
async function init({
|
|
52
66
|
storeKVFn, //function to store key value
|
|
53
67
|
getKVFn, //function to get value by key from the storage
|
|
54
68
|
sessionInvalidCallback, //function to call when api_key or token key is invalid and refresh token if available was failed
|
|
@@ -80,7 +94,7 @@ async function setupChannel({
|
|
|
80
94
|
_sessionData = undefined;
|
|
81
95
|
}
|
|
82
96
|
}
|
|
83
|
-
|
|
97
|
+
_initialized = true;
|
|
84
98
|
}
|
|
85
99
|
|
|
86
100
|
async function refreshToken() {
|
|
@@ -184,6 +198,7 @@ async function post({
|
|
|
184
198
|
logOutIfSessionInvalid=true,
|
|
185
199
|
refreshToken
|
|
186
200
|
}) {
|
|
201
|
+
_assertInitialized();
|
|
187
202
|
// let serverConfig = getServerConfig();
|
|
188
203
|
// let uri = getURI(isBackend, resourcePath);
|
|
189
204
|
let uri = _host + 'backoffice/v1/' + resourcePath;
|
|
@@ -247,6 +262,7 @@ async function get({
|
|
|
247
262
|
logOutIfSessionInvalid = true,
|
|
248
263
|
returnText=false
|
|
249
264
|
}) {
|
|
265
|
+
_assertInitialized();
|
|
250
266
|
let uri = getURI(isBackend, resourcePath);
|
|
251
267
|
// let uri = _host + 'backoffice/v1/' + resourcePath;
|
|
252
268
|
var options = {};
|
|
@@ -296,6 +312,7 @@ async function sendDelete({
|
|
|
296
312
|
isBackend = false,
|
|
297
313
|
logOutIfSessionInvalid = true
|
|
298
314
|
}) {
|
|
315
|
+
_assertInitialized();
|
|
299
316
|
// let uri = getURI(isBackend, resourcePath);
|
|
300
317
|
let uri = _host + 'backoffice/v1/' + resourcePath;
|
|
301
318
|
var options = {};
|
|
@@ -344,6 +361,7 @@ async function put({
|
|
|
344
361
|
isBackend = false,
|
|
345
362
|
logOutIfSessionInvalid = true
|
|
346
363
|
}) {
|
|
364
|
+
_assertInitialized();
|
|
347
365
|
// let uri = getURI(isBackend, resourcePath);
|
|
348
366
|
let uri = _host + 'backoffice/v1/' + resourcePath;
|
|
349
367
|
var options = {};
|
package/httpUtil.js
CHANGED
|
@@ -17,8 +17,13 @@ const initOptionHeader = () => {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// import { showMessageError } from '../../utils/util';
|
|
20
|
+
let _initialized = false;
|
|
21
|
+
|
|
20
22
|
export const httpUtil = {
|
|
21
|
-
|
|
23
|
+
init,
|
|
24
|
+
/** @deprecated Use init() instead */
|
|
25
|
+
setupChannel: init,
|
|
26
|
+
isInitialized: () => _initialized,
|
|
22
27
|
put,
|
|
23
28
|
post,
|
|
24
29
|
get,
|
|
@@ -43,6 +48,15 @@ export const httpUtil = {
|
|
|
43
48
|
|
|
44
49
|
/** local variables */
|
|
45
50
|
|
|
51
|
+
function _assertInitialized() {
|
|
52
|
+
if (!_initialized) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
'CRM.COM SDK not initialized. Call init() before using any SDK methods. ' +
|
|
55
|
+
'Example: import { init } from "@crmcom/self-service-sdk"; await init({ apiKey, host, ... });'
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
46
60
|
let _storeKVFn;
|
|
47
61
|
let _getKVFn;
|
|
48
62
|
let _sessionInvalidCallback;
|
|
@@ -65,7 +79,7 @@ let _mwNodejs_host;
|
|
|
65
79
|
let _mwNodejs_apiKey;
|
|
66
80
|
|
|
67
81
|
|
|
68
|
-
async function
|
|
82
|
+
async function init({
|
|
69
83
|
storeKVFn, //function to store key value
|
|
70
84
|
getKVFn, //function to get value by key from the storage
|
|
71
85
|
sessionInvalidCallback, //function to call when api_key or token key is invalid and refresh token if available was failed
|
|
@@ -114,7 +128,7 @@ async function setupChannel({
|
|
|
114
128
|
_sessionData = undefined;
|
|
115
129
|
}
|
|
116
130
|
}
|
|
117
|
-
|
|
131
|
+
_initialized = true;
|
|
118
132
|
}
|
|
119
133
|
|
|
120
134
|
async function setupApiKey(apikey){
|
|
@@ -282,6 +296,7 @@ async function post({
|
|
|
282
296
|
isMwNodejs = false,
|
|
283
297
|
plugin,
|
|
284
298
|
}) {
|
|
299
|
+
_assertInitialized();
|
|
285
300
|
try {
|
|
286
301
|
//let logoutStatus = await getData('LOGOUT_STATUS');
|
|
287
302
|
//if(logoutStatus == 'PROCESSING') return;
|
|
@@ -421,6 +436,7 @@ async function get({
|
|
|
421
436
|
isMwNodejs = false,
|
|
422
437
|
plugin,
|
|
423
438
|
}) {
|
|
439
|
+
_assertInitialized();
|
|
424
440
|
try {
|
|
425
441
|
// let logoutStatus = await getData('LOGOUT_STATUS');
|
|
426
442
|
//if(logoutStatus == 'PROCESSING') return;
|
|
@@ -525,6 +541,7 @@ async function sendDelete({
|
|
|
525
541
|
isMiddleware = false,
|
|
526
542
|
isMwNodejs = false,
|
|
527
543
|
}) {
|
|
544
|
+
_assertInitialized();
|
|
528
545
|
try {
|
|
529
546
|
let uri = getURI(isBackend, resourcePath, isMiddleware, isMwNodejs);
|
|
530
547
|
var options = {};
|
|
@@ -604,6 +621,7 @@ async function put({
|
|
|
604
621
|
isMwNodejs = false,
|
|
605
622
|
accessToken,
|
|
606
623
|
}) {
|
|
624
|
+
_assertInitialized();
|
|
607
625
|
try {
|
|
608
626
|
let uri = getURI(isBackend, resourcePath, isMiddleware, isMwNodejs);
|
|
609
627
|
var options = {};
|
|
@@ -736,6 +754,7 @@ async function uploadFile({
|
|
|
736
754
|
keyParam = 'file',
|
|
737
755
|
disalbedContentType = false,
|
|
738
756
|
}) {
|
|
757
|
+
_assertInitialized();
|
|
739
758
|
try {
|
|
740
759
|
let uri = getURI(isBackend, resourcePath, isMiddleware);
|
|
741
760
|
var options = {};
|
|
@@ -823,6 +842,7 @@ async function uploadFileNew({
|
|
|
823
842
|
accessToken,
|
|
824
843
|
isMiddleware = false
|
|
825
844
|
}) {
|
|
845
|
+
_assertInitialized();
|
|
826
846
|
try {
|
|
827
847
|
let uri = getURI(isBackend, resourcePath, isMiddleware);
|
|
828
848
|
|
package/index.d.ts
CHANGED
|
@@ -69,7 +69,7 @@ export declare const logger: {
|
|
|
69
69
|
// HTTP Utilities
|
|
70
70
|
// ============================================================================
|
|
71
71
|
|
|
72
|
-
interface
|
|
72
|
+
export interface InitOptions {
|
|
73
73
|
storeKVFn: (key: string, value: any) => void | Promise<void>;
|
|
74
74
|
getKVFn: (key: string) => any | Promise<any>;
|
|
75
75
|
sessionInvalidCallback: (shouldLogout: boolean) => void | Promise<void>;
|
|
@@ -129,7 +129,10 @@ interface UploadFileOptions {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
export declare const httpUtil: {
|
|
132
|
-
|
|
132
|
+
init(options: InitOptions): Promise<void>;
|
|
133
|
+
/** @deprecated Use init() instead */
|
|
134
|
+
setupChannel(options: InitOptions): Promise<void>;
|
|
135
|
+
isInitialized(): boolean;
|
|
133
136
|
setupApiKey(apiKey: string): Promise<void>;
|
|
134
137
|
post(options: HttpRequestOptions): Promise<SDKResult>;
|
|
135
138
|
get(options: HttpRequestOptions): Promise<SDKResult>;
|
|
@@ -152,7 +155,10 @@ export declare const httpUtil: {
|
|
|
152
155
|
};
|
|
153
156
|
|
|
154
157
|
export declare const httpBackOfficeUtil: {
|
|
155
|
-
|
|
158
|
+
init(options: Pick<InitOptions, 'storeKVFn' | 'getKVFn' | 'sessionInvalidCallback' | 'apiKey' | 'host' | 'fetchFn'>): Promise<void>;
|
|
159
|
+
/** @deprecated Use init() instead */
|
|
160
|
+
setupChannel(options: Pick<InitOptions, 'storeKVFn' | 'getKVFn' | 'sessionInvalidCallback' | 'apiKey' | 'host' | 'fetchFn'>): Promise<void>;
|
|
161
|
+
isInitialized(): boolean;
|
|
156
162
|
post(options: HttpRequestOptions): Promise<SDKResult>;
|
|
157
163
|
get(options: HttpRequestOptions): Promise<SDKResult>;
|
|
158
164
|
put(options: HttpRequestOptions): Promise<SDKResult>;
|
|
@@ -519,9 +525,18 @@ export declare const eventListener: {
|
|
|
519
525
|
};
|
|
520
526
|
|
|
521
527
|
// ============================================================================
|
|
522
|
-
//
|
|
528
|
+
// Top-level SDK Initialization
|
|
523
529
|
// ============================================================================
|
|
524
530
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
531
|
+
/**
|
|
532
|
+
* Initialize the Self-Service SDK. Must be called before using any other SDK module.
|
|
533
|
+
* Alias for httpUtil.init().
|
|
534
|
+
*/
|
|
535
|
+
export declare function init(options: InitOptions): Promise<void>;
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Initialize the Back-Office SDK. Must be called before using any back-office module.
|
|
539
|
+
* Alias for httpBackOfficeUtil.init().
|
|
540
|
+
*/
|
|
541
|
+
export declare function initBackOffice(options: Pick<InitOptions, 'storeKVFn' | 'getKVFn' | 'sessionInvalidCallback' | 'apiKey' | 'host' | 'fetchFn'>): Promise<void>;
|
|
542
|
+
|
package/index.js
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
export { httpUtil } from './httpUtil.js';
|
|
2
2
|
export { httpBackOfficeUtil } from './httpBackOfficeUtil.js';
|
|
3
|
+
|
|
4
|
+
// Top-level convenience aliases for SDK initialization
|
|
5
|
+
import { httpUtil as _httpUtil } from './httpUtil.js';
|
|
6
|
+
import { httpBackOfficeUtil as _httpBackOfficeUtil } from './httpBackOfficeUtil.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the Self-Service SDK. Must be called before using any other SDK module.
|
|
10
|
+
* @see httpUtil.init
|
|
11
|
+
*/
|
|
12
|
+
export const init = _httpUtil.init;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the Back-Office SDK. Must be called before using any back-office module.
|
|
16
|
+
* @see httpBackOfficeUtil.init
|
|
17
|
+
*/
|
|
18
|
+
export const initBackOffice = _httpBackOfficeUtil.init;
|
|
19
|
+
|
|
3
20
|
export { authentication } from './authentication.js';
|
|
4
21
|
export { contacts } from './contacts.js';
|
|
5
22
|
export { orders } from './orders.js';
|
package/package.json
CHANGED