@ludeo/cloud-common 1.2.273 → 1.2.274

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.
@@ -1,7 +1,18 @@
1
1
  import { CloudSessionContext } from "../contexts/cloud-session-context";
2
2
  import { LudeoEvent } from "../../infra/ludeo-event";
3
+ export declare enum AllocateCloudSessionFailureCode {
4
+ NOT_AVAILABLE_ERROR = "NOT_AVAILABLE_ERROR",
5
+ QUEUE_TIMEOUT_ERROR = "QUEUE_TIMEOUT_ERROR",
6
+ NO_AVAILABLE_POOLS_REGION_ERROR = "NO_AVAILABLE_POOLS_REGION_ERROR",
7
+ NO_AVAILABLE_POOLS_HARDWARE_ERROR = "NO_AVAILABLE_POOLS_HARDWARE_ERROR",
8
+ INVALID_REQUEST_ERROR = "INVALID_REQUEST_ERROR",
9
+ INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR"
10
+ }
3
11
  export declare class AllocateCloudSessionFailedPayload {
4
- error: string;
12
+ code?: AllocateCloudSessionFailureCode;
13
+ description: string;
14
+ stack?: string;
15
+ isRetryable?: boolean;
5
16
  }
6
17
  export declare class AllocateCloudSessionFailed extends LudeoEvent {
7
18
  static readonly EVENT_NAME = "cloud-session-allocator.allocate-cloud-session-failed";
@@ -9,18 +9,42 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AllocateCloudSessionFailed = exports.AllocateCloudSessionFailedPayload = void 0;
12
+ exports.AllocateCloudSessionFailed = exports.AllocateCloudSessionFailedPayload = exports.AllocateCloudSessionFailureCode = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
14
  const cloud_session_context_1 = require("../contexts/cloud-session-context");
15
15
  const validate_nested_type_decorator_1 = require("../../decorators/validate-nested-type.decorator");
16
16
  const ludeo_event_1 = require("../../infra/ludeo-event");
17
+ var AllocateCloudSessionFailureCode;
18
+ (function (AllocateCloudSessionFailureCode) {
19
+ AllocateCloudSessionFailureCode["NOT_AVAILABLE_ERROR"] = "NOT_AVAILABLE_ERROR";
20
+ AllocateCloudSessionFailureCode["QUEUE_TIMEOUT_ERROR"] = "QUEUE_TIMEOUT_ERROR";
21
+ AllocateCloudSessionFailureCode["NO_AVAILABLE_POOLS_REGION_ERROR"] = "NO_AVAILABLE_POOLS_REGION_ERROR";
22
+ AllocateCloudSessionFailureCode["NO_AVAILABLE_POOLS_HARDWARE_ERROR"] = "NO_AVAILABLE_POOLS_HARDWARE_ERROR";
23
+ AllocateCloudSessionFailureCode["INVALID_REQUEST_ERROR"] = "INVALID_REQUEST_ERROR";
24
+ AllocateCloudSessionFailureCode["INTERNAL_SERVER_ERROR"] = "INTERNAL_SERVER_ERROR";
25
+ })(AllocateCloudSessionFailureCode || (exports.AllocateCloudSessionFailureCode = AllocateCloudSessionFailureCode = {}));
17
26
  class AllocateCloudSessionFailedPayload {
18
27
  }
19
28
  exports.AllocateCloudSessionFailedPayload = AllocateCloudSessionFailedPayload;
20
29
  __decorate([
30
+ (0, class_validator_1.IsOptional)(),
31
+ (0, class_validator_1.IsEnum)(AllocateCloudSessionFailureCode),
32
+ __metadata("design:type", String)
33
+ ], AllocateCloudSessionFailedPayload.prototype, "code", void 0);
34
+ __decorate([
35
+ (0, class_validator_1.IsString)(),
36
+ __metadata("design:type", String)
37
+ ], AllocateCloudSessionFailedPayload.prototype, "description", void 0);
38
+ __decorate([
39
+ (0, class_validator_1.IsOptional)(),
21
40
  (0, class_validator_1.IsString)(),
22
41
  __metadata("design:type", String)
23
- ], AllocateCloudSessionFailedPayload.prototype, "error", void 0);
42
+ ], AllocateCloudSessionFailedPayload.prototype, "stack", void 0);
43
+ __decorate([
44
+ (0, class_validator_1.IsOptional)(),
45
+ (0, class_validator_1.IsBoolean)(),
46
+ __metadata("design:type", Boolean)
47
+ ], AllocateCloudSessionFailedPayload.prototype, "isRetryable", void 0);
24
48
  class AllocateCloudSessionFailed extends ludeo_event_1.LudeoEvent {
25
49
  constructor(payload, context) {
26
50
  super(AllocateCloudSessionFailed.EVENT_NAME);
@@ -1 +1 @@
1
- {"version":3,"file":"allocate-cloud-session-failed.js","sourceRoot":"","sources":["../../../src/v4/events/allocate-cloud-session-failed.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAA2C;AAC3C,6EAAwE;AACxE,oGAAqF;AACrF,yDAAqD;AAErD,MAAa,iCAAiC;CAG7C;AAHD,8EAGC;AADC;IADC,IAAA,0BAAQ,GAAE;;gEACG;AAEhB,MAAa,0BAA2B,SAAQ,wBAAU;IAIxD,YACE,OAA0C,EAC1C,OAA4B;QAE5B,KAAK,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;;AAXH,gEAkBC;AAjBiB,qCAAU,GACxB,uDAAuD,CAAC;AAY1D;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,iCAAiC,CAAC;8BACnD,iCAAiC;2DAAC;AAG3C;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,2CAAmB,CAAC;8BACrC,2CAAmB;2DAAC"}
1
+ {"version":3,"file":"allocate-cloud-session-failed.js","sourceRoot":"","sources":["../../../src/v4/events/allocate-cloud-session-failed.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAA0E;AAC1E,6EAAwE;AACxE,oGAAqF;AACrF,yDAAqD;AAErD,IAAY,+BAaX;AAbD,WAAY,+BAA+B;IAEzC,8EAA2C,CAAA;IAE3C,8EAA2C,CAAA;IAE3C,sGAAmE,CAAA;IAEnE,0GAAuE,CAAA;IAEvE,kFAA+C,CAAA;IAE/C,kFAA+C,CAAA;AACjD,CAAC,EAbW,+BAA+B,+CAA/B,+BAA+B,QAa1C;AAED,MAAa,iCAAiC;CAmB7C;AAnBD,8EAmBC;AAfC;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,+BAA+B,CAAC;;+DACD;AAIvC;IADC,IAAA,0BAAQ,GAAE;;sEACS;AAKpB;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;gEACI;AAKf;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,GAAE;;sEACU;AAExB,MAAa,0BAA2B,SAAQ,wBAAU;IAIxD,YACE,OAA0C,EAC1C,OAA4B;QAE5B,KAAK,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;;AAXH,gEAkBC;AAjBiB,qCAAU,GACxB,uDAAuD,CAAC;AAY1D;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,iCAAiC,CAAC;8BACnD,iCAAiC;2DAAC;AAG3C;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,2CAAmB,CAAC;8BACrC,2CAAmB;2DAAC"}
@@ -0,0 +1,13 @@
1
+ import { LudeoEvent } from "../../../infra";
2
+ import { CloudSessionContext } from "../../contexts";
3
+ export declare class CloudSessionQueuedPayload {
4
+ cloudSessionId: string;
5
+ estimatedWaitTimeMs: number;
6
+ position: number;
7
+ }
8
+ export declare class CloudSessionQueued extends LudeoEvent {
9
+ static readonly EVENT_NAME = "cloud-session-allocator.cloud-session-queued";
10
+ constructor(payload: CloudSessionQueuedPayload, context: CloudSessionContext);
11
+ payload: CloudSessionQueuedPayload;
12
+ context: CloudSessionContext;
13
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CloudSessionQueued = exports.CloudSessionQueuedPayload = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ const decorators_1 = require("../../../decorators");
15
+ const infra_1 = require("../../../infra");
16
+ const contexts_1 = require("../../contexts");
17
+ class CloudSessionQueuedPayload {
18
+ }
19
+ exports.CloudSessionQueuedPayload = CloudSessionQueuedPayload;
20
+ __decorate([
21
+ (0, class_validator_1.IsUUID)(),
22
+ __metadata("design:type", String)
23
+ ], CloudSessionQueuedPayload.prototype, "cloudSessionId", void 0);
24
+ __decorate([
25
+ (0, class_validator_1.IsInt)(),
26
+ __metadata("design:type", Number)
27
+ ], CloudSessionQueuedPayload.prototype, "estimatedWaitTimeMs", void 0);
28
+ __decorate([
29
+ (0, class_validator_1.IsInt)(),
30
+ __metadata("design:type", Number)
31
+ ], CloudSessionQueuedPayload.prototype, "position", void 0);
32
+ class CloudSessionQueued extends infra_1.LudeoEvent {
33
+ constructor(payload, context) {
34
+ super(CloudSessionQueued.EVENT_NAME);
35
+ this.payload = payload;
36
+ this.context = context;
37
+ }
38
+ }
39
+ exports.CloudSessionQueued = CloudSessionQueued;
40
+ CloudSessionQueued.EVENT_NAME = "cloud-session-allocator.cloud-session-queued";
41
+ __decorate([
42
+ (0, decorators_1.ValidateNestedType)(() => CloudSessionQueuedPayload),
43
+ __metadata("design:type", CloudSessionQueuedPayload)
44
+ ], CloudSessionQueued.prototype, "payload", void 0);
45
+ __decorate([
46
+ (0, decorators_1.ValidateNestedType)(() => contexts_1.CloudSessionContext),
47
+ __metadata("design:type", contexts_1.CloudSessionContext)
48
+ ], CloudSessionQueued.prototype, "context", void 0);
49
+ //# sourceMappingURL=cloud-session-queued.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-session-queued.js","sourceRoot":"","sources":["../../../../src/v4/events/cloud-session-allocator/cloud-session-queued.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAgD;AAEhD,oDAAyD;AACzD,0CAA4C;AAC5C,6CAAqD;AAIrD,MAAa,yBAAyB;CAYrC;AAZD,8DAYC;AATC;IADC,IAAA,wBAAM,GAAE;;iEACc;AAIvB;IADC,IAAA,uBAAK,GAAE;;sEACoB;AAI5B;IADC,IAAA,uBAAK,GAAE;;2DACS;AAGnB,MAAa,kBAAmB,SAAQ,kBAAU;IAGhD,YAAY,OAAkC,EAAE,OAA4B;QAC1E,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;;AAPH,gDAcC;AAbiB,6BAAU,GAAG,8CAA8C,CAAC;AAS5E;IADC,IAAA,+BAAkB,EAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC;8BAC3C,yBAAyB;mDAAC;AAGnC;IADC,IAAA,+BAAkB,EAAC,GAAG,EAAE,CAAC,8BAAmB,CAAC;8BACrC,8BAAmB;mDAAC"}
@@ -1 +1,2 @@
1
1
  export * from "./allocate-cloud-session-requested";
2
+ export * from "./cloud-session-queued";
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./allocate-cloud-session-requested"), exports);
18
+ __exportStar(require("./cloud-session-queued"), exports);
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/v4/events/cloud-session-allocator/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qEAAmD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/v4/events/cloud-session-allocator/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qEAAmD;AACnD,yDAAuC"}
@@ -2,6 +2,8 @@ import { LudeoEvent } from "../../infra/ludeo-event";
2
2
  import { CloudPoolContext } from "../contexts";
3
3
  export declare class LudeoAvailablePayload {
4
4
  ludeoPoolId: string;
5
+ gamePoolId: string;
6
+ ludeoId: string;
5
7
  }
6
8
  export declare class LudeoAvailable extends LudeoEvent {
7
9
  static readonly EVENT_NAME = "cloud-pools.ludeo-available";
@@ -21,6 +21,14 @@ __decorate([
21
21
  (0, class_validator_1.IsUUID)(),
22
22
  __metadata("design:type", String)
23
23
  ], LudeoAvailablePayload.prototype, "ludeoPoolId", void 0);
24
+ __decorate([
25
+ (0, class_validator_1.IsUUID)(),
26
+ __metadata("design:type", String)
27
+ ], LudeoAvailablePayload.prototype, "gamePoolId", void 0);
28
+ __decorate([
29
+ (0, class_validator_1.IsUUID)(),
30
+ __metadata("design:type", String)
31
+ ], LudeoAvailablePayload.prototype, "ludeoId", void 0);
24
32
  class LudeoAvailable extends ludeo_event_1.LudeoEvent {
25
33
  constructor(payload, context) {
26
34
  super(LudeoAvailable.EVENT_NAME);
@@ -1 +1 @@
1
- {"version":3,"file":"ludeo-available.js","sourceRoot":"","sources":["../../../src/v4/events/ludeo-available.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAmD;AAEnD,oGAAqF;AACrF,yDAAqD;AACrD,0CAA+C;AAE/C,MAAa,qBAAqB;CAGjC;AAHD,sDAGC;AADC;IADC,IAAA,wBAAM,GAAE;;0DACW;AAGtB,MAAa,cAAe,SAAQ,wBAAU;IAG5C,YAAY,OAA8B,EAAE,OAAyB;QACnE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;;AAPH,wCAcC;AAbiB,yBAAU,GAAG,6BAA6B,CAAC;AAS3D;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,2BAAgB,CAAC;8BAClC,2BAAgB;+CAAC;AAG1B;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC;8BACvC,qBAAqB;+CAAC"}
1
+ {"version":3,"file":"ludeo-available.js","sourceRoot":"","sources":["../../../src/v4/events/ludeo-available.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAyC;AAEzC,oGAAqF;AACrF,yDAAqD;AACrD,0CAA+C;AAE/C,MAAa,qBAAqB;CAWjC;AAXD,sDAWC;AATC;IADC,IAAA,wBAAM,GAAE;;0DACW;AAIpB;IADC,IAAA,wBAAM,GAAE;;yDACU;AAInB;IADC,IAAA,wBAAM,GAAE;;sDACO;AAGlB,MAAa,cAAe,SAAQ,wBAAU;IAG5C,YAAY,OAA8B,EAAE,OAAyB;QACnE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;;AAPH,wCAcC;AAbiB,yBAAU,GAAG,6BAA6B,CAAC;AAS3D;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,2BAAgB,CAAC;8BAClC,2BAAgB;+CAAC;AAG1B;IADC,IAAA,mDAAkB,EAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC;8BACvC,qBAAqB;+CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ludeo/cloud-common",
3
- "version": "1.2.273",
3
+ "version": "1.2.274",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "author": "Yahil Didi",
@@ -1,11 +1,42 @@
1
- import { IsString } from "class-validator";
1
+ import { IsBoolean, IsEnum, IsOptional, IsString } from "class-validator";
2
2
  import { CloudSessionContext } from "../contexts/cloud-session-context";
3
3
  import { ValidateNestedType } from "../../decorators/validate-nested-type.decorator";
4
4
  import { LudeoEvent } from "../../infra/ludeo-event";
5
5
 
6
+ export enum AllocateCloudSessionFailureCode {
7
+ // No machines and autoscale is off — nothing can ever serve this request.
8
+ NOT_AVAILABLE_ERROR = "NOT_AVAILABLE_ERROR",
9
+ // Held in the queue past QUEUE_MAX_WAIT_MS.
10
+ QUEUE_TIMEOUT_ERROR = "QUEUE_TIMEOUT_ERROR",
11
+ // No eligible pools matched the requested region.
12
+ NO_AVAILABLE_POOLS_REGION_ERROR = "NO_AVAILABLE_POOLS_REGION_ERROR",
13
+ // No eligible pools matched the requested hardware.
14
+ NO_AVAILABLE_POOLS_HARDWARE_ERROR = "NO_AVAILABLE_POOLS_HARDWARE_ERROR",
15
+ // Bad request payload.
16
+ INVALID_REQUEST_ERROR = "INVALID_REQUEST_ERROR",
17
+ // Unexpected failure.
18
+ INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR",
19
+ }
20
+
6
21
  export class AllocateCloudSessionFailedPayload {
22
+ // Structured failure code (queue V2). Omitted on the legacy path.
23
+ @IsOptional()
24
+ @IsEnum(AllocateCloudSessionFailureCode)
25
+ code?: AllocateCloudSessionFailureCode;
26
+
27
+ // Human-readable failure message.
7
28
  @IsString()
8
- error: string;
29
+ description: string;
30
+
31
+ // Optional error stack for debugging (not shown to the player).
32
+ @IsOptional()
33
+ @IsString()
34
+ stack?: string;
35
+
36
+ // Whether retrying could plausibly succeed. NOT_AVAILABLE/INVALID_REQUEST are false.
37
+ @IsOptional()
38
+ @IsBoolean()
39
+ isRetryable?: boolean;
9
40
  }
10
41
  export class AllocateCloudSessionFailed extends LudeoEvent {
11
42
  static readonly EVENT_NAME =
@@ -0,0 +1,37 @@
1
+ import { IsInt, IsUUID } from "class-validator";
2
+
3
+ import { ValidateNestedType } from "../../../decorators";
4
+ import { LudeoEvent } from "../../../infra";
5
+ import { CloudSessionContext } from "../../contexts";
6
+
7
+ // Emitted when a request enters the waiting queues (push once on enqueue). Tells the client
8
+ // "you're in line" with the initial position + estimated wait; subsequent updates are polled.
9
+ export class CloudSessionQueuedPayload {
10
+ // System-wide correlation id (also present on the context).
11
+ @IsUUID()
12
+ cloudSessionId: string;
13
+
14
+ // Best-effort estimated wait, in ms (min of the vacate vs new-machine paths).
15
+ @IsInt()
16
+ estimatedWaitTimeMs: number;
17
+
18
+ // peopleAhead — fewest waiters ahead across the request's eligible game-pool queues.
19
+ @IsInt()
20
+ position: number;
21
+ }
22
+
23
+ export class CloudSessionQueued extends LudeoEvent {
24
+ static readonly EVENT_NAME = "cloud-session-allocator.cloud-session-queued";
25
+
26
+ constructor(payload: CloudSessionQueuedPayload, context: CloudSessionContext) {
27
+ super(CloudSessionQueued.EVENT_NAME);
28
+ this.payload = payload;
29
+ this.context = context;
30
+ }
31
+
32
+ @ValidateNestedType(() => CloudSessionQueuedPayload)
33
+ payload: CloudSessionQueuedPayload;
34
+
35
+ @ValidateNestedType(() => CloudSessionContext)
36
+ context: CloudSessionContext;
37
+ }
@@ -1 +1,2 @@
1
- export * from "./allocate-cloud-session-requested";
1
+ export * from "./allocate-cloud-session-requested";
2
+ export * from "./cloud-session-queued";
@@ -1,4 +1,4 @@
1
- import { IsString, IsUUID } from "class-validator";
1
+ import { IsUUID } from "class-validator";
2
2
 
3
3
  import { ValidateNestedType } from "../../decorators/validate-nested-type.decorator";
4
4
  import { LudeoEvent } from "../../infra/ludeo-event";
@@ -7,6 +7,14 @@ import { CloudPoolContext } from "../contexts";
7
7
  export class LudeoAvailablePayload {
8
8
  @IsUUID()
9
9
  ludeoPoolId: string;
10
+
11
+ // Parent game pool — the waiting queue this freed slot pops.
12
+ @IsUUID()
13
+ gamePoolId: string;
14
+
15
+ // The ludeo this freed slot is for.
16
+ @IsUUID()
17
+ ludeoId: string;
10
18
  }
11
19
 
12
20
  export class LudeoAvailable extends LudeoEvent {