@rsdk/kafka.producer 3.6.0-next.2 → 3.6.0-next.3
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/CHANGELOG.md +6 -0
- package/dist/base.producer.d.ts +9 -4
- package/dist/base.producer.js +21 -4
- package/dist/base.producer.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/kafka-producer-plugin.config.d.ts +5 -0
- package/dist/kafka-producer-plugin.config.js +31 -0
- package/dist/kafka-producer-plugin.config.js.map +1 -0
- package/dist/types.d.ts +3 -2
- package/package.json +3 -3
- package/src/base.producer.ts +38 -6
- package/src/index.ts +1 -0
- package/src/kafka-producer-plugin.config.ts +20 -0
- package/src/types.ts +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.6.0-next.3](https://github.com/R-Vision/rsdk/compare/v3.6.0-next.2...v3.6.0-next.3) (2023-10-11)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **kafka.producer:** pfm-461-add-kafka-producer-plugin-with-producer-serializer ([3faeaa3](https://github.com/R-Vision/rsdk/commit/3faeaa30682eed824abf16200f684e5cb6f2e596))
|
|
11
|
+
|
|
6
12
|
## [3.6.0-next.2](https://github.com/R-Vision/rsdk/compare/v3.6.0-next.1...v3.6.0-next.2) (2023-10-10)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @rsdk/kafka.producer
|
package/dist/base.producer.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { type EventType } from '@rsdk/kafka.common';
|
|
3
|
+
import type { KafkaProducerConfig } from './kafka-producer-plugin.config';
|
|
4
|
+
import type { KafkaProducer, OutboxTable, PublishOptions, PublishOptionsMetadata } from './types';
|
|
3
5
|
export declare abstract class BaseProducer<T extends EventType, P = T extends EventType<infer X> ? X : never> implements KafkaProducer<P> {
|
|
4
6
|
readonly eventType: T;
|
|
5
|
-
|
|
7
|
+
readonly kafkaProducerConfig: KafkaProducerConfig;
|
|
8
|
+
constructor(eventType: T, kafkaProducerConfig: KafkaProducerConfig);
|
|
6
9
|
protected getPartitionKey(payload: P, partitionKeyField: string | null): string;
|
|
7
|
-
protected
|
|
10
|
+
protected prepareDataForOutbox(payload: P, options?: PublishOptions): Partial<OutboxTable>;
|
|
11
|
+
protected serializePayload(payload: P): Buffer;
|
|
12
|
+
protected addSerializeFormatToMetadata(metadata: PublishOptionsMetadata | undefined | null): PublishOptionsMetadata | null;
|
|
8
13
|
abstract publish(payload: P, options?: PublishOptions | undefined): Promise<void>;
|
|
9
14
|
}
|
package/dist/base.producer.js
CHANGED
|
@@ -4,12 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.BaseProducer = void 0;
|
|
7
|
+
const kafka_common_1 = require("@rsdk/kafka.common");
|
|
7
8
|
const get_1 = __importDefault(require("lodash/get"));
|
|
8
9
|
const node_crypto_1 = require("node:crypto");
|
|
9
10
|
class BaseProducer {
|
|
10
11
|
eventType;
|
|
11
|
-
|
|
12
|
+
kafkaProducerConfig;
|
|
13
|
+
constructor(eventType, kafkaProducerConfig) {
|
|
12
14
|
this.eventType = eventType;
|
|
15
|
+
this.kafkaProducerConfig = kafkaProducerConfig;
|
|
13
16
|
}
|
|
14
17
|
getPartitionKey(payload, partitionKeyField) {
|
|
15
18
|
const partitionKey = typeof partitionKeyField === 'string' && partitionKeyField.length > 0
|
|
@@ -19,17 +22,31 @@ class BaseProducer {
|
|
|
19
22
|
(0, get_1.default)(payload, 'guid', (0, node_crypto_1.randomUUID)());
|
|
20
23
|
return String(partitionKey);
|
|
21
24
|
}
|
|
22
|
-
|
|
25
|
+
prepareDataForOutbox(payload, options) {
|
|
23
26
|
return {
|
|
24
27
|
group: this.eventType.$group,
|
|
25
|
-
metadata: options?.metadata
|
|
28
|
+
metadata: this.addSerializeFormatToMetadata(options?.metadata || {}),
|
|
26
29
|
partition_key: options?.partitionKey
|
|
27
30
|
? String(options.partitionKey)
|
|
28
31
|
: this.getPartitionKey(payload, this.eventType.$partitionKeyField),
|
|
29
|
-
payload:
|
|
32
|
+
payload: this.serializePayload(payload),
|
|
30
33
|
type: this.eventType.$type,
|
|
31
34
|
};
|
|
32
35
|
}
|
|
36
|
+
serializePayload(payload) {
|
|
37
|
+
if (this.kafkaProducerConfig.payloadFormat === kafka_common_1.PayloadFormat.JSON) {
|
|
38
|
+
return Buffer.from(JSON.stringify(payload));
|
|
39
|
+
}
|
|
40
|
+
return Buffer.from(this.eventType.encode(payload).finish());
|
|
41
|
+
}
|
|
42
|
+
addSerializeFormatToMetadata(metadata) {
|
|
43
|
+
return {
|
|
44
|
+
...metadata,
|
|
45
|
+
...(this.kafkaProducerConfig.payloadFormat !== kafka_common_1.DEFAULT_PAYLOAD_FORMAT && {
|
|
46
|
+
[kafka_common_1.X_FORMAT_HEADER]: this.kafkaProducerConfig.payloadFormat,
|
|
47
|
+
}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
33
50
|
}
|
|
34
51
|
exports.BaseProducer = BaseProducer;
|
|
35
52
|
//# sourceMappingURL=base.producer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.producer.js","sourceRoot":"","sources":["../src/base.producer.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"base.producer.js","sourceRoot":"","sources":["../src/base.producer.ts"],"names":[],"mappings":";;;;;;AAAA,qDAK4B;AAC5B,qDAA6B;AAC7B,6CAAyC;AAUzC,MAAsB,YAAY;IAMrB;IACA;IAFX,YACW,SAAY,EACZ,mBAAwC;QADxC,cAAS,GAAT,SAAS,CAAG;QACZ,wBAAmB,GAAnB,mBAAmB,CAAqB;IAChD,CAAC;IAEM,eAAe,CACvB,OAAU,EACV,iBAAgC;QAEhC,MAAM,YAAY,GAChB,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC;YACnE,CAAC,CAAC,IAAA,aAAG,EAAC,OAAO,EAAE,iBAAiB,EAAE,IAAA,wBAAU,GAAE,CAAC;YAC/C,CAAC,CAAC,IAAA,aAAG,EAAC,OAAO,EAAE,IAAI,CAAC;gBAClB,IAAA,aAAG,EAAC,OAAO,EAAE,MAAM,CAAC;gBACpB,IAAA,aAAG,EAAC,OAAO,EAAE,MAAM,EAAE,IAAA,wBAAU,GAAE,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC;IAES,oBAAoB,CAC5B,OAAU,EACV,OAAwB;QAExB,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;YAC5B,QAAQ,EAAE,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;YACpE,aAAa,EAAE,OAAO,EAAE,YAAY;gBAClC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;YACpE,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;SAC3B,CAAC;IACJ,CAAC;IAES,gBAAgB,CAAC,OAAU;QACnC,IAAI,IAAI,CAAC,mBAAmB,CAAC,aAAa,KAAK,4BAAa,CAAC,IAAI,EAAE;YACjE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;SAC7C;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAES,4BAA4B,CACpC,QAAmD;QAEnD,OAAO;YACL,GAAG,QAAQ;YACX,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,KAAK,qCAAsB,IAAI;gBACvE,CAAC,8BAAe,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa;aAC1D,CAAC;SACH,CAAC;IACJ,CAAC;CAMF;AA7DD,oCA6DC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InjectProducer = exports.BaseProducer = void 0;
|
|
3
|
+
exports.KafkaProducerConfig = exports.InjectProducer = exports.BaseProducer = void 0;
|
|
4
4
|
var base_producer_1 = require("./base.producer");
|
|
5
5
|
Object.defineProperty(exports, "BaseProducer", { enumerable: true, get: function () { return base_producer_1.BaseProducer; } });
|
|
6
6
|
var inject_producer_decorator_1 = require("./inject-producer.decorator");
|
|
7
7
|
Object.defineProperty(exports, "InjectProducer", { enumerable: true, get: function () { return inject_producer_decorator_1.InjectProducer; } });
|
|
8
|
+
var kafka_producer_plugin_config_1 = require("./kafka-producer-plugin.config");
|
|
9
|
+
Object.defineProperty(exports, "KafkaProducerConfig", { enumerable: true, get: function () { return kafka_producer_plugin_config_1.KafkaProducerConfig; } });
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,yEAA6D;AAApD,2HAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,yEAA6D;AAApD,2HAAA,cAAc,OAAA;AACvB,+EAAqE;AAA5D,mIAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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.KafkaProducerConfig = void 0;
|
|
13
|
+
const core_1 = require("@rsdk/core");
|
|
14
|
+
const kafka_common_1 = require("@rsdk/kafka.common");
|
|
15
|
+
let KafkaProducerConfig = exports.KafkaProducerConfig = class KafkaProducerConfig extends core_1.Config {
|
|
16
|
+
payloadFormat;
|
|
17
|
+
};
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, core_1.Property)('KAFKA_PAYLOAD_FORMAT', new core_1.EnumParser(kafka_common_1.PayloadFormat), {
|
|
20
|
+
description: 'Option for producer payload serializer',
|
|
21
|
+
defaultValue: kafka_common_1.DEFAULT_PAYLOAD_FORMAT,
|
|
22
|
+
}),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], KafkaProducerConfig.prototype, "payloadFormat", void 0);
|
|
25
|
+
exports.KafkaProducerConfig = KafkaProducerConfig = __decorate([
|
|
26
|
+
(0, core_1.ConfigSection)({
|
|
27
|
+
name: 'kafka producer config',
|
|
28
|
+
tags: [core_1.ConfigTag.infrastructure, core_1.ConfigTag.storage],
|
|
29
|
+
})
|
|
30
|
+
], KafkaProducerConfig);
|
|
31
|
+
//# sourceMappingURL=kafka-producer-plugin.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka-producer-plugin.config.js","sourceRoot":"","sources":["../src/kafka-producer-plugin.config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAMoB;AACpB,qDAA2E;AAMpE,IAAM,mBAAmB,iCAAzB,MAAM,mBAAoB,SAAQ,aAAM;IAK7C,aAAa,CAAiB;CAC/B,CAAA;AADC;IAJC,IAAA,eAAQ,EAAC,sBAAsB,EAAE,IAAI,iBAAU,CAAC,4BAAa,CAAC,EAAE;QAC/D,WAAW,EAAE,wCAAwC;QACrD,YAAY,EAAE,qCAAsB;KACrC,CAAC;;0DAC4B;8BALnB,mBAAmB;IAJ/B,IAAA,oBAAa,EAAC;QACb,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,CAAC,gBAAS,CAAC,cAAc,EAAE,gBAAS,CAAC,OAAO,CAAC;KACpD,CAAC;GACW,mBAAmB,CAM/B"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
export type PublishOptionsMetadata = Record<string, any>;
|
|
2
3
|
export interface PublishOptions {
|
|
3
|
-
metadata?:
|
|
4
|
+
metadata?: PublishOptionsMetadata;
|
|
4
5
|
partitionKey?: string | number;
|
|
5
6
|
}
|
|
6
7
|
export interface OutboxTable {
|
|
@@ -8,7 +9,7 @@ export interface OutboxTable {
|
|
|
8
9
|
type: string;
|
|
9
10
|
group: string;
|
|
10
11
|
partition_key: string;
|
|
11
|
-
metadata:
|
|
12
|
+
metadata: PublishOptionsMetadata | null;
|
|
12
13
|
payload: Buffer;
|
|
13
14
|
}
|
|
14
15
|
export interface KafkaProducer<P> {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/kafka.producer",
|
|
3
|
-
"version": "3.6.0-next.
|
|
3
|
+
"version": "3.6.0-next.3",
|
|
4
4
|
"description": "Publishers for kafka (different direct and outbox strategies)",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
"@nestjs/typeorm": "^10.0.0",
|
|
17
17
|
"@rsdk/common": "^3.5.0",
|
|
18
18
|
"@rsdk/core": "^3.6.0-next.2",
|
|
19
|
-
"@rsdk/kafka.common": "^3.6.0-next.
|
|
19
|
+
"@rsdk/kafka.common": "^3.6.0-next.3",
|
|
20
20
|
"@rsdk/logging": "^3.5.0",
|
|
21
21
|
"lodash": "^4.17.21"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "9568fb812dd4f326c98f14cbc6f2b6902a0968f0"
|
|
24
24
|
}
|
package/src/base.producer.ts
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_PAYLOAD_FORMAT,
|
|
3
|
+
type EventType,
|
|
4
|
+
PayloadFormat,
|
|
5
|
+
X_FORMAT_HEADER,
|
|
6
|
+
} from '@rsdk/kafka.common';
|
|
2
7
|
import get from 'lodash/get';
|
|
3
8
|
import { randomUUID } from 'node:crypto';
|
|
4
9
|
|
|
5
|
-
import type {
|
|
10
|
+
import type { KafkaProducerConfig } from './kafka-producer-plugin.config';
|
|
11
|
+
import type {
|
|
12
|
+
KafkaProducer,
|
|
13
|
+
OutboxTable,
|
|
14
|
+
PublishOptions,
|
|
15
|
+
PublishOptionsMetadata,
|
|
16
|
+
} from './types';
|
|
6
17
|
|
|
7
18
|
export abstract class BaseProducer<
|
|
8
19
|
T extends EventType,
|
|
9
20
|
P = T extends EventType<infer X> ? X : never,
|
|
10
21
|
> implements KafkaProducer<P>
|
|
11
22
|
{
|
|
12
|
-
constructor(
|
|
23
|
+
constructor(
|
|
24
|
+
readonly eventType: T,
|
|
25
|
+
readonly kafkaProducerConfig: KafkaProducerConfig,
|
|
26
|
+
) {}
|
|
13
27
|
|
|
14
28
|
protected getPartitionKey(
|
|
15
29
|
payload: P,
|
|
@@ -25,21 +39,39 @@ export abstract class BaseProducer<
|
|
|
25
39
|
return String(partitionKey);
|
|
26
40
|
}
|
|
27
41
|
|
|
28
|
-
protected
|
|
42
|
+
protected prepareDataForOutbox(
|
|
29
43
|
payload: P,
|
|
30
44
|
options?: PublishOptions,
|
|
31
45
|
): Partial<OutboxTable> {
|
|
32
46
|
return {
|
|
33
47
|
group: this.eventType.$group,
|
|
34
|
-
metadata: options?.metadata
|
|
48
|
+
metadata: this.addSerializeFormatToMetadata(options?.metadata || {}),
|
|
35
49
|
partition_key: options?.partitionKey
|
|
36
50
|
? String(options.partitionKey)
|
|
37
51
|
: this.getPartitionKey(payload, this.eventType.$partitionKeyField),
|
|
38
|
-
payload:
|
|
52
|
+
payload: this.serializePayload(payload),
|
|
39
53
|
type: this.eventType.$type,
|
|
40
54
|
};
|
|
41
55
|
}
|
|
42
56
|
|
|
57
|
+
protected serializePayload(payload: P): Buffer {
|
|
58
|
+
if (this.kafkaProducerConfig.payloadFormat === PayloadFormat.JSON) {
|
|
59
|
+
return Buffer.from(JSON.stringify(payload));
|
|
60
|
+
}
|
|
61
|
+
return Buffer.from(this.eventType.encode(payload).finish());
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
protected addSerializeFormatToMetadata(
|
|
65
|
+
metadata: PublishOptionsMetadata | undefined | null,
|
|
66
|
+
): PublishOptionsMetadata | null {
|
|
67
|
+
return {
|
|
68
|
+
...metadata,
|
|
69
|
+
...(this.kafkaProducerConfig.payloadFormat !== DEFAULT_PAYLOAD_FORMAT && {
|
|
70
|
+
[X_FORMAT_HEADER]: this.kafkaProducerConfig.payloadFormat,
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
43
75
|
abstract publish(
|
|
44
76
|
payload: P,
|
|
45
77
|
options?: PublishOptions | undefined,
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Config,
|
|
3
|
+
ConfigSection,
|
|
4
|
+
ConfigTag,
|
|
5
|
+
EnumParser,
|
|
6
|
+
Property,
|
|
7
|
+
} from '@rsdk/core';
|
|
8
|
+
import { DEFAULT_PAYLOAD_FORMAT, PayloadFormat } from '@rsdk/kafka.common';
|
|
9
|
+
|
|
10
|
+
@ConfigSection({
|
|
11
|
+
name: 'kafka producer config',
|
|
12
|
+
tags: [ConfigTag.infrastructure, ConfigTag.storage],
|
|
13
|
+
})
|
|
14
|
+
export class KafkaProducerConfig extends Config {
|
|
15
|
+
@Property('KAFKA_PAYLOAD_FORMAT', new EnumParser(PayloadFormat), {
|
|
16
|
+
description: 'Option for producer payload serializer',
|
|
17
|
+
defaultValue: DEFAULT_PAYLOAD_FORMAT,
|
|
18
|
+
})
|
|
19
|
+
payloadFormat!: PayloadFormat;
|
|
20
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
export type PublishOptionsMetadata = Record<string, any>;
|
|
2
|
+
|
|
1
3
|
export interface PublishOptions {
|
|
2
4
|
// Metadata must be a plain object. Object will be stringified.
|
|
3
|
-
metadata?:
|
|
5
|
+
metadata?: PublishOptionsMetadata;
|
|
4
6
|
partitionKey?: string | number;
|
|
5
7
|
}
|
|
6
8
|
|
|
@@ -9,7 +11,7 @@ export interface OutboxTable {
|
|
|
9
11
|
type: string;
|
|
10
12
|
group: string;
|
|
11
13
|
partition_key: string;
|
|
12
|
-
metadata:
|
|
14
|
+
metadata: PublishOptionsMetadata | null;
|
|
13
15
|
payload: Buffer;
|
|
14
16
|
}
|
|
15
17
|
|