@app-connect/core 1.7.25 → 1.7.26

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 (137) hide show
  1. package/.env.test +5 -5
  2. package/README.md +441 -441
  3. package/connector/developerPortal.js +31 -31
  4. package/connector/mock.js +84 -77
  5. package/connector/proxy/engine.js +164 -164
  6. package/connector/proxy/index.js +500 -500
  7. package/connector/registry.js +252 -252
  8. package/docs/README.md +50 -50
  9. package/docs/architecture.md +93 -93
  10. package/docs/connectors.md +116 -116
  11. package/docs/handlers.md +125 -125
  12. package/docs/libraries.md +101 -101
  13. package/docs/models.md +144 -144
  14. package/docs/routes.md +115 -115
  15. package/docs/tests.md +73 -73
  16. package/handlers/admin.js +523 -523
  17. package/handlers/appointment.js +193 -0
  18. package/handlers/auth.js +296 -296
  19. package/handlers/calldown.js +99 -99
  20. package/handlers/contact.js +280 -280
  21. package/handlers/disposition.js +82 -80
  22. package/handlers/log.js +984 -973
  23. package/handlers/managedAuth.js +446 -446
  24. package/handlers/plugin.js +208 -208
  25. package/handlers/user.js +142 -142
  26. package/index.js +3140 -2652
  27. package/jest.config.js +56 -56
  28. package/lib/analytics.js +54 -54
  29. package/lib/authSession.js +109 -109
  30. package/lib/cacheCleanup.js +21 -0
  31. package/lib/callLogComposer.js +898 -898
  32. package/lib/callLogLookup.js +34 -0
  33. package/lib/constants.js +8 -8
  34. package/lib/debugTracer.js +177 -177
  35. package/lib/encode.js +30 -30
  36. package/lib/errorHandler.js +218 -206
  37. package/lib/generalErrorMessage.js +41 -41
  38. package/lib/jwt.js +18 -18
  39. package/lib/logger.js +190 -190
  40. package/lib/migrateCallLogsSchema.js +116 -0
  41. package/lib/ringcentral.js +266 -266
  42. package/lib/s3ErrorLogReport.js +65 -65
  43. package/lib/sharedSMSComposer.js +471 -471
  44. package/lib/util.js +67 -67
  45. package/mcp/README.md +412 -395
  46. package/mcp/lib/validator.js +91 -91
  47. package/mcp/mcpHandler.js +425 -425
  48. package/mcp/tools/cancelAppointment.js +101 -0
  49. package/mcp/tools/checkAuthStatus.js +105 -105
  50. package/mcp/tools/confirmAppointment.js +101 -0
  51. package/mcp/tools/createAppointment.js +157 -0
  52. package/mcp/tools/createCallLog.js +327 -316
  53. package/mcp/tools/createContact.js +117 -117
  54. package/mcp/tools/createMessageLog.js +287 -287
  55. package/mcp/tools/doAuth.js +60 -60
  56. package/mcp/tools/findContactByName.js +93 -93
  57. package/mcp/tools/findContactByPhone.js +101 -101
  58. package/mcp/tools/getCallLog.js +111 -102
  59. package/mcp/tools/getGoogleFilePicker.js +99 -99
  60. package/mcp/tools/getHelp.js +43 -43
  61. package/mcp/tools/getPublicConnectors.js +94 -94
  62. package/mcp/tools/getSessionInfo.js +90 -90
  63. package/mcp/tools/index.js +51 -41
  64. package/mcp/tools/listAppointments.js +163 -0
  65. package/mcp/tools/logout.js +96 -96
  66. package/mcp/tools/rcGetCallLogs.js +65 -65
  67. package/mcp/tools/updateAppointment.js +154 -0
  68. package/mcp/tools/updateCallLog.js +130 -126
  69. package/mcp/ui/App/App.tsx +358 -358
  70. package/mcp/ui/App/components/AuthInfoForm.tsx +113 -113
  71. package/mcp/ui/App/components/AuthSuccess.tsx +22 -22
  72. package/mcp/ui/App/components/ConnectorList.tsx +82 -82
  73. package/mcp/ui/App/components/DebugPanel.tsx +43 -43
  74. package/mcp/ui/App/components/OAuthConnect.tsx +270 -270
  75. package/mcp/ui/App/lib/callTool.ts +130 -130
  76. package/mcp/ui/App/lib/debugLog.ts +41 -41
  77. package/mcp/ui/App/lib/developerPortal.ts +111 -111
  78. package/mcp/ui/App/main.css +5 -5
  79. package/mcp/ui/App/root.tsx +13 -13
  80. package/mcp/ui/index.html +13 -13
  81. package/mcp/ui/package-lock.json +6356 -6356
  82. package/mcp/ui/package.json +25 -25
  83. package/mcp/ui/tsconfig.json +26 -26
  84. package/mcp/ui/vite.config.ts +16 -16
  85. package/models/accountDataModel.js +33 -33
  86. package/models/adminConfigModel.js +35 -35
  87. package/models/cacheModel.js +30 -26
  88. package/models/callDownListModel.js +34 -34
  89. package/models/callLogModel.js +33 -27
  90. package/models/dynamo/connectorSchema.js +146 -146
  91. package/models/dynamo/lockSchema.js +24 -24
  92. package/models/dynamo/noteCacheSchema.js +29 -29
  93. package/models/llmSessionModel.js +17 -17
  94. package/models/messageLogModel.js +25 -25
  95. package/models/sequelize.js +16 -16
  96. package/models/userModel.js +45 -45
  97. package/package.json +1 -1
  98. package/releaseNotes.json +1093 -1081
  99. package/test/connector/proxy/engine.test.js +126 -126
  100. package/test/connector/proxy/index.test.js +279 -279
  101. package/test/connector/proxy/sample.json +161 -161
  102. package/test/connector/registry.test.js +415 -415
  103. package/test/handlers/admin.test.js +616 -616
  104. package/test/handlers/auth.test.js +1018 -1018
  105. package/test/handlers/contact.test.js +1014 -1014
  106. package/test/handlers/log.test.js +1298 -1160
  107. package/test/handlers/managedAuth.test.js +457 -457
  108. package/test/handlers/plugin.test.js +380 -380
  109. package/test/index.test.js +105 -105
  110. package/test/lib/cacheCleanup.test.js +42 -0
  111. package/test/lib/callLogComposer.test.js +1231 -1231
  112. package/test/lib/debugTracer.test.js +328 -328
  113. package/test/lib/jwt.test.js +176 -176
  114. package/test/lib/logger.test.js +206 -206
  115. package/test/lib/oauth.test.js +359 -359
  116. package/test/lib/ringcentral.test.js +467 -467
  117. package/test/lib/sharedSMSComposer.test.js +1084 -1084
  118. package/test/lib/util.test.js +329 -329
  119. package/test/mcp/tools/checkAuthStatus.test.js +83 -83
  120. package/test/mcp/tools/createCallLog.test.js +436 -436
  121. package/test/mcp/tools/createContact.test.js +58 -58
  122. package/test/mcp/tools/createMessageLog.test.js +595 -595
  123. package/test/mcp/tools/doAuth.test.js +113 -113
  124. package/test/mcp/tools/findContactByName.test.js +275 -275
  125. package/test/mcp/tools/findContactByPhone.test.js +296 -296
  126. package/test/mcp/tools/getCallLog.test.js +298 -298
  127. package/test/mcp/tools/getGoogleFilePicker.test.js +281 -281
  128. package/test/mcp/tools/getPublicConnectors.test.js +107 -107
  129. package/test/mcp/tools/getSessionInfo.test.js +127 -127
  130. package/test/mcp/tools/logout.test.js +233 -233
  131. package/test/mcp/tools/rcGetCallLogs.test.js +56 -56
  132. package/test/mcp/tools/updateCallLog.test.js +360 -360
  133. package/test/models/accountDataModel.test.js +98 -98
  134. package/test/models/dynamo/connectorSchema.test.js +189 -189
  135. package/test/models/models.test.js +568 -539
  136. package/test/routes/managedAuthRoutes.test.js +104 -104
  137. package/test/setup.js +178 -178
@@ -0,0 +1,34 @@
1
+ const Op = require('sequelize').Op;
2
+
3
+ function getCallLogExtensionNumber(incomingData) {
4
+ return (incomingData?.extensionNumber ?? incomingData?.logInfo?.extensionNumber)?.toString() ?? '';
5
+ }
6
+
7
+ function buildCallLogSessionWhere({ sessionId, sessionIds, extensionNumber }) {
8
+ const where = {};
9
+ if (sessionIds) {
10
+ where.sessionId = {
11
+ [Op.in]: sessionIds,
12
+ };
13
+ }
14
+ else {
15
+ where.sessionId = sessionId;
16
+ }
17
+ const extensionNumberValue = extensionNumber?.toString() ?? '';
18
+ if (extensionNumberValue) {
19
+ where.extensionNumber = extensionNumberValue;
20
+ }
21
+ return where;
22
+ }
23
+
24
+ function findMatchingCallLog(callLogs, sessionId, extensionNumber) {
25
+ const extensionNumberValue = extensionNumber?.toString() ?? '';
26
+ return callLogs.find(callLog => (
27
+ callLog.sessionId === sessionId &&
28
+ (!extensionNumberValue || (callLog.extensionNumber?.toString() ?? '') === extensionNumberValue)
29
+ ));
30
+ }
31
+
32
+ exports.getCallLogExtensionNumber = getCallLogExtensionNumber;
33
+ exports.buildCallLogSessionWhere = buildCallLogSessionWhere;
34
+ exports.findMatchingCallLog = findMatchingCallLog;
package/lib/constants.js CHANGED
@@ -1,9 +1,9 @@
1
- const LOG_DETAILS_FORMAT_TYPE = {
2
- PLAIN_TEXT: 'text/plain',
3
- HTML: 'text/html',
4
- MARKDOWN: 'text/markdown'
5
- };
6
-
7
- module.exports = {
8
- LOG_DETAILS_FORMAT_TYPE
1
+ const LOG_DETAILS_FORMAT_TYPE = {
2
+ PLAIN_TEXT: 'text/plain',
3
+ HTML: 'text/html',
4
+ MARKDOWN: 'text/markdown'
5
+ };
6
+
7
+ module.exports = {
8
+ LOG_DETAILS_FORMAT_TYPE
9
9
  };
@@ -1,177 +1,177 @@
1
- class DebugTracer {
2
- /**
3
- * Creates a new DebugTracer instance
4
- * @param {Object} headers - Request headers object
5
- */
6
- constructor(headers = {}) {
7
- this.traces = [];
8
- this.startTime = Date.now();
9
- this.requestId = this._generateRequestId();
10
- }
11
-
12
- /**
13
- * Generates a unique request ID for tracking
14
- * @returns {string} Unique request ID
15
- */
16
- _generateRequestId() {
17
- return `req_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
18
- }
19
-
20
- /**
21
- * Captures the current stack trace
22
- * @param {number} skipFrames - Number of frames to skip from the top (default: 2)
23
- * @returns {string[]} Array of stack trace lines
24
- */
25
- _captureStackTrace(skipFrames = 2) {
26
- const err = new Error();
27
- const stack = err.stack || '';
28
- const lines = stack.split('\n').slice(skipFrames);
29
- return lines.map(line => line.trim()).filter(line => line.startsWith('at '));
30
- }
31
-
32
- /**
33
- * Records a trace entry with method name, data, and stack trace
34
- * @param {string} methodName - Name of the method/function being traced
35
- * @param {Object} data - Data to record (will be sanitized to remove sensitive info)
36
- * @param {Object} options - Additional options
37
- * @param {boolean} options.includeStack - Whether to include stack trace (default: true)
38
- * @param {string} options.level - Log level: 'info', 'warn', 'error' (default: 'info')
39
- * @returns {DebugTracer} Returns this for chaining
40
- */
41
- trace(methodName, data = {}, options = {}) {
42
- const { includeStack = true, level = 'info' } = options;
43
-
44
- const traceEntry = {
45
- timestamp: new Date().toISOString(),
46
- elapsed: Date.now() - this.startTime,
47
- methodName,
48
- level,
49
- data: this._sanitizeData(data)
50
- };
51
-
52
- if (includeStack) {
53
- traceEntry.stackTrace = this._captureStackTrace(3);
54
- }
55
-
56
- this.traces.push(traceEntry);
57
- return this;
58
- }
59
-
60
- /**
61
- * Records an error trace with full stack information
62
- * @param {string} methodName - Name of the method where error occurred
63
- * @param {Error|string} error - Error object or message
64
- * @param {Object} additionalData - Additional context data
65
- * @returns {DebugTracer} Returns this for chaining
66
- */
67
- traceError(methodName, error, additionalData = {}) {
68
- const errorData = {
69
- message: error instanceof Error ? error.message : String(error),
70
- errorStack: error instanceof Error ? error.stack : null,
71
- ...additionalData
72
- };
73
-
74
- return this.trace(methodName, errorData, { level: 'error' });
75
- }
76
-
77
- /**
78
- * Sanitizes data by removing sensitive fields
79
- * @param {Object} data - Data to sanitize
80
- * @returns {Object} Sanitized data
81
- */
82
- _sanitizeData(data) {
83
- if (!data || typeof data !== 'object') {
84
- return data;
85
- }
86
-
87
- const sensitiveFields = [
88
- 'accessToken', 'refreshToken', 'apiKey', 'password',
89
- 'secret', 'token', 'authorization', 'auth', 'key',
90
- 'credential', 'credentials', 'privateKey', 'clientSecret'
91
- ];
92
-
93
- const sanitized = Array.isArray(data) ? [...data] : { ...data };
94
-
95
- const sanitizeRecursive = (obj) => {
96
- if (!obj || typeof obj !== 'object') {
97
- return obj;
98
- }
99
-
100
- for (const key of Object.keys(obj)) {
101
- const lowerKey = key.toLowerCase();
102
- if (sensitiveFields.some(field => lowerKey.includes(field.toLowerCase()))) {
103
- // eslint-disable-next-line no-param-reassign
104
- obj[key] = '[REDACTED]';
105
- } else if (typeof obj[key] === 'object' && obj[key] !== null) {
106
- // eslint-disable-next-line no-param-reassign
107
- obj[key] = sanitizeRecursive(
108
- Array.isArray(obj[key]) ? [...obj[key]] : { ...obj[key] }
109
- );
110
- }
111
- }
112
- return obj;
113
- };
114
-
115
- return sanitizeRecursive(sanitized);
116
- }
117
-
118
- /**
119
- * Builds a compact summary of all recorded actions, one entry per trace.
120
- * Each entry contains the method name, log level, and elapsed time at the
121
- * point the trace was recorded, making it easy to skim what happened without
122
- * reading the full trace list.
123
- * @returns {string[]} Array of human-readable action summary strings
124
- */
125
- _buildActionSummary() {
126
- return this.traces.map((t, i) => ({
127
- index: i + 1,
128
- timestamp: t.timestamp,
129
- level: t.level.toUpperCase(),
130
- method: t.methodName,
131
- elapsedMs: t.elapsed
132
- }));
133
- }
134
-
135
- /**
136
- * Gets the complete trace data for inclusion in response
137
- * @returns {Object} Trace data object
138
- */
139
- getTraceData() {
140
- return {
141
- sum: this._buildActionSummary(),
142
- requestId: this.requestId,
143
- totalDuration: `${Date.now() - this.startTime}ms`,
144
- traceCount: this.traces.length,
145
- traces: this.traces
146
- };
147
- }
148
-
149
- /**
150
- * Gets trace data and merges it into a response object
151
- * @param {Object} response - Original response object
152
- * @returns {Object} Response with debug trace data appended (if debug mode enabled)
153
- */
154
- wrapResponse(response) {
155
- const traceData = this.getTraceData();
156
- if (!traceData) {
157
- return response;
158
- }
159
-
160
- return {
161
- ...response,
162
- _debug: traceData
163
- };
164
- }
165
-
166
- /**
167
- * Static helper to create tracer from Express request
168
- * @param {Object} req - Express request object
169
- * @returns {DebugTracer} New tracer instance
170
- */
171
- static fromRequest(req) {
172
- return new DebugTracer(req.headers || {});
173
- }
174
- }
175
-
176
- module.exports = { DebugTracer };
177
-
1
+ class DebugTracer {
2
+ /**
3
+ * Creates a new DebugTracer instance
4
+ * @param {Object} headers - Request headers object
5
+ */
6
+ constructor(headers = {}) {
7
+ this.traces = [];
8
+ this.startTime = Date.now();
9
+ this.requestId = this._generateRequestId();
10
+ }
11
+
12
+ /**
13
+ * Generates a unique request ID for tracking
14
+ * @returns {string} Unique request ID
15
+ */
16
+ _generateRequestId() {
17
+ return `req_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
18
+ }
19
+
20
+ /**
21
+ * Captures the current stack trace
22
+ * @param {number} skipFrames - Number of frames to skip from the top (default: 2)
23
+ * @returns {string[]} Array of stack trace lines
24
+ */
25
+ _captureStackTrace(skipFrames = 2) {
26
+ const err = new Error();
27
+ const stack = err.stack || '';
28
+ const lines = stack.split('\n').slice(skipFrames);
29
+ return lines.map(line => line.trim()).filter(line => line.startsWith('at '));
30
+ }
31
+
32
+ /**
33
+ * Records a trace entry with method name, data, and stack trace
34
+ * @param {string} methodName - Name of the method/function being traced
35
+ * @param {Object} data - Data to record (will be sanitized to remove sensitive info)
36
+ * @param {Object} options - Additional options
37
+ * @param {boolean} options.includeStack - Whether to include stack trace (default: true)
38
+ * @param {string} options.level - Log level: 'info', 'warn', 'error' (default: 'info')
39
+ * @returns {DebugTracer} Returns this for chaining
40
+ */
41
+ trace(methodName, data = {}, options = {}) {
42
+ const { includeStack = true, level = 'info' } = options;
43
+
44
+ const traceEntry = {
45
+ timestamp: new Date().toISOString(),
46
+ elapsed: Date.now() - this.startTime,
47
+ methodName,
48
+ level,
49
+ data: this._sanitizeData(data)
50
+ };
51
+
52
+ if (includeStack) {
53
+ traceEntry.stackTrace = this._captureStackTrace(3);
54
+ }
55
+
56
+ this.traces.push(traceEntry);
57
+ return this;
58
+ }
59
+
60
+ /**
61
+ * Records an error trace with full stack information
62
+ * @param {string} methodName - Name of the method where error occurred
63
+ * @param {Error|string} error - Error object or message
64
+ * @param {Object} additionalData - Additional context data
65
+ * @returns {DebugTracer} Returns this for chaining
66
+ */
67
+ traceError(methodName, error, additionalData = {}) {
68
+ const errorData = {
69
+ message: error instanceof Error ? error.message : String(error),
70
+ errorStack: error instanceof Error ? error.stack : null,
71
+ ...additionalData
72
+ };
73
+
74
+ return this.trace(methodName, errorData, { level: 'error' });
75
+ }
76
+
77
+ /**
78
+ * Sanitizes data by removing sensitive fields
79
+ * @param {Object} data - Data to sanitize
80
+ * @returns {Object} Sanitized data
81
+ */
82
+ _sanitizeData(data) {
83
+ if (!data || typeof data !== 'object') {
84
+ return data;
85
+ }
86
+
87
+ const sensitiveFields = [
88
+ 'accessToken', 'refreshToken', 'apiKey', 'password',
89
+ 'secret', 'token', 'authorization', 'auth', 'key',
90
+ 'credential', 'credentials', 'privateKey', 'clientSecret'
91
+ ];
92
+
93
+ const sanitized = Array.isArray(data) ? [...data] : { ...data };
94
+
95
+ const sanitizeRecursive = (obj) => {
96
+ if (!obj || typeof obj !== 'object') {
97
+ return obj;
98
+ }
99
+
100
+ for (const key of Object.keys(obj)) {
101
+ const lowerKey = key.toLowerCase();
102
+ if (sensitiveFields.some(field => lowerKey.includes(field.toLowerCase()))) {
103
+ // eslint-disable-next-line no-param-reassign
104
+ obj[key] = '[REDACTED]';
105
+ } else if (typeof obj[key] === 'object' && obj[key] !== null) {
106
+ // eslint-disable-next-line no-param-reassign
107
+ obj[key] = sanitizeRecursive(
108
+ Array.isArray(obj[key]) ? [...obj[key]] : { ...obj[key] }
109
+ );
110
+ }
111
+ }
112
+ return obj;
113
+ };
114
+
115
+ return sanitizeRecursive(sanitized);
116
+ }
117
+
118
+ /**
119
+ * Builds a compact summary of all recorded actions, one entry per trace.
120
+ * Each entry contains the method name, log level, and elapsed time at the
121
+ * point the trace was recorded, making it easy to skim what happened without
122
+ * reading the full trace list.
123
+ * @returns {string[]} Array of human-readable action summary strings
124
+ */
125
+ _buildActionSummary() {
126
+ return this.traces.map((t, i) => ({
127
+ index: i + 1,
128
+ timestamp: t.timestamp,
129
+ level: t.level.toUpperCase(),
130
+ method: t.methodName,
131
+ elapsedMs: t.elapsed
132
+ }));
133
+ }
134
+
135
+ /**
136
+ * Gets the complete trace data for inclusion in response
137
+ * @returns {Object} Trace data object
138
+ */
139
+ getTraceData() {
140
+ return {
141
+ sum: this._buildActionSummary(),
142
+ requestId: this.requestId,
143
+ totalDuration: `${Date.now() - this.startTime}ms`,
144
+ traceCount: this.traces.length,
145
+ traces: this.traces
146
+ };
147
+ }
148
+
149
+ /**
150
+ * Gets trace data and merges it into a response object
151
+ * @param {Object} response - Original response object
152
+ * @returns {Object} Response with debug trace data appended (if debug mode enabled)
153
+ */
154
+ wrapResponse(response) {
155
+ const traceData = this.getTraceData();
156
+ if (!traceData) {
157
+ return response;
158
+ }
159
+
160
+ return {
161
+ ...response,
162
+ _debug: traceData
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Static helper to create tracer from Express request
168
+ * @param {Object} req - Express request object
169
+ * @returns {DebugTracer} New tracer instance
170
+ */
171
+ static fromRequest(req) {
172
+ return new DebugTracer(req.headers || {});
173
+ }
174
+ }
175
+
176
+ module.exports = { DebugTracer };
177
+
package/lib/encode.js CHANGED
@@ -1,30 +1,30 @@
1
- const crypto = require('crypto');
2
-
3
- function getCipherKey() {
4
- if (!process.env.APP_SERVER_SECRET_KEY) {
5
- throw new Error('APP_SERVER_SECRET_KEY is not defined');
6
- }
7
- if (process.env.APP_SERVER_SECRET_KEY.length < 32) {
8
- // pad secret key with spaces if it is less than 32 bytes
9
- return process.env.APP_SERVER_SECRET_KEY.padEnd(32, ' ');
10
- }
11
- if (process.env.APP_SERVER_SECRET_KEY.length > 32) {
12
- // truncate secret key if it is more than 32 bytes
13
- return process.env.APP_SERVER_SECRET_KEY.slice(0, 32);
14
- }
15
- return process.env.APP_SERVER_SECRET_KEY;
16
- }
17
-
18
- function encode(data) {
19
- const cipher = crypto.createCipheriv('aes-256-cbc', getCipherKey(), Buffer.alloc(16, 0));
20
- return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
21
- }
22
-
23
- function decoded(encryptedData) {
24
- const decipher = crypto.createDecipheriv('aes-256-cbc', getCipherKey(), Buffer.alloc(16, 0));
25
- return decipher.update(encryptedData, 'hex', 'utf8') + decipher.final('utf8');
26
- }
27
-
28
-
29
- exports.encode = encode;
30
- exports.decoded = decoded;
1
+ const crypto = require('crypto');
2
+
3
+ function getCipherKey() {
4
+ if (!process.env.APP_SERVER_SECRET_KEY) {
5
+ throw new Error('APP_SERVER_SECRET_KEY is not defined');
6
+ }
7
+ if (process.env.APP_SERVER_SECRET_KEY.length < 32) {
8
+ // pad secret key with spaces if it is less than 32 bytes
9
+ return process.env.APP_SERVER_SECRET_KEY.padEnd(32, ' ');
10
+ }
11
+ if (process.env.APP_SERVER_SECRET_KEY.length > 32) {
12
+ // truncate secret key if it is more than 32 bytes
13
+ return process.env.APP_SERVER_SECRET_KEY.slice(0, 32);
14
+ }
15
+ return process.env.APP_SERVER_SECRET_KEY;
16
+ }
17
+
18
+ function encode(data) {
19
+ const cipher = crypto.createCipheriv('aes-256-cbc', getCipherKey(), Buffer.alloc(16, 0));
20
+ return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
21
+ }
22
+
23
+ function decoded(encryptedData) {
24
+ const decipher = crypto.createDecipheriv('aes-256-cbc', getCipherKey(), Buffer.alloc(16, 0));
25
+ return decipher.update(encryptedData, 'hex', 'utf8') + decipher.final('utf8');
26
+ }
27
+
28
+
29
+ exports.encode = encode;
30
+ exports.decoded = decoded;