@remnawave/backend-contract 2.9.22 → 2.9.24

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 (27) hide show
  1. package/build/backend/commands/remnawave-settings/get-remnawave-settings.command.d.ts +1 -0
  2. package/build/backend/commands/remnawave-settings/get-remnawave-settings.command.d.ts.map +1 -1
  3. package/build/backend/commands/remnawave-settings/update-remnawave-settings.command.d.ts +2 -0
  4. package/build/backend/commands/remnawave-settings/update-remnawave-settings.command.d.ts.map +1 -1
  5. package/build/backend/constants/cache-keys/cache-keys.constants.d.ts +5 -0
  6. package/build/backend/constants/cache-keys/cache-keys.constants.d.ts.map +1 -1
  7. package/build/backend/constants/cache-keys/cache-keys.constants.js +6 -1
  8. package/build/backend/models/export-stream/export-stream.schema.d.ts +30 -0
  9. package/build/backend/models/export-stream/export-stream.schema.d.ts.map +1 -0
  10. package/build/backend/models/export-stream/export-stream.schema.js +64 -0
  11. package/build/backend/models/export-stream/index.d.ts +2 -0
  12. package/build/backend/models/export-stream/index.d.ts.map +1 -0
  13. package/build/backend/models/export-stream/index.js +17 -0
  14. package/build/backend/models/index.d.ts +1 -0
  15. package/build/backend/models/index.d.ts.map +1 -1
  16. package/build/backend/models/index.js +1 -0
  17. package/build/backend/models/remnawave-settings/oauth2-settings.schema.d.ts +1 -0
  18. package/build/backend/models/remnawave-settings/oauth2-settings.schema.d.ts.map +1 -1
  19. package/build/backend/models/remnawave-settings/oauth2-settings.schema.js +9 -0
  20. package/build/backend/models/remnawave-settings/remnawave-settings.schema.d.ts +1 -0
  21. package/build/backend/models/remnawave-settings/remnawave-settings.schema.d.ts.map +1 -1
  22. package/build/frontend/constants/cache-keys/cache-keys.constants.js +6 -1
  23. package/build/frontend/models/export-stream/export-stream.schema.js +64 -0
  24. package/build/frontend/models/export-stream/index.js +17 -0
  25. package/build/frontend/models/index.js +1 -0
  26. package/build/frontend/models/remnawave-settings/oauth2-settings.schema.js +9 -0
  27. package/package.json +1 -1
@@ -21,6 +21,7 @@ export declare namespace GetRemnawaveSettingsCommand {
21
21
  enabled: z.ZodBoolean;
22
22
  clientId: z.ZodNullable<z.ZodString>;
23
23
  clientSecret: z.ZodNullable<z.ZodString>;
24
+ frontendDomain: z.ZodNullable<z.ZodString>;
24
25
  plainDomain: z.ZodNullable<z.ZodString>;
25
26
  allowedEmails: z.ZodArray<z.ZodString>;
26
27
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"get-remnawave-settings.command.d.ts","sourceRoot":"","sources":["../../../../commands/remnawave-settings/get-remnawave-settings.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,yBAAiB,2BAA2B,CAAC;IAClC,MAAM,GAAG,4BAAmC,CAAC;IAC7C,MAAM,OAAO,4BAAM,CAAC;IAEpB,MAAM,eAAe,2CAK3B,CAAC;IAEK,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAEzB,CAAC;IAEH,KAAY,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;CACzD"}
1
+ {"version":3,"file":"get-remnawave-settings.command.d.ts","sourceRoot":"","sources":["../../../../commands/remnawave-settings/get-remnawave-settings.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,yBAAiB,2BAA2B,CAAC;IAClC,MAAM,GAAG,4BAAmC,CAAC;IAC7C,MAAM,OAAO,4BAAM,CAAC;IAEpB,MAAM,eAAe,2CAK3B,CAAC;IAEK,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAEzB,CAAC;IAEH,KAAY,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;CACzD"}
@@ -20,6 +20,7 @@ export declare namespace UpdateRemnawaveSettingsCommand {
20
20
  enabled: z.ZodBoolean;
21
21
  clientId: z.ZodNullable<z.ZodString>;
22
22
  clientSecret: z.ZodNullable<z.ZodString>;
23
+ frontendDomain: z.ZodNullable<z.ZodString>;
23
24
  plainDomain: z.ZodNullable<z.ZodString>;
24
25
  allowedEmails: z.ZodArray<z.ZodString>;
25
26
  }, z.core.$strip>;
@@ -82,6 +83,7 @@ export declare namespace UpdateRemnawaveSettingsCommand {
82
83
  enabled: z.ZodBoolean;
83
84
  clientId: z.ZodNullable<z.ZodString>;
84
85
  clientSecret: z.ZodNullable<z.ZodString>;
86
+ frontendDomain: z.ZodNullable<z.ZodString>;
85
87
  plainDomain: z.ZodNullable<z.ZodString>;
86
88
  allowedEmails: z.ZodArray<z.ZodString>;
87
89
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"update-remnawave-settings.command.d.ts","sourceRoot":"","sources":["../../../../commands/remnawave-settings/update-remnawave-settings.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,yBAAiB,8BAA8B,CAAC;IACrC,MAAM,GAAG,4BAAsC,CAAC;IAChD,MAAM,OAAO,4BAAM,CAAC;IAEpB,MAAM,eAAe,2CAK3B,CAAC;IAEK,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAK5B,CAAC;IAEI,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAEzB,CAAC;IAEH,KAAY,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC5D,KAAY,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;CACzD"}
1
+ {"version":3,"file":"update-remnawave-settings.command.d.ts","sourceRoot":"","sources":["../../../../commands/remnawave-settings/update-remnawave-settings.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,yBAAiB,8BAA8B,CAAC;IACrC,MAAM,GAAG,4BAAsC,CAAC;IAChD,MAAM,OAAO,4BAAM,CAAC;IAEpB,MAAM,eAAe,2CAK3B,CAAC;IAEK,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAK5B,CAAC;IAEI,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAEzB,CAAC;IAEH,KAAY,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC5D,KAAY,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;CACzD"}
@@ -36,4 +36,9 @@ export declare const INTERNAL_CACHE_KEYS: {
36
36
  export declare const INTERNAL_CACHE_KEYS_TTL: {
37
37
  readonly NODE_USER_USAGE: 10800;
38
38
  };
39
+ export declare const EXPORT_TO_STREAM_KEYS: {
40
+ readonly PREFIX: "ioraw:";
41
+ readonly USER_USAGE: "export:user_usage";
42
+ readonly SUBSCRIPTION_REQUESTS: "export:subscription_requests";
43
+ };
39
44
  //# sourceMappingURL=cache-keys.constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache-keys.constants.d.ts","sourceRoot":"","sources":["../../../../constants/cache-keys/cache-keys.constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,eAAO,MAAM,UAAU;;6CAEa,MAAM;2CACR,MAAM,QAAQ,yBAAyB;kDAEhC,MAAM;oDACJ,MAAM;;sCAEpB,MAAM;uCACL,MAAM;uCACN,MAAM;mCACV,MAAM;sCACH,MAAM;iCACX,MAAM;wCACC,MAAM;kDACI,MAAM,QAAQ,yBAAyB;CAEtE,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;;;;CAUjB,CAAC;AAEX,eAAO,MAAM,mBAAmB;;uCAEF,MAAM;;;;CAK1B,CAAC;AAEX,eAAO,MAAM,uBAAuB;;CAE1B,CAAC"}
1
+ {"version":3,"file":"cache-keys.constants.d.ts","sourceRoot":"","sources":["../../../../constants/cache-keys/cache-keys.constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,eAAO,MAAM,UAAU;;6CAEa,MAAM;2CACR,MAAM,QAAQ,yBAAyB;kDAEhC,MAAM;oDACJ,MAAM;;sCAEpB,MAAM;uCACL,MAAM;uCACN,MAAM;mCACV,MAAM;sCACH,MAAM;iCACX,MAAM;wCACC,MAAM;kDACI,MAAM,QAAQ,yBAAyB;CAEtE,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;;;;CAUjB,CAAC;AAEX,eAAO,MAAM,mBAAmB;;uCAEF,MAAM;;;;CAK1B,CAAC;AAEX,eAAO,MAAM,uBAAuB;;CAE1B,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;;CAIxB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.INTERNAL_CACHE_KEYS_TTL = exports.INTERNAL_CACHE_KEYS = exports.CACHE_KEYS_TTL = exports.CACHE_KEYS = void 0;
3
+ exports.EXPORT_TO_STREAM_KEYS = exports.INTERNAL_CACHE_KEYS_TTL = exports.INTERNAL_CACHE_KEYS = exports.CACHE_KEYS_TTL = exports.CACHE_KEYS = void 0;
4
4
  exports.CACHE_KEYS = {
5
5
  SUBSCRIPTION_SETTINGS: 'subscription_settings',
6
6
  EXTERNAL_SQUAD_SETTINGS: (uuid) => `external_squad_settings:${uuid}`,
@@ -38,3 +38,8 @@ exports.INTERNAL_CACHE_KEYS = {
38
38
  exports.INTERNAL_CACHE_KEYS_TTL = {
39
39
  NODE_USER_USAGE: 10800, // 3 hours in seconds
40
40
  };
41
+ exports.EXPORT_TO_STREAM_KEYS = {
42
+ PREFIX: 'ioraw:',
43
+ USER_USAGE: 'export:user_usage',
44
+ SUBSCRIPTION_REQUESTS: 'export:subscription_requests',
45
+ };
@@ -0,0 +1,30 @@
1
+ import z from 'zod';
2
+ export declare const USER_USAGE_STREAM_MESSAGE_VERSION = "1";
3
+ export declare const UserUsageStreamRecordSchema: z.ZodObject<{
4
+ userId: z.ZodString;
5
+ totalBytes: z.ZodString;
6
+ }, z.core.$strip>;
7
+ export declare const RemnawaveUserUsageStreamMessageSchema: z.ZodObject<{
8
+ v: z.ZodLiteral<"1">;
9
+ nodeId: z.ZodString;
10
+ ts: z.ZodPipe<z.ZodISODateTime, z.ZodTransform<Date, string>>;
11
+ records: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<{
12
+ userId: string;
13
+ totalBytes: string;
14
+ }[], string>>, z.ZodArray<z.ZodObject<{
15
+ userId: z.ZodString;
16
+ totalBytes: z.ZodString;
17
+ }, z.core.$strip>>>;
18
+ }, z.core.$strip>;
19
+ export type TUserUsageStreamRecord = z.infer<typeof UserUsageStreamRecordSchema>;
20
+ export type TRemnawaveUserUsageStreamMessage = z.infer<typeof RemnawaveUserUsageStreamMessageSchema>;
21
+ export declare const SUBSCRIPTION_REQUEST_STREAM_MESSAGE_VERSION = "1";
22
+ export declare const RemnawaveSubscriptionRequestStreamMessageSchema: z.ZodObject<{
23
+ v: z.ZodLiteral<"1">;
24
+ userId: z.ZodString;
25
+ requestAt: z.ZodPipe<z.ZodISODateTime, z.ZodTransform<Date, string>>;
26
+ requestIp: z.ZodOptional<z.ZodString>;
27
+ userAgent: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>;
29
+ export type TRemnawaveSubscriptionRequestStreamMessage = z.infer<typeof RemnawaveSubscriptionRequestStreamMessageSchema>;
30
+ //# sourceMappingURL=export-stream.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-stream.schema.d.ts","sourceRoot":"","sources":["../../../../models/export-stream/export-stream.schema.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAQpB,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD,eAAO,MAAM,2BAA2B;;;iBAMtC,CAAC;AAEH,eAAO,MAAM,qCAAqC;;;;;;;;;;;iBAyB5C,CAAC;AAEP,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACjF,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAClD,OAAO,qCAAqC,CAC/C,CAAC;AAEF,eAAO,MAAM,2CAA2C,MAAM,CAAC;AAE/D,eAAO,MAAM,+CAA+C;;;;;;iBAkBtD,CAAC;AAEP,MAAM,MAAM,0CAA0C,GAAG,CAAC,CAAC,KAAK,CAC5D,OAAO,+CAA+C,CACzD,CAAC"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RemnawaveSubscriptionRequestStreamMessageSchema = exports.SUBSCRIPTION_REQUEST_STREAM_MESSAGE_VERSION = exports.RemnawaveUserUsageStreamMessageSchema = exports.UserUsageStreamRecordSchema = exports.USER_USAGE_STREAM_MESSAGE_VERSION = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ // Stream keys duplicated from EXPORT_TO_STREAM_KEYS (constants) as plain strings:
9
+ // this file must stay importable without barrel/directory resolution so that
10
+ // standalone consumers (and Node type-stripping) can load it directly.
11
+ const USER_USAGE_STREAM_KEY = 'ioraw:export:user_usage';
12
+ const SUBSCRIPTION_REQUESTS_STREAM_KEY = 'ioraw:export:subscription_requests';
13
+ exports.USER_USAGE_STREAM_MESSAGE_VERSION = '1';
14
+ exports.UserUsageStreamRecordSchema = zod_1.default.object({
15
+ userId: zod_1.default.string().regex(/^\d+$/).describe('User ID (bigint as string).'),
16
+ totalBytes: zod_1.default
17
+ .string()
18
+ .regex(/^\d+$/)
19
+ .describe('Traffic consumed by the user in this batch, bytes (bigint as string).'),
20
+ });
21
+ exports.RemnawaveUserUsageStreamMessageSchema = zod_1.default
22
+ .object({
23
+ v: zod_1.default.literal(exports.USER_USAGE_STREAM_MESSAGE_VERSION).describe('Message schema version.'),
24
+ nodeId: zod_1.default
25
+ .string()
26
+ .regex(/^\d+$/)
27
+ .describe('Node ID the batch belongs to (bigint as string).'),
28
+ ts: zod_1.default.iso
29
+ .datetime()
30
+ .transform((str) => new Date(str))
31
+ .describe('Time the batch was exported (ISO 8601, UTC).'),
32
+ records: zod_1.default
33
+ .string()
34
+ .regex(/^\d+:\d+(;\d+:\d+)*$/)
35
+ .transform((raw) => raw.split(';').map((pair) => {
36
+ const [userId, totalBytes] = pair.split(':');
37
+ return { userId, totalBytes };
38
+ }))
39
+ .pipe(zod_1.default.array(exports.UserUsageStreamRecordSchema))
40
+ .describe('User traffic deltas: "userId:totalBytes" pairs separated by ";".'),
41
+ })
42
+ .meta({
43
+ description: `A single message of the "${USER_USAGE_STREAM_KEY}" Redis Stream (EXPORT_TO_STREAM_ENABLED).`,
44
+ });
45
+ exports.SUBSCRIPTION_REQUEST_STREAM_MESSAGE_VERSION = '1';
46
+ exports.RemnawaveSubscriptionRequestStreamMessageSchema = zod_1.default
47
+ .object({
48
+ v: zod_1.default
49
+ .literal(exports.SUBSCRIPTION_REQUEST_STREAM_MESSAGE_VERSION)
50
+ .describe('Message schema version.'),
51
+ userId: zod_1.default
52
+ .string()
53
+ .regex(/^\d+$/)
54
+ .describe('ID of the user who requested the subscription (bigint as string).'),
55
+ requestAt: zod_1.default.iso
56
+ .datetime()
57
+ .transform((str) => new Date(str))
58
+ .describe('Time of the subscription request (ISO 8601, UTC).'),
59
+ requestIp: zod_1.default.string().optional().describe('Client IP address, omitted if unknown.'),
60
+ userAgent: zod_1.default.string().optional().describe('Client User-Agent, omitted if unknown.'),
61
+ })
62
+ .meta({
63
+ description: `A single message of the "${SUBSCRIPTION_REQUESTS_STREAM_KEY}" Redis Stream (EXPORT_TO_STREAM_ENABLED).`,
64
+ });
@@ -0,0 +1,2 @@
1
+ export * from './export-stream.schema';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../models/export-stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,17 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./export-stream.schema"), exports);
@@ -4,6 +4,7 @@ export * from './base-internal-squad.schema';
4
4
  export * from './base-stat.schema';
5
5
  export * from './config-profile-inbounds.schema';
6
6
  export * from './config-profile.schema';
7
+ export * from './export-stream';
7
8
  export * from './extended-users.schema';
8
9
  export * from './external-squad.schema';
9
10
  export * from './external-squads';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../models/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../models/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
@@ -20,6 +20,7 @@ __exportStar(require("./base-internal-squad.schema"), exports);
20
20
  __exportStar(require("./base-stat.schema"), exports);
21
21
  __exportStar(require("./config-profile-inbounds.schema"), exports);
22
22
  __exportStar(require("./config-profile.schema"), exports);
23
+ __exportStar(require("./export-stream"), exports);
23
24
  __exportStar(require("./extended-users.schema"), exports);
24
25
  __exportStar(require("./external-squad.schema"), exports);
25
26
  __exportStar(require("./external-squads"), exports);
@@ -10,6 +10,7 @@ export declare const Oauth2SettingsSchema: z.ZodObject<{
10
10
  enabled: z.ZodBoolean;
11
11
  clientId: z.ZodNullable<z.ZodString>;
12
12
  clientSecret: z.ZodNullable<z.ZodString>;
13
+ frontendDomain: z.ZodNullable<z.ZodString>;
13
14
  plainDomain: z.ZodNullable<z.ZodString>;
14
15
  allowedEmails: z.ZodArray<z.ZodString>;
15
16
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"oauth2-settings.schema.d.ts","sourceRoot":"","sources":["../../../../models/remnawave-settings/oauth2-settings.schema.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+J/B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"oauth2-settings.schema.d.ts","sourceRoot":"","sources":["../../../../models/remnawave-settings/oauth2-settings.schema.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+K/B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -16,6 +16,15 @@ exports.Oauth2SettingsSchema = zod_1.default.object({
16
16
  enabled: zod_1.default.boolean(),
17
17
  clientId: zod_1.default.nullable(zod_1.default.string()),
18
18
  clientSecret: zod_1.default.nullable(zod_1.default.string()),
19
+ frontendDomain: zod_1.default.nullable(zod_1.default.string().refine((val) => {
20
+ const fqdnRegex = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/;
21
+ if (fqdnRegex.test(val)) {
22
+ return true;
23
+ }
24
+ return false;
25
+ }, {
26
+ message: 'Must be a valid fully qualified domain name (FQDN), e.g. "docs.rw"',
27
+ })),
19
28
  plainDomain: zod_1.default.nullable(zod_1.default.string().refine((val) => {
20
29
  const fqdnRegex = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/;
21
30
  if (fqdnRegex.test(val)) {
@@ -16,6 +16,7 @@ export declare const RemnawaveSettingsSchema: z.ZodObject<{
16
16
  enabled: z.ZodBoolean;
17
17
  clientId: z.ZodNullable<z.ZodString>;
18
18
  clientSecret: z.ZodNullable<z.ZodString>;
19
+ frontendDomain: z.ZodNullable<z.ZodString>;
19
20
  plainDomain: z.ZodNullable<z.ZodString>;
20
21
  allowedEmails: z.ZodArray<z.ZodString>;
21
22
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"remnawave-settings.schema.d.ts","sourceRoot":"","sources":["../../../../models/remnawave-settings/remnawave-settings.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAKlC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
1
+ {"version":3,"file":"remnawave-settings.schema.d.ts","sourceRoot":"","sources":["../../../../models/remnawave-settings/remnawave-settings.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAKlC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.INTERNAL_CACHE_KEYS_TTL = exports.INTERNAL_CACHE_KEYS = exports.CACHE_KEYS_TTL = exports.CACHE_KEYS = void 0;
3
+ exports.EXPORT_TO_STREAM_KEYS = exports.INTERNAL_CACHE_KEYS_TTL = exports.INTERNAL_CACHE_KEYS = exports.CACHE_KEYS_TTL = exports.CACHE_KEYS = void 0;
4
4
  exports.CACHE_KEYS = {
5
5
  SUBSCRIPTION_SETTINGS: 'subscription_settings',
6
6
  EXTERNAL_SQUAD_SETTINGS: (uuid) => `external_squad_settings:${uuid}`,
@@ -38,3 +38,8 @@ exports.INTERNAL_CACHE_KEYS = {
38
38
  exports.INTERNAL_CACHE_KEYS_TTL = {
39
39
  NODE_USER_USAGE: 10800, // 3 hours in seconds
40
40
  };
41
+ exports.EXPORT_TO_STREAM_KEYS = {
42
+ PREFIX: 'ioraw:',
43
+ USER_USAGE: 'export:user_usage',
44
+ SUBSCRIPTION_REQUESTS: 'export:subscription_requests',
45
+ };
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RemnawaveSubscriptionRequestStreamMessageSchema = exports.SUBSCRIPTION_REQUEST_STREAM_MESSAGE_VERSION = exports.RemnawaveUserUsageStreamMessageSchema = exports.UserUsageStreamRecordSchema = exports.USER_USAGE_STREAM_MESSAGE_VERSION = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ // Stream keys duplicated from EXPORT_TO_STREAM_KEYS (constants) as plain strings:
9
+ // this file must stay importable without barrel/directory resolution so that
10
+ // standalone consumers (and Node type-stripping) can load it directly.
11
+ const USER_USAGE_STREAM_KEY = 'ioraw:export:user_usage';
12
+ const SUBSCRIPTION_REQUESTS_STREAM_KEY = 'ioraw:export:subscription_requests';
13
+ exports.USER_USAGE_STREAM_MESSAGE_VERSION = '1';
14
+ exports.UserUsageStreamRecordSchema = zod_1.default.object({
15
+ userId: zod_1.default.string().regex(/^\d+$/).describe('User ID (bigint as string).'),
16
+ totalBytes: zod_1.default
17
+ .string()
18
+ .regex(/^\d+$/)
19
+ .describe('Traffic consumed by the user in this batch, bytes (bigint as string).'),
20
+ });
21
+ exports.RemnawaveUserUsageStreamMessageSchema = zod_1.default
22
+ .object({
23
+ v: zod_1.default.literal(exports.USER_USAGE_STREAM_MESSAGE_VERSION).describe('Message schema version.'),
24
+ nodeId: zod_1.default
25
+ .string()
26
+ .regex(/^\d+$/)
27
+ .describe('Node ID the batch belongs to (bigint as string).'),
28
+ ts: zod_1.default.iso
29
+ .datetime()
30
+ .transform((str) => new Date(str))
31
+ .describe('Time the batch was exported (ISO 8601, UTC).'),
32
+ records: zod_1.default
33
+ .string()
34
+ .regex(/^\d+:\d+(;\d+:\d+)*$/)
35
+ .transform((raw) => raw.split(';').map((pair) => {
36
+ const [userId, totalBytes] = pair.split(':');
37
+ return { userId, totalBytes };
38
+ }))
39
+ .pipe(zod_1.default.array(exports.UserUsageStreamRecordSchema))
40
+ .describe('User traffic deltas: "userId:totalBytes" pairs separated by ";".'),
41
+ })
42
+ .meta({
43
+ description: `A single message of the "${USER_USAGE_STREAM_KEY}" Redis Stream (EXPORT_TO_STREAM_ENABLED).`,
44
+ });
45
+ exports.SUBSCRIPTION_REQUEST_STREAM_MESSAGE_VERSION = '1';
46
+ exports.RemnawaveSubscriptionRequestStreamMessageSchema = zod_1.default
47
+ .object({
48
+ v: zod_1.default
49
+ .literal(exports.SUBSCRIPTION_REQUEST_STREAM_MESSAGE_VERSION)
50
+ .describe('Message schema version.'),
51
+ userId: zod_1.default
52
+ .string()
53
+ .regex(/^\d+$/)
54
+ .describe('ID of the user who requested the subscription (bigint as string).'),
55
+ requestAt: zod_1.default.iso
56
+ .datetime()
57
+ .transform((str) => new Date(str))
58
+ .describe('Time of the subscription request (ISO 8601, UTC).'),
59
+ requestIp: zod_1.default.string().optional().describe('Client IP address, omitted if unknown.'),
60
+ userAgent: zod_1.default.string().optional().describe('Client User-Agent, omitted if unknown.'),
61
+ })
62
+ .meta({
63
+ description: `A single message of the "${SUBSCRIPTION_REQUESTS_STREAM_KEY}" Redis Stream (EXPORT_TO_STREAM_ENABLED).`,
64
+ });
@@ -0,0 +1,17 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./export-stream.schema"), exports);
@@ -20,6 +20,7 @@ __exportStar(require("./base-internal-squad.schema"), exports);
20
20
  __exportStar(require("./base-stat.schema"), exports);
21
21
  __exportStar(require("./config-profile-inbounds.schema"), exports);
22
22
  __exportStar(require("./config-profile.schema"), exports);
23
+ __exportStar(require("./export-stream"), exports);
23
24
  __exportStar(require("./extended-users.schema"), exports);
24
25
  __exportStar(require("./external-squad.schema"), exports);
25
26
  __exportStar(require("./external-squads"), exports);
@@ -16,6 +16,15 @@ exports.Oauth2SettingsSchema = zod_1.default.object({
16
16
  enabled: zod_1.default.boolean(),
17
17
  clientId: zod_1.default.nullable(zod_1.default.string()),
18
18
  clientSecret: zod_1.default.nullable(zod_1.default.string()),
19
+ frontendDomain: zod_1.default.nullable(zod_1.default.string().refine((val) => {
20
+ const fqdnRegex = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/;
21
+ if (fqdnRegex.test(val)) {
22
+ return true;
23
+ }
24
+ return false;
25
+ }, {
26
+ message: 'Must be a valid fully qualified domain name (FQDN), e.g. "docs.rw"',
27
+ })),
19
28
  plainDomain: zod_1.default.nullable(zod_1.default.string().refine((val) => {
20
29
  const fqdnRegex = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/;
21
30
  if (fqdnRegex.test(val)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnawave/backend-contract",
3
- "version": "2.9.22",
3
+ "version": "2.9.24",
4
4
  "description": "A contract library for Remnawave Backend. It can be used in backend and frontend.",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/remnawave",