@internxt/cli 1.1.1 → 1.2.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.
package/README.md CHANGED
@@ -31,7 +31,7 @@ $ npm install -g @internxt/cli
31
31
  $ internxt COMMAND
32
32
  running command...
33
33
  $ internxt (--version)
34
- @internxt/cli/1.1.1 darwin-arm64 node-v20.10.0
34
+ @internxt/cli/1.2.0 darwin-arm64 node-v20.14.0
35
35
  $ internxt --help [COMMAND]
36
36
  USAGE
37
37
  $ internxt COMMAND
@@ -42,6 +42,7 @@ USAGE
42
42
  # Commands
43
43
 
44
44
  <!-- commands -->
45
+ * [`internxt add-cert`](#internxt-add-cert)
45
46
  * [`internxt config`](#internxt-config)
46
47
  * [`internxt create-folder`](#internxt-create-folder)
47
48
  * [`internxt download`](#internxt-download)
@@ -55,6 +56,23 @@ USAGE
55
56
  * [`internxt webdav ACTION`](#internxt-webdav-action)
56
57
  * [`internxt whoami`](#internxt-whoami)
57
58
 
59
+ ## `internxt add-cert`
60
+
61
+ Add a self-signed certificate to the trusted store for macOS, Linux, and Windows.
62
+
63
+ ```
64
+ USAGE
65
+ $ internxt add-cert
66
+
67
+ DESCRIPTION
68
+ Add a self-signed certificate to the trusted store for macOS, Linux, and Windows.
69
+
70
+ EXAMPLES
71
+ $ internxt add-cert
72
+ ```
73
+
74
+ _See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/add-cert.ts)_
75
+
58
76
  ## `internxt config`
59
77
 
60
78
  Display useful information from the user logged into the Internxt CLI.
@@ -82,7 +100,7 @@ EXAMPLES
82
100
  $ internxt config
83
101
  ```
84
102
 
85
- _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/config.ts)_
103
+ _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/config.ts)_
86
104
 
87
105
  ## `internxt create-folder`
88
106
 
@@ -103,7 +121,7 @@ EXAMPLES
103
121
  $ internxt create-folder
104
122
  ```
105
123
 
106
- _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/create-folder.ts)_
124
+ _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/create-folder.ts)_
107
125
 
108
126
  ## `internxt download`
109
127
 
@@ -126,7 +144,7 @@ EXAMPLES
126
144
  $ internxt download
127
145
  ```
128
146
 
129
- _See code: [src/commands/download.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/download.ts)_
147
+ _See code: [src/commands/download.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/download.ts)_
130
148
 
131
149
  ## `internxt list`
132
150
 
@@ -160,7 +178,7 @@ EXAMPLES
160
178
  $ internxt list
161
179
  ```
162
180
 
163
- _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/list.ts)_
181
+ _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/list.ts)_
164
182
 
165
183
  ## `internxt login`
166
184
 
@@ -186,7 +204,7 @@ EXAMPLES
186
204
  $ internxt login
187
205
  ```
188
206
 
189
- _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/login.ts)_
207
+ _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/login.ts)_
190
208
 
191
209
  ## `internxt logout`
192
210
 
@@ -203,7 +221,7 @@ EXAMPLES
203
221
  $ internxt logout
204
222
  ```
205
223
 
206
- _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/logout.ts)_
224
+ _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/logout.ts)_
207
225
 
208
226
  ## `internxt logs`
209
227
 
@@ -220,7 +238,7 @@ EXAMPLES
220
238
  $ internxt logs
221
239
  ```
222
240
 
223
- _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/logs.ts)_
241
+ _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/logs.ts)_
224
242
 
225
243
  ## `internxt move`
226
244
 
@@ -245,7 +263,7 @@ EXAMPLES
245
263
  $ internxt move
246
264
  ```
247
265
 
248
- _See code: [src/commands/move.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/move.ts)_
266
+ _See code: [src/commands/move.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/move.ts)_
249
267
 
250
268
  ## `internxt trash`
251
269
 
@@ -269,7 +287,7 @@ EXAMPLES
269
287
  $ internxt trash
270
288
  ```
271
289
 
272
- _See code: [src/commands/trash.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/trash.ts)_
290
+ _See code: [src/commands/trash.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/trash.ts)_
273
291
 
274
292
  ## `internxt upload`
275
293
 
@@ -293,7 +311,7 @@ EXAMPLES
293
311
  $ internxt upload
294
312
  ```
295
313
 
296
- _See code: [src/commands/upload.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/upload.ts)_
314
+ _See code: [src/commands/upload.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/upload.ts)_
297
315
 
298
316
  ## `internxt webdav ACTION`
299
317
 
@@ -316,7 +334,7 @@ EXAMPLES
316
334
  $ internxt webdav status
317
335
  ```
318
336
 
319
- _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/webdav.ts)_
337
+ _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/webdav.ts)_
320
338
 
321
339
  ## `internxt whoami`
322
340
 
@@ -333,7 +351,7 @@ EXAMPLES
333
351
  $ internxt whoami
334
352
  ```
335
353
 
336
- _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.1.1/src/commands/whoami.ts)_
354
+ _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.2.0/src/commands/whoami.ts)_
337
355
  <!-- commandsstop -->
338
356
 
339
357
  # Current Limitations
@@ -0,0 +1,8 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class AddCert extends Command {
3
+ static readonly description = "Add a self-signed certificate to the trusted store for macOS, Linux, and Windows.";
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ catch(error: Error): Promise<void>;
7
+ private executeCommand;
8
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const core_1 = require("@oclif/core");
27
+ const child_process_1 = require("child_process");
28
+ const config_service_1 = require("../services/config.service");
29
+ const os = __importStar(require("os"));
30
+ const path = __importStar(require("path"));
31
+ const cli_utils_1 = require("../utils/cli.utils");
32
+ const errors_utils_1 = require("../utils/errors.utils");
33
+ class AddCert extends core_1.Command {
34
+ static description = 'Add a self-signed certificate to the trusted store for macOS, Linux, and Windows.';
35
+ static examples = ['<%= config.bin %> <%= command.id %>'];
36
+ async run() {
37
+ try {
38
+ const certPath = path.join(config_service_1.ConfigService.WEBDAV_SSL_CERTS_DIR, 'cert.crt');
39
+ const platform = os.platform();
40
+ const scriptBasePath = path.join(__dirname, '../../scripts');
41
+ let command = '';
42
+ if (platform === 'win32') {
43
+ command = `powershell -ExecutionPolicy Bypass -File "${path.join(scriptBasePath, 'add-cert.ps1')}" -certPath "${certPath}"`;
44
+ }
45
+ else if (platform === 'darwin' || platform === 'linux') {
46
+ command = `bash "${path.join(scriptBasePath, 'add-cert.sh')}" "${certPath}"`;
47
+ }
48
+ else {
49
+ throw new Error(`Unsupported OS: ${platform}`);
50
+ }
51
+ await this.executeCommand(command);
52
+ cli_utils_1.CLIUtils.success('Certificate successfully added to the trusted store.');
53
+ }
54
+ catch (error) {
55
+ await this.catch(error);
56
+ }
57
+ }
58
+ async catch(error) {
59
+ errors_utils_1.ErrorUtils.report(error, { command: this.id });
60
+ cli_utils_1.CLIUtils.error(error.message);
61
+ this.exit(1);
62
+ }
63
+ executeCommand(command) {
64
+ return new Promise((resolve, reject) => {
65
+ (0, child_process_1.exec)(command, (error, stdout, stderr) => {
66
+ if (error) {
67
+ this.log(stderr);
68
+ reject(error);
69
+ }
70
+ else {
71
+ this.log(stdout);
72
+ resolve();
73
+ }
74
+ });
75
+ });
76
+ }
77
+ }
78
+ exports.default = AddCert;
@@ -11,7 +11,8 @@ const cli_utils_1 = require("../../utils/cli.utils");
11
11
  const sdk_manager_service_1 = require("../../services/sdk-manager.service");
12
12
  const auth_service_1 = require("../../services/auth.service");
13
13
  const command_types_1 = require("../../types/command.types");
14
- const CommandsToSkip = [whoami_1.default, login_1.default, logout_1.default, logs_1.default];
14
+ const webdav_1 = __importDefault(require("../../commands/webdav"));
15
+ const CommandsToSkip = [whoami_1.default, login_1.default, logout_1.default, logs_1.default, webdav_1.default];
15
16
  const hook = async function (opts) {
16
17
  if (!CommandsToSkip.map((command) => command.name).includes(opts.Command.name)) {
17
18
  cli_utils_1.CLIUtils.doing('Checking credentials');
@@ -15,5 +15,5 @@ export declare class AnalyticsService {
15
15
  track(eventKey: keyof typeof AnalyticsEvents, options: {
16
16
  app: 'internxt-cli' | 'internxt-webdav';
17
17
  userId: string;
18
- }, params?: apiObject): Promise<void>;
18
+ }, params?: apiObject): void;
19
19
  }
@@ -6,8 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.AnalyticsService = exports.AnalyticsEvents = void 0;
7
7
  const rudder_sdk_node_1 = __importDefault(require("@rudderstack/rudder-sdk-node"));
8
8
  const config_service_1 = require("./config.service");
9
- const package_json_1 = __importDefault(require("../../package.json"));
10
- const os_1 = __importDefault(require("os"));
11
9
  exports.AnalyticsEvents = {
12
10
  CLILogin: 'CLI Login',
13
11
  WebDAVEnabled: 'WebDAV Enabled',
@@ -49,28 +47,7 @@ class AnalyticsService {
49
47
  }
50
48
  }
51
49
  track(eventKey, options, params = {}) {
52
- return new Promise((resolve) => {
53
- const rudderstack = this.getRudderstack();
54
- rudderstack.track({
55
- event: exports.AnalyticsEvents[eventKey],
56
- userId: options.userId,
57
- context: {
58
- app: {
59
- name: options.app,
60
- version: package_json_1.default.version,
61
- },
62
- os: {
63
- family: this.platformFamily(os_1.default.platform()),
64
- name: os_1.default.type(),
65
- short_name: this.platformShortName(process.platform),
66
- version: os_1.default.release(),
67
- },
68
- },
69
- properties: params,
70
- }, () => {
71
- resolve();
72
- });
73
- });
50
+ return;
74
51
  }
75
52
  }
76
53
  exports.AnalyticsService = AnalyticsService;
@@ -1,6 +1,10 @@
1
1
  export declare class ErrorUtils {
2
2
  static report(error: unknown, props?: Record<string, unknown>): void;
3
3
  }
4
+ export declare class ConflictError extends Error {
5
+ statusCode: number;
6
+ constructor(message: string);
7
+ }
4
8
  export declare class NotFoundError extends Error {
5
9
  statusCode: number;
6
10
  constructor(message: string);
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NotImplementedError = exports.UnsupportedMediaTypeError = exports.BadRequestError = exports.NotFoundError = exports.ErrorUtils = void 0;
3
+ exports.NotImplementedError = exports.UnsupportedMediaTypeError = exports.BadRequestError = exports.NotFoundError = exports.ConflictError = exports.ErrorUtils = void 0;
4
4
  class ErrorUtils {
5
5
  static report(error, props = {}) {
6
6
  if (error instanceof Error) {
@@ -12,6 +12,15 @@ class ErrorUtils {
12
12
  }
13
13
  }
14
14
  exports.ErrorUtils = ErrorUtils;
15
+ class ConflictError extends Error {
16
+ statusCode = 409;
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = 'ConflictError';
20
+ Object.setPrototypeOf(this, ConflictError.prototype);
21
+ }
22
+ }
23
+ exports.ConflictError = ConflictError;
15
24
  class NotFoundError extends Error {
16
25
  statusCode = 404;
17
26
  constructor(message) {
@@ -42,7 +42,18 @@ class NetworkUtils {
42
42
  }
43
43
  static generateSelfSignedSSLCerts() {
44
44
  const attrs = [{ name: 'commonName', value: config_service_1.ConfigService.WEBDAV_LOCAL_URL }];
45
- const pems = selfsigned_1.default.generate(attrs, { days: 365, algorithm: 'sha256', keySize: 2048 });
45
+ const extensions = [
46
+ {
47
+ name: 'subjectAltName',
48
+ altNames: [
49
+ {
50
+ type: 2,
51
+ value: config_service_1.ConfigService.WEBDAV_LOCAL_URL,
52
+ },
53
+ ],
54
+ },
55
+ ];
56
+ const pems = selfsigned_1.default.generate(attrs, { days: 365, algorithm: 'sha256', keySize: 2048, extensions });
46
57
  return pems;
47
58
  }
48
59
  }
@@ -17,11 +17,13 @@ class MKCOLRequestHandler {
17
17
  }
18
18
  handle = async (req, res) => {
19
19
  const { driveDatabaseManager, driveFolderService } = this.dependencies;
20
- const resourceParsedPath = path_1.default.parse(decodeURI(req.url));
21
- const parentPath = webdav_utils_1.WebDavUtils.getParentPath(req.url);
20
+ const decodedUrl = decodeURI(req.url);
21
+ const resourceParsedPath = path_1.default.parse(decodedUrl);
22
+ const parentPath = webdav_utils_1.WebDavUtils.getParentPath(decodedUrl);
22
23
  const parentResource = await driveDatabaseManager.findByRelativePath(parentPath);
23
- if (!parentResource)
24
- throw new errors_utils_1.NotFoundError(`Parent resource not found for parent path ${parentPath}`);
24
+ if (!parentResource) {
25
+ throw new errors_utils_1.ConflictError(`Parent resource not found for parent path ${parentPath}`);
26
+ }
25
27
  logger_utils_1.webdavLogger.info(`MKCOL request received for folder at ${req.url}`);
26
28
  logger_utils_1.webdavLogger.info(`Parent path: ${parentResource.id}`);
27
29
  const [createFolder] = driveFolderService.createFolder({
@@ -122,14 +122,12 @@ class PROPFINDRequestHandler {
122
122
  parentId: null,
123
123
  }, encodeURI(folderRelativePath));
124
124
  });
125
- folderContent.folders.map(async (folder) => {
126
- return await driveDatabaseManager.createFolder({
127
- ...folder,
128
- name: folder.plainName,
129
- encryptedName: folder.name,
130
- status: folder.deleted || folder.removed ? 'TRASHED' : 'EXISTS',
131
- });
132
- });
125
+ await Promise.all(folderContent.folders.map((folder) => driveDatabaseManager.createFolder({
126
+ ...folder,
127
+ name: folder.plainName,
128
+ encryptedName: folder.name,
129
+ status: folder.deleted || folder.removed ? 'TRASHED' : 'EXISTS',
130
+ })));
133
131
  const filesXML = folderContent.files.map((file) => {
134
132
  const fileRelativePath = webdav_utils_1.WebDavUtils.joinURL(relativePath, file.type ? `${file.plainName}.${file.type}` : file.plainName);
135
133
  return this.driveFileItemToXMLNode({
@@ -147,15 +145,15 @@ class PROPFINDRequestHandler {
147
145
  size: Number(file.size),
148
146
  }, encodeURI(fileRelativePath));
149
147
  });
150
- folderContent.files.map(async (file) => {
151
- return await driveDatabaseManager.createFile({
148
+ await Promise.all(folderContent.files.map((file) => {
149
+ driveDatabaseManager.createFile({
152
150
  ...file,
153
151
  name: file.plainName,
154
152
  fileId: file.fileId,
155
153
  size: Number(file.size),
156
154
  encryptedName: file.name,
157
155
  });
158
- });
156
+ }));
159
157
  return foldersXML.concat(filesXML);
160
158
  }
161
159
  async getFolderRootXMLNode(relativePath, folderUuid) {
@@ -19,7 +19,7 @@ class PUTRequestHandler {
19
19
  const driveFolder = await this.getDriveFolderRealmObject(resource);
20
20
  logger_utils_1.webdavLogger.info(`PUT request received for uploading file '${resource.name}' to '${resource.path.dir}'`);
21
21
  if (!driveFolder) {
22
- throw new errors_utils_1.NotFoundError('Drive destination folder not found');
22
+ throw new errors_utils_1.ConflictError('Drive destination folder not found');
23
23
  }
24
24
  const { user, mnemonic } = await this.dependencies.authService.getAuthDetails();
25
25
  const [uploadPromise] = await this.dependencies.networkFacade.uploadFromStream(user.bucket, mnemonic, contentLength, req, {
@@ -1,5 +1,28 @@
1
1
  {
2
2
  "commands": {
3
+ "add-cert": {
4
+ "aliases": [],
5
+ "args": {},
6
+ "description": "Add a self-signed certificate to the trusted store for macOS, Linux, and Windows.",
7
+ "examples": [
8
+ "<%= config.bin %> <%= command.id %>"
9
+ ],
10
+ "flags": {},
11
+ "hasDynamicHelp": false,
12
+ "hiddenAliases": [],
13
+ "id": "add-cert",
14
+ "pluginAlias": "@internxt/cli",
15
+ "pluginName": "@internxt/cli",
16
+ "pluginType": "core",
17
+ "strict": true,
18
+ "enableJsonFlag": false,
19
+ "isESM": false,
20
+ "relativePath": [
21
+ "dist",
22
+ "commands",
23
+ "add-cert.js"
24
+ ]
25
+ },
3
26
  "config": {
4
27
  "aliases": [],
5
28
  "args": {},
@@ -634,5 +657,5 @@
634
657
  ]
635
658
  }
636
659
  },
637
- "version": "1.1.1"
660
+ "version": "1.2.0"
638
661
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "author": "PixoDev",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "Internxt CLI to manage your encrypted storage",
5
5
  "scripts": {
6
6
  "build": "tsc",
@@ -34,6 +34,7 @@
34
34
  ".env",
35
35
  "/bin",
36
36
  "/dist",
37
+ "/scripts",
37
38
  "/oclif.manifest.json"
38
39
  ],
39
40
  "dependencies": {
@@ -0,0 +1,17 @@
1
+ param (
2
+ [string]$certPath
3
+ )
4
+
5
+ if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
6
+ {
7
+ Start-Process powershell "-ExecutionPolicy Bypass -File `"$PSCommandPath`" -certPath `"$certPath`"" -Verb RunAs
8
+ }else{
9
+ $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
10
+ $cert.Import($certPath)
11
+ $store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
12
+ $store.Open("ReadWrite")
13
+ $store.Add($cert)
14
+ $store.Close()
15
+ }
16
+
17
+ Write-Host "Certificate added to Trusted Root Certification Authorities."
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+
3
+ CERT_PATH=$1
4
+
5
+ if [[ "$OSTYPE" == "darwin"* ]]; then
6
+ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain $CERT_PATH
7
+ else
8
+ sudo cp $CERT_PATH /usr/local/share/ca-certificates/
9
+ sudo update-ca-certificates
10
+ fi
@@ -0,0 +1,5 @@
1
+ if (process.env.CI) {
2
+ process.exit(0);
3
+ } else {
4
+ process.exit(1);
5
+ }
package/.env DELETED
@@ -1,13 +0,0 @@
1
- DRIVE_URL=https://drive.internxt.com
2
- DRIVE_API_URL=https://drive.internxt.com/api
3
- DRIVE_NEW_API_URL=https://api.internxt.com/drive
4
- PAYMENTS_API_URL=https://api.internxt.com/payments
5
- PHOTOS_API_URL=https://photos.internxt.com/api
6
- APP_CRYPTO_SECRET=6KYQBP847D4ATSFA
7
- APP_CRYPTO_SECRET2=8Q8VMUE3BJZV87GT
8
- APP_MAGIC_IV=d139cb9a2cd17092e79e1861cf9d7023
9
- APP_MAGIC_SALT=38dce0391b49efba88dbc8c39ebf868f0267eb110bb0012ab27dc52a528d61b1d1ed9d76f400ff58e3240028442b1eab9bb84e111d9dadd997982dbde9dbd25e
10
- NETWORK_URL=https://api.internxt.com
11
- WEBDAV_SERVER_PORT=3005
12
- RUDDERSTACK_WRITE_KEY=2gEQj6IAjlsh0a3LGyf7VA6hZsL
13
- RUDDERSTACK_DATAPLANE_URL=https://cdp.internxt.com