Compare commits

...
10 Commits
Author SHA1 Message Date
devlikepro 91d541387b [core] 2026.1.5
Release / NOWEB - none - linux/arm64 - noweb-arm (push) Waiting to run
Release / WEBJS - chrome - amd64 - chrome (push) Waiting to run
Release / WEBJS - chromium - amd64 - latest (push) Waiting to run
Release / WEBJS - chromium - linux/arm64 - arm (push) Waiting to run
Release / GOWS - none - amd64 - gows (push) Waiting to run
Release / GOWS - none - linux/arm64 - gows-arm (push) Waiting to run
Release / NOWEB - none - amd64 - noweb (push) Waiting to run
2026-01-28 17:32:34 +07:00
devlikepro 9dbd45da6e [core] Up WEBJS - fix #1855 fix #1856 2026-01-28 17:32:34 +07:00
devlikepro adc1c3960c [core] for-swagger 2026-01-28 17:32:33 +07:00
devlikepro ff742d2e84 [core] WEBJS - add removeExposedFunction WPage 2026-01-28 17:32:33 +07:00
devlikepro 10bd4d6271 [core] Up Dashboard 2026-01-28 17:32:33 +07:00
devlikepro 874cafe114 [core] GOWS - disable storage
fix #823
2026-01-28 17:32:33 +07:00
devlikepro 0ce2c4b9fa [core] GOWS - Exclude AppState, HistorySync, Contact events 2026-01-28 17:32:33 +07:00
devlikepro a8a7988bfa [core] GOWS - Exclude event from engine.events 2026-01-28 17:32:33 +07:00
devlikepro 2940d93b81 [core] Up GOWS 2026-01-28 17:32:32 +07:00
devlikepro 88707cf72b [core] GOWS - BuildClient 2026-01-28 17:32:32 +07:00
11 changed files with 1059 additions and 31 deletions

No files matched your search

+1 -1
View File
@@ -32,7 +32,7 @@ push:
docker push devlikeapro/waha
for-swagger:
WHATSAPP_SWAGGER_CONFIG_ADVANCED=true WHATSAPP_SWAGGER_PASSWORD=666 nvm exec yarn start
export WHATSAPP_SWAGGER_CONFIG_ADVANCED=true && export WHATSAPP_SWAGGER_PASSWORD=666 && yarn start
up-noweb:
yarn up @adiwajshing/baileys@github:devlikeapro/Baileys#fork-master-2026-01-25
+6 -8
View File
@@ -1,24 +1,22 @@
import * as grpc from '@grpc/grpc-js';
import { messages } from '@waha/core/engines/gows/grpc/gows';
export const GetMessageServiceClient = (
session: string,
export function BuildMessageServiceClient(
address: string,
credentials: grpc.ChannelCredentials,
): messages.MessageServiceClient => {
): messages.MessageServiceClient {
return new messages.MessageServiceClient(address, credentials, {
'grpc.max_send_message_length': 128 * 1024 * 1024,
'grpc.max_receive_message_length': 128 * 1024 * 1024,
});
};
}
export const GetEventStreamClient = (
session: string,
export function BuildEventStreamClient(
address: string,
credentials: grpc.ChannelCredentials,
): messages.EventStreamClient => {
): messages.EventStreamClient {
return new messages.EventStreamClient(address, credentials, {
'grpc.max_send_message_length': 128 * 1024 * 1024,
'grpc.max_receive_message_length': 128 * 1024 * 1024,
});
};
}
+321 -5
View File
@@ -879,6 +879,99 @@ export namespace messages {
return EventJson.deserialize(bytes);
}
}
export class StreamEventsRequest extends pb_1.Message {
#one_of_decls: number[][] = [];
constructor(data?: any[] | {
session?: Session;
exclude?: string[];
}) {
super();
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [2], this.#one_of_decls);
if (!Array.isArray(data) && typeof data == "object") {
if ("session" in data && data.session != undefined) {
this.session = data.session;
}
if ("exclude" in data && data.exclude != undefined) {
this.exclude = data.exclude;
}
}
}
get session() {
return pb_1.Message.getWrapperField(this, Session, 1) as Session;
}
set session(value: Session) {
pb_1.Message.setWrapperField(this, 1, value);
}
get has_session() {
return pb_1.Message.getField(this, 1) != null;
}
get exclude() {
return pb_1.Message.getFieldWithDefault(this, 2, []) as string[];
}
set exclude(value: string[]) {
pb_1.Message.setField(this, 2, value);
}
static fromObject(data: {
session?: ReturnType<typeof Session.prototype.toObject>;
exclude?: string[];
}): StreamEventsRequest {
const message = new StreamEventsRequest({});
if (data.session != null) {
message.session = Session.fromObject(data.session);
}
if (data.exclude != null) {
message.exclude = data.exclude;
}
return message;
}
toObject() {
const data: {
session?: ReturnType<typeof Session.prototype.toObject>;
exclude?: string[];
} = {};
if (this.session != null) {
data.session = this.session.toObject();
}
if (this.exclude != null) {
data.exclude = this.exclude;
}
return data;
}
serialize(): Uint8Array;
serialize(w: pb_1.BinaryWriter): void;
serialize(w?: pb_1.BinaryWriter): Uint8Array | void {
const writer = w || new pb_1.BinaryWriter();
if (this.has_session)
writer.writeMessage(1, this.session, () => this.session.serialize(writer));
if (this.exclude.length)
writer.writeRepeatedString(2, this.exclude);
if (!w)
return writer.getResultBuffer();
}
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): StreamEventsRequest {
const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new StreamEventsRequest();
while (reader.nextField()) {
if (reader.isEndGroup())
break;
switch (reader.getFieldNumber()) {
case 1:
reader.readMessage(message.session, () => message.session = Session.deserialize(reader));
break;
case 2:
pb_1.Message.addToRepeatedField(message, 2, reader.readString());
break;
default: reader.skipField();
}
}
return message;
}
serializeBinary(): Uint8Array {
return this.serialize();
}
static deserializeBinary(bytes: Uint8Array): StreamEventsRequest {
return StreamEventsRequest.deserialize(bytes);
}
}
export class PairCodeRequest extends pb_1.Message {
#one_of_decls: number[][] = [];
constructor(data?: any[] | {
@@ -1236,6 +1329,193 @@ export namespace messages {
return SessionStoreConfig.deserialize(bytes);
}
}
export class SessionStorageConfig extends pb_1.Message {
#one_of_decls: number[][] = [[1], [2], [3], [4]];
constructor(data?: any[] | ({} & (({
messages?: boolean;
}) | ({
groups?: boolean;
}) | ({
chats?: boolean;
}) | ({
labels?: boolean;
})))) {
super();
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls);
if (!Array.isArray(data) && typeof data == "object") {
if ("messages" in data && data.messages != undefined) {
this.messages = data.messages;
}
if ("groups" in data && data.groups != undefined) {
this.groups = data.groups;
}
if ("chats" in data && data.chats != undefined) {
this.chats = data.chats;
}
if ("labels" in data && data.labels != undefined) {
this.labels = data.labels;
}
}
}
get messages() {
return pb_1.Message.getFieldWithDefault(this, 1, false) as boolean;
}
set messages(value: boolean) {
pb_1.Message.setOneofField(this, 1, this.#one_of_decls[0], value);
}
get has_messages() {
return pb_1.Message.getField(this, 1) != null;
}
get groups() {
return pb_1.Message.getFieldWithDefault(this, 2, false) as boolean;
}
set groups(value: boolean) {
pb_1.Message.setOneofField(this, 2, this.#one_of_decls[1], value);
}
get has_groups() {
return pb_1.Message.getField(this, 2) != null;
}
get chats() {
return pb_1.Message.getFieldWithDefault(this, 3, false) as boolean;
}
set chats(value: boolean) {
pb_1.Message.setOneofField(this, 3, this.#one_of_decls[2], value);
}
get has_chats() {
return pb_1.Message.getField(this, 3) != null;
}
get labels() {
return pb_1.Message.getFieldWithDefault(this, 4, false) as boolean;
}
set labels(value: boolean) {
pb_1.Message.setOneofField(this, 4, this.#one_of_decls[3], value);
}
get has_labels() {
return pb_1.Message.getField(this, 4) != null;
}
get _messages() {
const cases: {
[index: number]: "none" | "messages";
} = {
0: "none",
1: "messages"
};
return cases[pb_1.Message.computeOneofCase(this, [1])];
}
get _groups() {
const cases: {
[index: number]: "none" | "groups";
} = {
0: "none",
2: "groups"
};
return cases[pb_1.Message.computeOneofCase(this, [2])];
}
get _chats() {
const cases: {
[index: number]: "none" | "chats";
} = {
0: "none",
3: "chats"
};
return cases[pb_1.Message.computeOneofCase(this, [3])];
}
get _labels() {
const cases: {
[index: number]: "none" | "labels";
} = {
0: "none",
4: "labels"
};
return cases[pb_1.Message.computeOneofCase(this, [4])];
}
static fromObject(data: {
messages?: boolean;
groups?: boolean;
chats?: boolean;
labels?: boolean;
}): SessionStorageConfig {
const message = new SessionStorageConfig({});
if (data.messages != null) {
message.messages = data.messages;
}
if (data.groups != null) {
message.groups = data.groups;
}
if (data.chats != null) {
message.chats = data.chats;
}
if (data.labels != null) {
message.labels = data.labels;
}
return message;
}
toObject() {
const data: {
messages?: boolean;
groups?: boolean;
chats?: boolean;
labels?: boolean;
} = {};
if (this.messages != null) {
data.messages = this.messages;
}
if (this.groups != null) {
data.groups = this.groups;
}
if (this.chats != null) {
data.chats = this.chats;
}
if (this.labels != null) {
data.labels = this.labels;
}
return data;
}
serialize(): Uint8Array;
serialize(w: pb_1.BinaryWriter): void;
serialize(w?: pb_1.BinaryWriter): Uint8Array | void {
const writer = w || new pb_1.BinaryWriter();
if (this.has_messages)
writer.writeBool(1, this.messages);
if (this.has_groups)
writer.writeBool(2, this.groups);
if (this.has_chats)
writer.writeBool(3, this.chats);
if (this.has_labels)
writer.writeBool(4, this.labels);
if (!w)
return writer.getResultBuffer();
}
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): SessionStorageConfig {
const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new SessionStorageConfig();
while (reader.nextField()) {
if (reader.isEndGroup())
break;
switch (reader.getFieldNumber()) {
case 1:
message.messages = reader.readBool();
break;
case 2:
message.groups = reader.readBool();
break;
case 3:
message.chats = reader.readBool();
break;
case 4:
message.labels = reader.readBool();
break;
default: reader.skipField();
}
}
return message;
}
serializeBinary(): Uint8Array {
return this.serialize();
}
static deserializeBinary(bytes: Uint8Array): SessionStorageConfig {
return SessionStorageConfig.deserialize(bytes);
}
}
export class SessionProxyConfig extends pb_1.Message {
#one_of_decls: number[][] = [];
constructor(data?: any[] | {
@@ -1440,13 +1720,15 @@ export namespace messages {
}
}
export class SessionConfig extends pb_1.Message {
#one_of_decls: number[][] = [[4]];
#one_of_decls: number[][] = [[4], [5]];
constructor(data?: any[] | ({
store?: SessionStoreConfig;
log?: SessionLogConfig;
proxy?: SessionProxyConfig;
} & (({
ignore?: SessionIgnoreJidsConfig;
}) | ({
storage?: SessionStorageConfig;
})))) {
super();
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls);
@@ -1463,6 +1745,9 @@ export namespace messages {
if ("ignore" in data && data.ignore != undefined) {
this.ignore = data.ignore;
}
if ("storage" in data && data.storage != undefined) {
this.storage = data.storage;
}
}
}
get store() {
@@ -1501,6 +1786,15 @@ export namespace messages {
get has_ignore() {
return pb_1.Message.getField(this, 4) != null;
}
get storage() {
return pb_1.Message.getWrapperField(this, SessionStorageConfig, 5) as SessionStorageConfig;
}
set storage(value: SessionStorageConfig) {
pb_1.Message.setOneofWrapperField(this, 5, this.#one_of_decls[1], value);
}
get has_storage() {
return pb_1.Message.getField(this, 5) != null;
}
get _ignore() {
const cases: {
[index: number]: "none" | "ignore";
@@ -1510,11 +1804,21 @@ export namespace messages {
};
return cases[pb_1.Message.computeOneofCase(this, [4])];
}
get _storage() {
const cases: {
[index: number]: "none" | "storage";
} = {
0: "none",
5: "storage"
};
return cases[pb_1.Message.computeOneofCase(this, [5])];
}
static fromObject(data: {
store?: ReturnType<typeof SessionStoreConfig.prototype.toObject>;
log?: ReturnType<typeof SessionLogConfig.prototype.toObject>;
proxy?: ReturnType<typeof SessionProxyConfig.prototype.toObject>;
ignore?: ReturnType<typeof SessionIgnoreJidsConfig.prototype.toObject>;
storage?: ReturnType<typeof SessionStorageConfig.prototype.toObject>;
}): SessionConfig {
const message = new SessionConfig({});
if (data.store != null) {
@@ -1529,6 +1833,9 @@ export namespace messages {
if (data.ignore != null) {
message.ignore = SessionIgnoreJidsConfig.fromObject(data.ignore);
}
if (data.storage != null) {
message.storage = SessionStorageConfig.fromObject(data.storage);
}
return message;
}
toObject() {
@@ -1537,6 +1844,7 @@ export namespace messages {
log?: ReturnType<typeof SessionLogConfig.prototype.toObject>;
proxy?: ReturnType<typeof SessionProxyConfig.prototype.toObject>;
ignore?: ReturnType<typeof SessionIgnoreJidsConfig.prototype.toObject>;
storage?: ReturnType<typeof SessionStorageConfig.prototype.toObject>;
} = {};
if (this.store != null) {
data.store = this.store.toObject();
@@ -1550,6 +1858,9 @@ export namespace messages {
if (this.ignore != null) {
data.ignore = this.ignore.toObject();
}
if (this.storage != null) {
data.storage = this.storage.toObject();
}
return data;
}
serialize(): Uint8Array;
@@ -1564,6 +1875,8 @@ export namespace messages {
writer.writeMessage(3, this.proxy, () => this.proxy.serialize(writer));
if (this.has_ignore)
writer.writeMessage(4, this.ignore, () => this.ignore.serialize(writer));
if (this.has_storage)
writer.writeMessage(5, this.storage, () => this.storage.serialize(writer));
if (!w)
return writer.getResultBuffer();
}
@@ -1585,6 +1898,9 @@ export namespace messages {
case 4:
reader.readMessage(message.ignore, () => message.ignore = SessionIgnoreJidsConfig.deserialize(reader));
break;
case 5:
reader.readMessage(message.storage, () => message.storage = SessionStorageConfig.deserialize(reader));
break;
default: reader.skipField();
}
}
@@ -10491,20 +10807,20 @@ export namespace messages {
path: "/messages.EventStream/StreamEvents",
requestStream: false,
responseStream: true,
requestSerialize: (message: Session) => Buffer.from(message.serialize()),
requestDeserialize: (bytes: Buffer) => Session.deserialize(new Uint8Array(bytes)),
requestSerialize: (message: StreamEventsRequest) => Buffer.from(message.serialize()),
requestDeserialize: (bytes: Buffer) => StreamEventsRequest.deserialize(new Uint8Array(bytes)),
responseSerialize: (message: EventJson) => Buffer.from(message.serialize()),
responseDeserialize: (bytes: Buffer) => EventJson.deserialize(new Uint8Array(bytes))
}
};
[method: string]: grpc_1.UntypedHandleCall;
abstract StreamEvents(call: grpc_1.ServerWritableStream<Session, EventJson>): void;
abstract StreamEvents(call: grpc_1.ServerWritableStream<StreamEventsRequest, EventJson>): void;
}
export class EventStreamClient extends grpc_1.makeGenericClientConstructor(UnimplementedEventStreamService.definition, "EventStream", {}) {
constructor(address: string, credentials: grpc_1.ChannelCredentials, options?: Partial<grpc_1.ChannelOptions>) {
super(address, credentials, options);
}
StreamEvents: GrpcStreamServiceInterface<Session, EventJson> = (message: Session, metadata?: grpc_1.Metadata | grpc_1.CallOptions, options?: grpc_1.CallOptions): grpc_1.ClientReadableStream<EventJson> => {
StreamEvents: GrpcStreamServiceInterface<StreamEventsRequest, EventJson> = (message: StreamEventsRequest, metadata?: grpc_1.Metadata | grpc_1.CallOptions, options?: grpc_1.CallOptions): grpc_1.ClientReadableStream<EventJson> => {
return super.StreamEvents(message, metadata, options);
};
}
+14 -3
View File
@@ -642,6 +642,17 @@ function deserialize_messages_StartSessionRequest(buffer_arg) {
return gows_pb.StartSessionRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_messages_StreamEventsRequest(arg) {
if (!(arg instanceof gows_pb.StreamEventsRequest)) {
throw new Error('Expected argument of type messages.StreamEventsRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_messages_StreamEventsRequest(buffer_arg) {
return gows_pb.StreamEventsRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_messages_SubscribePresenceRequest(arg) {
if (!(arg instanceof gows_pb.SubscribePresenceRequest)) {
throw new Error('Expected argument of type messages.SubscribePresenceRequest');
@@ -695,10 +706,10 @@ var EventStreamService = exports.EventStreamService = {
path: '/messages.EventStream/StreamEvents',
requestStream: false,
responseStream: true,
requestType: gows_pb.Session,
requestType: gows_pb.StreamEventsRequest,
responseType: gows_pb.EventJson,
requestSerialize: serialize_messages_Session,
requestDeserialize: deserialize_messages_Session,
requestSerialize: serialize_messages_StreamEventsRequest,
requestDeserialize: deserialize_messages_StreamEventsRequest,
responseSerialize: serialize_messages_EventJson,
responseDeserialize: deserialize_messages_EventJson,
},
+595 -1
View File
@@ -108,12 +108,14 @@ goog.exportSymbol('proto.messages.SessionIgnoreJidsConfig', null, global);
goog.exportSymbol('proto.messages.SessionLogConfig', null, global);
goog.exportSymbol('proto.messages.SessionProxyConfig', null, global);
goog.exportSymbol('proto.messages.SessionStateResponse', null, global);
goog.exportSymbol('proto.messages.SessionStorageConfig', null, global);
goog.exportSymbol('proto.messages.SessionStoreConfig', null, global);
goog.exportSymbol('proto.messages.SetPictureRequest', null, global);
goog.exportSymbol('proto.messages.SetProfilePictureRequest', null, global);
goog.exportSymbol('proto.messages.SortBy', null, global);
goog.exportSymbol('proto.messages.SortBy.Order', null, global);
goog.exportSymbol('proto.messages.StartSessionRequest', null, global);
goog.exportSymbol('proto.messages.StreamEventsRequest', null, global);
goog.exportSymbol('proto.messages.SubscribePresenceRequest', null, global);
goog.exportSymbol('proto.messages.UpdateContactRequest', null, global);
goog.exportSymbol('proto.messages.UpdateParticipantsRequest', null, global);
@@ -329,6 +331,27 @@ if (goog.DEBUG && !COMPILED) {
*/
proto.messages.EventJson.displayName = 'proto.messages.EventJson';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.messages.StreamEventsRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.messages.StreamEventsRequest.repeatedFields_, null);
};
goog.inherits(proto.messages.StreamEventsRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.messages.StreamEventsRequest.displayName = 'proto.messages.StreamEventsRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@@ -434,6 +457,27 @@ if (goog.DEBUG && !COMPILED) {
*/
proto.messages.SessionStoreConfig.displayName = 'proto.messages.SessionStoreConfig';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.messages.SessionStorageConfig = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.messages.SessionStorageConfig, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.messages.SessionStorageConfig.displayName = 'proto.messages.SessionStorageConfig';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@@ -3604,6 +3648,213 @@ proto.messages.EventJson.prototype.setData = function(value) {
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.messages.StreamEventsRequest.repeatedFields_ = [2];
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.messages.StreamEventsRequest.prototype.toObject = function(opt_includeInstance) {
return proto.messages.StreamEventsRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.messages.StreamEventsRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.messages.StreamEventsRequest.toObject = function(includeInstance, msg) {
var f, obj = {
session: (f = msg.getSession()) && proto.messages.Session.toObject(includeInstance, f),
excludeList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.messages.StreamEventsRequest}
*/
proto.messages.StreamEventsRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.messages.StreamEventsRequest;
return proto.messages.StreamEventsRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.messages.StreamEventsRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.messages.StreamEventsRequest}
*/
proto.messages.StreamEventsRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = new proto.messages.Session;
reader.readMessage(value,proto.messages.Session.deserializeBinaryFromReader);
msg.setSession(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.addExclude(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.messages.StreamEventsRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.messages.StreamEventsRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.messages.StreamEventsRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.messages.StreamEventsRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getSession();
if (f != null) {
writer.writeMessage(
1,
f,
proto.messages.Session.serializeBinaryToWriter
);
}
f = message.getExcludeList();
if (f.length > 0) {
writer.writeRepeatedString(
2,
f
);
}
};
/**
* optional Session session = 1;
* @return {?proto.messages.Session}
*/
proto.messages.StreamEventsRequest.prototype.getSession = function() {
return /** @type{?proto.messages.Session} */ (
jspb.Message.getWrapperField(this, proto.messages.Session, 1));
};
/**
* @param {?proto.messages.Session|undefined} value
* @return {!proto.messages.StreamEventsRequest} returns this
*/
proto.messages.StreamEventsRequest.prototype.setSession = function(value) {
return jspb.Message.setWrapperField(this, 1, value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.messages.StreamEventsRequest} returns this
*/
proto.messages.StreamEventsRequest.prototype.clearSession = function() {
return this.setSession(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.messages.StreamEventsRequest.prototype.hasSession = function() {
return jspb.Message.getField(this, 1) != null;
};
/**
* repeated string exclude = 2;
* @return {!Array<string>}
*/
proto.messages.StreamEventsRequest.prototype.getExcludeList = function() {
return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2));
};
/**
* @param {!Array<string>} value
* @return {!proto.messages.StreamEventsRequest} returns this
*/
proto.messages.StreamEventsRequest.prototype.setExcludeList = function(value) {
return jspb.Message.setField(this, 2, value || []);
};
/**
* @param {string} value
* @param {number=} opt_index
* @return {!proto.messages.StreamEventsRequest} returns this
*/
proto.messages.StreamEventsRequest.prototype.addExclude = function(value, opt_index) {
return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.messages.StreamEventsRequest} returns this
*/
proto.messages.StreamEventsRequest.prototype.clearExcludeList = function() {
return this.setExcludeList([]);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
@@ -4308,6 +4559,298 @@ proto.messages.SessionStoreConfig.prototype.setAddress = function(value) {
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.messages.SessionStorageConfig.prototype.toObject = function(opt_includeInstance) {
return proto.messages.SessionStorageConfig.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.messages.SessionStorageConfig} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.messages.SessionStorageConfig.toObject = function(includeInstance, msg) {
var f, obj = {
messages: jspb.Message.getBooleanFieldWithDefault(msg, 1, false),
groups: jspb.Message.getBooleanFieldWithDefault(msg, 2, false),
chats: jspb.Message.getBooleanFieldWithDefault(msg, 3, false),
labels: jspb.Message.getBooleanFieldWithDefault(msg, 4, false)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.messages.SessionStorageConfig}
*/
proto.messages.SessionStorageConfig.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.messages.SessionStorageConfig;
return proto.messages.SessionStorageConfig.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.messages.SessionStorageConfig} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.messages.SessionStorageConfig}
*/
proto.messages.SessionStorageConfig.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {boolean} */ (reader.readBool());
msg.setMessages(value);
break;
case 2:
var value = /** @type {boolean} */ (reader.readBool());
msg.setGroups(value);
break;
case 3:
var value = /** @type {boolean} */ (reader.readBool());
msg.setChats(value);
break;
case 4:
var value = /** @type {boolean} */ (reader.readBool());
msg.setLabels(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.messages.SessionStorageConfig.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.messages.SessionStorageConfig.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.messages.SessionStorageConfig} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.messages.SessionStorageConfig.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = /** @type {boolean} */ (jspb.Message.getField(message, 1));
if (f != null) {
writer.writeBool(
1,
f
);
}
f = /** @type {boolean} */ (jspb.Message.getField(message, 2));
if (f != null) {
writer.writeBool(
2,
f
);
}
f = /** @type {boolean} */ (jspb.Message.getField(message, 3));
if (f != null) {
writer.writeBool(
3,
f
);
}
f = /** @type {boolean} */ (jspb.Message.getField(message, 4));
if (f != null) {
writer.writeBool(
4,
f
);
}
};
/**
* optional bool messages = 1;
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.getMessages = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false));
};
/**
* @param {boolean} value
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.setMessages = function(value) {
return jspb.Message.setField(this, 1, value);
};
/**
* Clears the field making it undefined.
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.clearMessages = function() {
return jspb.Message.setField(this, 1, undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.hasMessages = function() {
return jspb.Message.getField(this, 1) != null;
};
/**
* optional bool groups = 2;
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.getGroups = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false));
};
/**
* @param {boolean} value
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.setGroups = function(value) {
return jspb.Message.setField(this, 2, value);
};
/**
* Clears the field making it undefined.
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.clearGroups = function() {
return jspb.Message.setField(this, 2, undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.hasGroups = function() {
return jspb.Message.getField(this, 2) != null;
};
/**
* optional bool chats = 3;
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.getChats = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false));
};
/**
* @param {boolean} value
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.setChats = function(value) {
return jspb.Message.setField(this, 3, value);
};
/**
* Clears the field making it undefined.
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.clearChats = function() {
return jspb.Message.setField(this, 3, undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.hasChats = function() {
return jspb.Message.getField(this, 3) != null;
};
/**
* optional bool labels = 4;
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.getLabels = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
};
/**
* @param {boolean} value
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.setLabels = function(value) {
return jspb.Message.setField(this, 4, value);
};
/**
* Clears the field making it undefined.
* @return {!proto.messages.SessionStorageConfig} returns this
*/
proto.messages.SessionStorageConfig.prototype.clearLabels = function() {
return jspb.Message.setField(this, 4, undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.messages.SessionStorageConfig.prototype.hasLabels = function() {
return jspb.Message.getField(this, 4) != null;
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -4690,7 +5233,8 @@ proto.messages.SessionConfig.toObject = function(includeInstance, msg) {
store: (f = msg.getStore()) && proto.messages.SessionStoreConfig.toObject(includeInstance, f),
log: (f = msg.getLog()) && proto.messages.SessionLogConfig.toObject(includeInstance, f),
proxy: (f = msg.getProxy()) && proto.messages.SessionProxyConfig.toObject(includeInstance, f),
ignore: (f = msg.getIgnore()) && proto.messages.SessionIgnoreJidsConfig.toObject(includeInstance, f)
ignore: (f = msg.getIgnore()) && proto.messages.SessionIgnoreJidsConfig.toObject(includeInstance, f),
storage: (f = msg.getStorage()) && proto.messages.SessionStorageConfig.toObject(includeInstance, f)
};
if (includeInstance) {
@@ -4747,6 +5291,11 @@ proto.messages.SessionConfig.deserializeBinaryFromReader = function(msg, reader)
reader.readMessage(value,proto.messages.SessionIgnoreJidsConfig.deserializeBinaryFromReader);
msg.setIgnore(value);
break;
case 5:
var value = new proto.messages.SessionStorageConfig;
reader.readMessage(value,proto.messages.SessionStorageConfig.deserializeBinaryFromReader);
msg.setStorage(value);
break;
default:
reader.skipField();
break;
@@ -4808,6 +5357,14 @@ proto.messages.SessionConfig.serializeBinaryToWriter = function(message, writer)
proto.messages.SessionIgnoreJidsConfig.serializeBinaryToWriter
);
}
f = message.getStorage();
if (f != null) {
writer.writeMessage(
5,
f,
proto.messages.SessionStorageConfig.serializeBinaryToWriter
);
}
};
@@ -4959,6 +5516,43 @@ proto.messages.SessionConfig.prototype.hasIgnore = function() {
};
/**
* optional SessionStorageConfig storage = 5;
* @return {?proto.messages.SessionStorageConfig}
*/
proto.messages.SessionConfig.prototype.getStorage = function() {
return /** @type{?proto.messages.SessionStorageConfig} */ (
jspb.Message.getWrapperField(this, proto.messages.SessionStorageConfig, 5));
};
/**
* @param {?proto.messages.SessionStorageConfig|undefined} value
* @return {!proto.messages.SessionConfig} returns this
*/
proto.messages.SessionConfig.prototype.setStorage = function(value) {
return jspb.Message.setWrapperField(this, 5, value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.messages.SessionConfig} returns this
*/
proto.messages.SessionConfig.prototype.clearStorage = function() {
return this.setStorage(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.messages.SessionConfig.prototype.hasStorage = function() {
return jspb.Message.getField(this, 5) != null;
};
+40 -8
View File
@@ -124,7 +124,11 @@ import {
WAMessageReaction,
} from '@waha/structures/responses.dto';
import { CallData } from '@waha/structures/calls.dto';
import { MeInfo, ProxyConfig } from '@waha/structures/sessions.dto';
import {
MeInfo,
ProxyConfig,
SessionConfig,
} from '@waha/structures/sessions.dto';
import {
BROADCAST_ID,
DeleteStatusRequest,
@@ -174,8 +178,8 @@ import {
isLabelUpsertEvent,
} from './labels.gows';
import {
GetEventStreamClient,
GetMessageServiceClient,
BuildEventStreamClient,
BuildMessageServiceClient,
} from '@waha/core/engines/gows/clients';
import esm from '@waha/vendor/esm';
import { IsEditedMessage } from '@waha/core/utils/pwa';
@@ -188,6 +192,19 @@ import * as path from 'path';
import MessageServiceClient = messages.MessageServiceClient;
import * as fsp from 'fs/promises';
function getGowsStorageConfig(
sessionConfig?: SessionConfig,
): messages.SessionStorageConfig {
const storeConfig = sessionConfig?.gows?.storage;
return new messages.SessionStorageConfig({
// Only explicit false disables; undefined/null defaults to enabled.
messages: storeConfig?.messages !== false,
groups: storeConfig?.groups !== false,
chats: storeConfig?.chats !== false,
labels: storeConfig?.labels !== false,
});
}
enum WhatsMeowEvent {
CONNECTED = 'gows.ConnectedEventData',
DISCONNECTED = 'events.Disconnected',
@@ -216,6 +233,10 @@ enum WhatsMeowEvent {
CALL_REJECT = 'events.CallReject',
CALL_TERMINATE = 'events.CallTerminate',
CALL_OFFER_NOTICE = 'events.CallOfferNotice',
// Other
APP_STATE = 'events.AppState',
HISTORY_SYNC = 'events.HistorySync',
CONTACT = 'events.Contact',
}
export interface GowsConfig {
@@ -267,6 +288,7 @@ export class WhatsappSessionGoWSCore extends WhatsappSession {
address: auth.address(),
dialect: auth.dialect(),
}),
storage: getGowsStorageConfig(this.sessionConfig),
log: new messages.SessionLogConfig({
level: level ?? messages.LogLevel.INFO,
}),
@@ -282,8 +304,7 @@ export class WhatsappSessionGoWSCore extends WhatsappSession {
}),
});
this.client = GetMessageServiceClient(
this.name,
this.client = BuildMessageServiceClient(
this.engineConfig.connection,
grpc.credentials.createInsecure(),
);
@@ -310,12 +331,23 @@ export class WhatsappSessionGoWSCore extends WhatsappSession {
this.stream$ = new GowsEventStreamObservable(
this.loggerBuilder.child({ grpc: 'stream' }),
() => {
const client = GetEventStreamClient(
this.name,
const client = BuildEventStreamClient(
this.engineConfig.connection,
grpc.credentials.createInsecure(),
);
const stream = client.StreamEvents(this.session);
// Avoid having a lot of events after pairing the device
// https://github.com/devlikeapro/waha/issues/1826
// TODO: we need to make it more dynamic
const exclude = [
WhatsMeowEvent.APP_STATE,
WhatsMeowEvent.HISTORY_SYNC,
WhatsMeowEvent.CONTACT,
];
const request = new messages.StreamEventsRequest({
session: this.session,
exclude: exclude,
});
const stream = client.StreamEvents(request);
return { client, stream };
},
);
+13
View File
@@ -99,6 +99,19 @@ export class WPage extends EventEmitter {
}
}
// removeExposedFunction
async removeExposedFunction(name: string) {
try {
return await this.page.removeExposedFunction(name);
} catch (err) {
this.emit(PAGE_CALL_ERROR_EVENT, {
method: 'removeExposedFunction',
error: err,
});
throw err;
}
}
async reload(options?: any): Promise<any> {
try {
return await this.page.reload(options);
+64
View File
@@ -113,6 +113,55 @@ export class NowebConfig {
markOnline: boolean = true;
}
export class GowsStorageConfig {
@ApiProperty({
description:
'Store messages locally. Set to false to disable; omit or null to keep enabled.',
required: false,
example: true,
})
@IsBoolean()
@IsOptional()
messages?: boolean | null;
@ApiProperty({
description:
'Store groups locally. Set to false to disable; omit or null to keep enabled.',
required: false,
example: true,
})
@IsBoolean()
@IsOptional()
groups?: boolean | null;
@ApiProperty({
description:
'Store chats locally. Set to false to disable; omit or null to keep enabled.',
required: false,
example: true,
})
@IsBoolean()
@IsOptional()
chats?: boolean | null;
@ApiProperty({
description:
'Store labels locally. Set to false to disable; omit or null to keep enabled.',
required: false,
example: true,
})
@IsBoolean()
@IsOptional()
labels?: boolean | null;
}
export class GowsConfig {
@ValidateNested()
@Type(() => GowsStorageConfig)
@IsOptional()
storage?: GowsStorageConfig;
}
export class WebjsConfig {
@ApiProperty({
description:
@@ -241,6 +290,21 @@ export class SessionConfig {
@IsOptional()
noweb?: NowebConfig;
@ApiProperty({
example: {
storage: {
messages: true,
groups: true,
chats: true,
labels: true,
},
},
})
@ValidateNested()
@Type(() => GowsConfig)
@IsOptional()
gows?: GowsConfig;
@ApiProperty({
description: 'WebJS-specific settings.',
required: false,
+1 -1
View File
@@ -44,7 +44,7 @@ function getPlatform() {
}
export const VERSION: WAHAEnvironment = {
version: '2026.1.4',
version: '2026.1.5',
engine: getEngineName(),
tier: getWAHAVersion(),
browser: getBrowser(),
+2 -2
View File
@@ -2,11 +2,11 @@
"waha": {
"gows": {
"repo": "devlikeapro/gows",
"ref": "v1.0.31"
"ref": "v1.0.32"
},
"dashboard": {
"repo": "devlikeapro/dashboard",
"ref": "6923320467747d7abc4e8e336852bc8ef3f992e9"
"ref": "0cf1cb04fcfc878aade2b3c4f85f25f10ed0384f"
}
}
}
+2 -2
View File
@@ -12802,7 +12802,7 @@ __metadata:
"whatsapp-web.js@github:devlikeapro/whatsapp-web.js#fork-main-2025-12-17":
version: 1.34.3
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=47347ab0a148e01daf271a9e8c39b50dbc5c3cb2"
resolution: "whatsapp-web.js@https://github.com/devlikeapro/whatsapp-web.js.git#commit=72ae41eda26b73f50232ef73f8daec5a17bf0265"
dependencies:
"@pedroslopez/moduleraid": "npm:^5.0.2"
archiver: "npm:^5.3.1"
@@ -12820,7 +12820,7 @@ __metadata:
optional: true
unzipper:
optional: true
checksum: 10/fb3bf88719634f1061823d3b3d548007355886d2394f8dbe8bcf1570c70dc09849034cfbe488bdfc3f20807933373ed632e8b2c550198ec41ee1c03a5bdfbe29
checksum: 10/87fa2abf0ac92390ed523d3e750c7cf9974b334e25302b35ed9de32d031dc23b229102db8202d0d2ab7c5aeb9a27e73d9fe2321f4947706af16283338487fec6
languageName: node
linkType: hard