first commit
Some checks failed
Publish NPM Package / Publish Job (push) Failing after 1m34s

This commit is contained in:
lendry
2026-05-21 21:49:32 +03:00
commit fbe3b0327c
48 changed files with 5523 additions and 0 deletions

View File

@@ -0,0 +1,518 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/auth/v1/service.proto
/* eslint-disable */
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { Observable } from "rxjs";
import { Timestamp } from "../../../google/protobuf/timestamp";
import { SubjectContext } from "../../common/v1/authz";
import { PageRequest, PageResponse, RequestMeta } from "../../common/v1/types";
import {
AuthChallenge,
AuthChallengeDeliveryChannel,
AuthChallengePurpose,
DeviceSession,
DeviceSessionStatus,
LoginChallenge,
QrLoginRequest,
SecurityEvent,
TokenPair,
} from "./types";
export const protobufPackage = "glifa.auth.v1";
export interface RegisterRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Уникальное имя пользователя, которое будет использоваться для входа в систему */
username: string;
/** Электронная почта пользователя, которая может использоваться для входа в систему и получения уведомлений */
email: string;
/** Номер телефона пользователя, который может использоваться для входа в систему и получения уведомлений */
phone: string;
/** Пароль пользователя, который будет использоваться для аутентификации при входе в систему */
password: string;
/** Отображаемое имя пользователя, которое будет показываться другим пользователям в системе */
displayName: string;
/** UUID устройства, с которого пользователь регистрируется, для отслеживания и управления сессиями на разных устройствах */
deviceId: string;
/** Человекочитаемое название устройства, с которого пользователь регистрируется (например, "iPhone 12", "Windows PC"), для удобства отображения в интерфейсе управления сессиями */
deviceName: string;
/** Платформа устройства, с которого пользователь регистрируется (например, "iOS", "Android", "Web"), для аналитики и оптимизации работы сессий на разных платформах */
platform: string;
/** Версия приложения, с которого пользователь регистрируется, для аналитики и оптимизации работы сессий на разных версиях приложения */
appVersion: string;
}
export interface RegisterResponse {
/** UUID нового пользователя, который был зарегистрирован */
userId: string;
/** Пара токенов доступа и обновления, которая может быть использована для аутентификации и управления сессиями */
tokens:
| TokenPair
| undefined;
/** Данные о сессии, которая была создана для нового пользователя на устройстве, с которого он регистрировался */
session: DeviceSession | undefined;
}
export interface LoginWithPasswordRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Имя пользователя, электронная почта или номер телефона, которые пользователь использует для входа в систему */
login: string;
/** Пароль пользователя, который будет использоваться для аутентификации при входе в систему */
password: string;
/** UUID устройства, с которого пользователь входит в систему, для отслеживания и управления сессиями на разных устройствах */
deviceId: string;
/** Человекочитаемое название устройства, с которого пользователь входит в систему (например, "iPhone 12", "Windows PC"), для удобства отображения в интерфейсе управления сессиями */
deviceName: string;
/** Платформа устройства, с которого пользователь входит в систему (например, "iOS", "Android", "Web"), для аналитики и оптимизации работы сессий на разных платформах */
platform: string;
/** Версия приложения, с которого пользователь входит в систему, для аналитики и оптимизации работы сессий на разных версиях приложения */
appVersion: string;
}
export interface LoginWithPasswordResponse {
/** Пара токенов доступа и обновления, которая может быть использована для аутентификации и управления сессиями, если вход выполнен успешно */
tokens?:
| TokenPair
| undefined;
/** Данные о вызове второго фактора аутентификации, если он требуется для входа в систему */
secondFactorRequired?:
| LoginChallenge
| undefined;
/** Данные о сессии, которая была создана для пользователя на устройстве, с которого он входит в систему (может быть полезно для отображения информации о текущей сессии в интерфейсе управления сессиями) */
session: DeviceSession | undefined;
}
export interface VerifySecondFactorRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID вызова второго фактора аутентификации, который был возвращен при попытке входа в систему */
loginChallengeId: string;
/** TOTP-код, который пользователь сгенерировал в своем приложении для аутентификации (например, Google Authenticator), для подтверждения второго фактора аутентификации */
totpCode: string;
/** Код восстановления, который пользователь получил при настройке второго фактора аутентификации, для подтверждения второго фактора аутентификации в случае, если TOTP-коды недоступны */
recoveryCode: string;
}
export interface VerifySecondFactorResponse {
/** Пара токенов доступа и обновления, которая может быть использована для аутентификации и управления сессиями, если второй фактор аутентификации был успешно подтвержден */
tokens:
| TokenPair
| undefined;
/** Данные о сессии, которая была создана для пользователя на устройстве, с которого он входит в систему (может быть полезно для отображения информации о текущей сессии в интерфейсе управления сессиями) */
session: DeviceSession | undefined;
}
export interface RefreshSessionRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Токен обновления, который был выдан при аутентификации и может быть использован для получения новой пары токенов доступа и обнов */
refreshToken: string;
}
export interface RefreshSessionResponse {
/** Новая пара токенов доступа и обновления, которая может быть использована для аутентификации и управления сессиями, если токен обновления был успешно подтвержден */
tokens:
| TokenPair
| undefined;
/** Данные о сессии, которая была обновлена для пользователя на устройстве, с которого он входит в систему (может быть полезно для отображения информации о текущей сессии в интерфейсе управления сессиями) */
session:
| DeviceSession
| undefined;
/** Флаг, указывающий, была ли выполнена ротация всей семьи токенов (т.е. были ли отозваны все другие активные сессии пользователя), что может быть полезно для безопасности и управления сессиями */
familyRotated: boolean;
}
export interface LogoutSessionRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID сессии, которую пользователь хочет завершить (например, текущая сессия или другая активная сессия на другом устройстве) */
sessionId: string;
}
export interface LogoutSessionResponse {
/** Флаг, указывающий, была ли сессия успешно завершена */
success: boolean;
}
export interface RevokeSessionRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID сессии, которую пользователь хочет отозвать (например, текущая сессия или другая активная сессия на другом устройстве) */
sessionId: string;
/** Причина отзыва сессии, которая может быть полезна для аудита и безопасности (например, "user_logout", "password_change", "suspicious_activity") */
reason: string;
}
export interface RevokeSessionResponse {
/** Данные о сессии, которая была отозвана, включая ее статус и метаданные, что может быть полезно для отображения информации о сессиях в интерфейсе управления сессиями */
session: DeviceSession | undefined;
}
export interface LockSessionRequest {
meta: RequestMeta | undefined;
sessionId: string;
reason: string;
}
export interface LockSessionResponse {
session: DeviceSession | undefined;
}
export interface UnlockSessionRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID сессии, которую пользователь хочет разблок */
sessionId: string;
/** Пароль пользователя, который будет использоваться для подтверждения личности при разблокировке сессии */
password?:
| string
| undefined;
/** UUID вызова аутентификационного челленджа, который был отправлен пользователю для подтверждения личности при разблокировке сессии */
challengeId?:
| string
| undefined;
/** Код из аутентификационного челленджа, который пользователь получил и должен предоставить для подтверждения личности при разблокировке сессии */
code: string;
}
export interface UnlockSessionResponse {
/** Данные о сессии, которая была разблокирована, включая ее статус и метаданные, что может быть полезно для отображения информации о сессиях в интерфейсе управления сессиями */
session:
| DeviceSession
| undefined;
/** Пара токенов доступа и обновления, которая может быть использована для аутентификации и управления сессиями, если разблокировка сессии была успешно подтверждена */
tokens: TokenPair | undefined;
}
export interface ValidateAccessTokenRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Токен доступа, который нужно проверить на валидность и получить связанную с ним информацию о сессии и правах доступа */
accessToken: string;
}
export interface ValidateAccessTokenResponse {
/** Флаг, указывающий, является ли токен доступа валидным (т.е. не истекшим, не отозванным и правильно подписанным) */
valid: boolean;
/** UUID пользователя, которому принадлежит этот токен доступа, если он валиден */
userId: string;
/** UUID сессии, с которой связан этот ток */
sessionId: string;
/** UUID устройства, с которого был выдан этот токен доступа, если он валиден */
deviceId: string;
/** Версия токена, которая может быть полезна для управления ротацией токенов и обеспечения безопасности */
tokenVersion: number;
/** Временная метка истечения срока действия токена доступа, которая может быть полезна для управления сессиями и обеспечения безопасности */
expiresAt:
| Timestamp
| undefined;
/** Статус сессии, с которой связан этот токен доступа (например, "active", "locked", "revoked"), который может быть полезен для управления сессиями и обеспечения безопасности */
sessionStatus: DeviceSessionStatus;
/** Контекст субъекта, связанный с этим токеном доступа, который может включать информацию о ролях и правах доступа пользователя для авторизации при доступе к ресурсам системы */
subject: SubjectContext | undefined;
}
export interface GetSessionRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID сессии, которую пользователь хочет получить */
sessionId: string;
}
export interface GetSessionResponse {
/** Данные о запрошенной сессии, включая ее статус и метаданные, что может быть полезно для отображения информации о сессиях в интерфейсе управления сессиями */
session: DeviceSession | undefined;
}
export interface ListSessionsRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID пользователя, для которого нужно получить список сессий */
userId: string;
}
export interface ListSessionsResponse {
/** Список сессий, связанных с указанным пользователем, включая их статус и метаданные, что может быть полезно для отображения информации о сессиях в интерфейсе управления сессиями */
sessions: DeviceSession[];
}
export interface CreateQrLoginRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID устройства, с которого пользователь инициирует QR-вход, для отслеживания и управления сессиями на разных устройствах */
deviceId: string;
/** Человекочитаемое название устройства, с которого пользователь инициирует QR-вход (например, "iPhone 12", "Windows PC"), для удобства отображения в интерфейсе управления сессиями */
deviceName: string;
/** Платформа устройства, с которого пользователь инициирует QR-вход (например, "iOS", "Android", "Web"), для аналитики и оптимизации работы сессий на разных */
platform: string;
/** Версия приложения, с которого пользователь инициирует QR-вход, для аналитики и оптимизации работы сессий на разных версиях приложения */
appVersion: string;
}
export interface CreateQrLoginResponse {
/** Данные о созданном QR-запросе, включая его UUID и время истечения срока действия, которые могут быть использованы для отображения QR-кода и управления процессом QR-входа */
request:
| QrLoginRequest
| undefined;
/** Строка, которая может быть сериализована в QR-код и содержит информацию, необходимую для выполнения QR-входа (например, UUID запроса и URL для обмена данными между устройствами) */
qrPayload: string;
}
export interface ApproveQrLoginRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID QR-запроса, который пользователь хочет одобрить для выполнения QR-входа */
requestId: string;
}
export interface ApproveQrLoginResponse {
/** Данные о QR-запросе, который был одобрен, включая его UUID и время истечения срока действия, которые могут быть использованы для управления процессом QR-входа */
request: QrLoginRequest | undefined;
}
export interface ExchangeQrLoginRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID QR-запроса, который был одобрен и для которого пользователь хочет получить токены доступа и обновления для выполнения QR-входа */
requestId: string;
/** Доказательство, которое может быть предоставлено пользователем для подтверждения своей личности при обмене QR-запроса на токены доступа и обновления (например, код из аутентификационного челленджа или другой механизм подтверждения) */
proof: string;
}
export interface ExchangeQrLoginResponse {
/** Пара токенов доступа и обновления, которая может быть использована для аутентификации и управления сессиями, если обмен QR-запроса был успешно подтвержден */
tokens:
| TokenPair
| undefined;
/** Данные о сессии, которая была создана для пользователя на устройстве, с которого он выполняет QR-вход (может быть полезно для отображения информации о текущей сессии в интерфейсе управления сессиями) */
session: DeviceSession | undefined;
}
export interface SendAuthChallengeRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Цель, на которую должен быть отправлен аутентификационный челлендж (например, электронная почта или номер телефона пользователя) */
target: string;
/** Цель аутентификационного челленджа, которая может быть полезна для определения типа и содержания челленджа (например, "login", "unlock_session", "verify_identity") */
purpose: AuthChallengePurpose;
/** Канал доставки аутентификационного челленджа, который может быть полезен для оптимизации процесса доставки и обеспечения безопасности (например, "email", "sms", "push_notification") */
deliveryChannel: AuthChallengeDeliveryChannel;
}
export interface SendAuthChallengeResponse {
/** Данные о созданном аутентификационном челлендже, включая его UUID, код и время истечения срока действия, которые могут быть использованы для подтверждения личности пользователя при выполнении различных действий в системе */
challenge: AuthChallenge | undefined;
}
export interface VerifyAuthChallengeRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID аутентификационного челленджа, который был отправлен пользователю и который он предоставляет для подтверждения своей личности */
challengeId: string;
/** Код из аутентификационного челленджа, который пользователь получил и должен предоставить для подтверждения своей личности */
code: string;
}
export interface VerifyAuthChallengeResponse {
/** Данные о аутентификационном челлендже, который был успешно подтвержден, включая его UUID и время истечения срока действия, которые могут быть использованы для управления процессом подтверждения личности пользователя при выполнении различных действий в системе */
challenge:
| AuthChallenge
| undefined;
/** Флаг, указывающий, был ли аутентификационный челлендж успешно подтвержден, что может быть полезно для управления процессом подтверждения личности пользователя при выполнении различных действий в системе */
verified: boolean;
}
export interface ListSecurityEventsRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID пользователя, для которого нужно получить список событий безопасности */
userId: string;
/** Параметры пагинации (номер страницы и размер страницы) */
page: PageRequest | undefined;
}
export interface ListSecurityEventsResponse {
/** Список событий безопасности, связанных с указанным пользователем, включая их тип, время и метаданные, что может быть полезно для отображения информации о безопасности в интерфейсе управления сессиями и обеспечения безопасности */
events: SecurityEvent[];
/** Информация о пагинации (номер страницы, размер страницы, общее количество элементов) для списка событий безопасности, что может быть полезно для отображения информации о безопасности в интерфейсе управления сессиями и обеспечения безопасности */
page: PageResponse | undefined;
}
export const GLIFA_AUTH_V1_PACKAGE_NAME = "glifa.auth.v1";
export interface AuthServiceClient {
register(request: RegisterRequest): Observable<RegisterResponse>;
loginWithPassword(request: LoginWithPasswordRequest): Observable<LoginWithPasswordResponse>;
verifySecondFactor(request: VerifySecondFactorRequest): Observable<VerifySecondFactorResponse>;
refreshSession(request: RefreshSessionRequest): Observable<RefreshSessionResponse>;
logoutSession(request: LogoutSessionRequest): Observable<LogoutSessionResponse>;
revokeSession(request: RevokeSessionRequest): Observable<RevokeSessionResponse>;
lockSession(request: LockSessionRequest): Observable<LockSessionResponse>;
unlockSession(request: UnlockSessionRequest): Observable<UnlockSessionResponse>;
validateAccessToken(request: ValidateAccessTokenRequest): Observable<ValidateAccessTokenResponse>;
getSession(request: GetSessionRequest): Observable<GetSessionResponse>;
listSessions(request: ListSessionsRequest): Observable<ListSessionsResponse>;
createQrLogin(request: CreateQrLoginRequest): Observable<CreateQrLoginResponse>;
approveQrLogin(request: ApproveQrLoginRequest): Observable<ApproveQrLoginResponse>;
exchangeQrLogin(request: ExchangeQrLoginRequest): Observable<ExchangeQrLoginResponse>;
sendAuthChallenge(request: SendAuthChallengeRequest): Observable<SendAuthChallengeResponse>;
verifyAuthChallenge(request: VerifyAuthChallengeRequest): Observable<VerifyAuthChallengeResponse>;
listSecurityEvents(request: ListSecurityEventsRequest): Observable<ListSecurityEventsResponse>;
}
export interface AuthServiceController {
register(request: RegisterRequest): Promise<RegisterResponse> | Observable<RegisterResponse> | RegisterResponse;
loginWithPassword(
request: LoginWithPasswordRequest,
): Promise<LoginWithPasswordResponse> | Observable<LoginWithPasswordResponse> | LoginWithPasswordResponse;
verifySecondFactor(
request: VerifySecondFactorRequest,
): Promise<VerifySecondFactorResponse> | Observable<VerifySecondFactorResponse> | VerifySecondFactorResponse;
refreshSession(
request: RefreshSessionRequest,
): Promise<RefreshSessionResponse> | Observable<RefreshSessionResponse> | RefreshSessionResponse;
logoutSession(
request: LogoutSessionRequest,
): Promise<LogoutSessionResponse> | Observable<LogoutSessionResponse> | LogoutSessionResponse;
revokeSession(
request: RevokeSessionRequest,
): Promise<RevokeSessionResponse> | Observable<RevokeSessionResponse> | RevokeSessionResponse;
lockSession(
request: LockSessionRequest,
): Promise<LockSessionResponse> | Observable<LockSessionResponse> | LockSessionResponse;
unlockSession(
request: UnlockSessionRequest,
): Promise<UnlockSessionResponse> | Observable<UnlockSessionResponse> | UnlockSessionResponse;
validateAccessToken(
request: ValidateAccessTokenRequest,
): Promise<ValidateAccessTokenResponse> | Observable<ValidateAccessTokenResponse> | ValidateAccessTokenResponse;
getSession(
request: GetSessionRequest,
): Promise<GetSessionResponse> | Observable<GetSessionResponse> | GetSessionResponse;
listSessions(
request: ListSessionsRequest,
): Promise<ListSessionsResponse> | Observable<ListSessionsResponse> | ListSessionsResponse;
createQrLogin(
request: CreateQrLoginRequest,
): Promise<CreateQrLoginResponse> | Observable<CreateQrLoginResponse> | CreateQrLoginResponse;
approveQrLogin(
request: ApproveQrLoginRequest,
): Promise<ApproveQrLoginResponse> | Observable<ApproveQrLoginResponse> | ApproveQrLoginResponse;
exchangeQrLogin(
request: ExchangeQrLoginRequest,
): Promise<ExchangeQrLoginResponse> | Observable<ExchangeQrLoginResponse> | ExchangeQrLoginResponse;
sendAuthChallenge(
request: SendAuthChallengeRequest,
): Promise<SendAuthChallengeResponse> | Observable<SendAuthChallengeResponse> | SendAuthChallengeResponse;
verifyAuthChallenge(
request: VerifyAuthChallengeRequest,
): Promise<VerifyAuthChallengeResponse> | Observable<VerifyAuthChallengeResponse> | VerifyAuthChallengeResponse;
listSecurityEvents(
request: ListSecurityEventsRequest,
): Promise<ListSecurityEventsResponse> | Observable<ListSecurityEventsResponse> | ListSecurityEventsResponse;
}
export function AuthServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = [
"register",
"loginWithPassword",
"verifySecondFactor",
"refreshSession",
"logoutSession",
"revokeSession",
"lockSession",
"unlockSession",
"validateAccessToken",
"getSession",
"listSessions",
"createQrLogin",
"approveQrLogin",
"exchangeQrLogin",
"sendAuthChallenge",
"verifyAuthChallenge",
"listSecurityEvents",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("AuthService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("AuthService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const AUTH_SERVICE_NAME = "AuthService";

288
gen/glifa/auth/v1/types.ts Normal file
View File

@@ -0,0 +1,288 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/auth/v1/types.proto
/* eslint-disable */
import { Timestamp } from "../../../google/protobuf/timestamp";
export const protobufPackage = "glifa.auth.v1";
export enum DeviceSessionStatus {
/** DEVICE_SESSION_STATUS_UNSPECIFIED - Неопределенный статус сессии устройства */
DEVICE_SESSION_STATUS_UNSPECIFIED = 0,
/** DEVICE_SESSION_STATUS_ACTIVE - Сессия устройства активна и используется */
DEVICE_SESSION_STATUS_ACTIVE = 1,
/** DEVICE_SESSION_STATUS_LOCKED - Сессия устройства заблокирована (например, из-за подозрительной активности) */
DEVICE_SESSION_STATUS_LOCKED = 2,
/** DEVICE_SESSION_STATUS_REQUIRES_2FA - Сессия устройства требует двухфакторной аутентификации для продолжения */
DEVICE_SESSION_STATUS_REQUIRES_2FA = 3,
/** DEVICE_SESSION_STATUS_REQUIRES_REAUTH - Сессия устройства требует повторной аутентификации (например, после длительного периода неактивности) */
DEVICE_SESSION_STATUS_REQUIRES_REAUTH = 4,
/** DEVICE_SESSION_STATUS_REVOKED - Сессия устройства отозвана (например, из-за нарушения безопасности) */
DEVICE_SESSION_STATUS_REVOKED = 5,
/** DEVICE_SESSION_STATUS_EXPIRED - Сессия устройства истекла (например, после определенного периода времени) */
DEVICE_SESSION_STATUS_EXPIRED = 6,
/** DEVICE_SESSION_STATUS_COMPROMISED - Сессия устройства скомпрометирована (например, обнаружена утечка учетных данных) */
DEVICE_SESSION_STATUS_COMPROMISED = 7,
UNRECOGNIZED = -1,
}
export enum AuthChallengePurpose {
/** AUTH_CHALLENGE_PURPOSE_UNSPECIFIED - Неопределенная цель аутентификационного вызова */
AUTH_CHALLENGE_PURPOSE_UNSPECIFIED = 0,
/** AUTH_CHALLENGE_PURPOSE_LOGIN - Вызов для аутентификации при входе в систему */
AUTH_CHALLENGE_PURPOSE_LOGIN = 1,
/** AUTH_CHALLENGE_PURPOSE_PASSWORD_RESET - Вызов для аутентификации при сбросе пароля */
AUTH_CHALLENGE_PURPOSE_PASSWORD_RESET = 2,
/** AUTH_CHALLENGE_PURPOSE_EMAIL_VERIFICATION - Вызов для аутентификации при подтверждении электронной почты */
AUTH_CHALLENGE_PURPOSE_EMAIL_VERIFICATION = 3,
/** AUTH_CHALLENGE_PURPOSE_PHONE_VERIFICATION - Вызов для аутентификации при подтверждении номера телефона */
AUTH_CHALLENGE_PURPOSE_PHONE_VERIFICATION = 4,
/** AUTH_CHALLENGE_PURPOSE_SESSION_UNLOCK - Вызов для аутентификации при разблокировке сессии */
AUTH_CHALLENGE_PURPOSE_SESSION_UNLOCK = 5,
/** AUTH_CHALLENGE_PURPOSE_REAUTH - Вызов для аутентификации при повторной аутентификации (например, после длительного периода неактивности) */
AUTH_CHALLENGE_PURPOSE_REAUTH = 6,
/** AUTH_CHALLENGE_PURPOSE_QR_APPROVAL - Вызов для аутентификации при одобрении входа через QR-код на другом устройстве */
AUTH_CHALLENGE_PURPOSE_QR_APPROVAL = 7,
UNRECOGNIZED = -1,
}
export enum AuthChallengeDeliveryChannel {
/** AUTH_CHALLENGE_DELIVERY_CHANNEL_UNSPECIFIED - Неопределенный канал доставки аутентификационного вызова */
AUTH_CHALLENGE_DELIVERY_CHANNEL_UNSPECIFIED = 0,
/** AUTH_CHALLENGE_DELIVERY_CHANNEL_EMAIL - Канал доставки - электронная почта */
AUTH_CHALLENGE_DELIVERY_CHANNEL_EMAIL = 1,
/** AUTH_CHALLENGE_DELIVERY_CHANNEL_SMS - Канал доставки - SMS */
AUTH_CHALLENGE_DELIVERY_CHANNEL_SMS = 2,
/** AUTH_CHALLENGE_DELIVERY_CHANNEL_TOTP - Канал доставки - TOTP (например, Google Authenticator) */
AUTH_CHALLENGE_DELIVERY_CHANNEL_TOTP = 3,
/** AUTH_CHALLENGE_DELIVERY_CHANNEL_INTERNAL - Канал доставки - внутренний (например, push-уведомление в мобильном приложении) */
AUTH_CHALLENGE_DELIVERY_CHANNEL_INTERNAL = 4,
UNRECOGNIZED = -1,
}
export enum AuthChallengeType {
/** AUTH_CHALLENGE_TYPE_UNSPECIFIED - Неопределенный тип аутентификационного вызова */
AUTH_CHALLENGE_TYPE_UNSPECIFIED = 0,
/** AUTH_CHALLENGE_TYPE_CODE - Вызов с кодом подтверждения (например, 6-значный код из SMS или TOTP) */
AUTH_CHALLENGE_TYPE_CODE = 1,
/** AUTH_CHALLENGE_TYPE_LINK - Вызов с ссылкой для подтверждения (например, magic link в электронной почте) */
AUTH_CHALLENGE_TYPE_LINK = 2,
/** AUTH_CHALLENGE_TYPE_TOTP - Вызов с TOTP (например, код из Google Authenticator) */
AUTH_CHALLENGE_TYPE_TOTP = 3,
/** AUTH_CHALLENGE_TYPE_APPROVAL - Вызов с запросом на одобрение (например, push-уведомление для одобрения входа на другом устройстве) */
AUTH_CHALLENGE_TYPE_APPROVAL = 4,
UNRECOGNIZED = -1,
}
export enum AuthChallengeStatus {
/** AUTH_CHALLENGE_STATUS_UNSPECIFIED - Неопределенный статус аутентификационного вызова */
AUTH_CHALLENGE_STATUS_UNSPECIFIED = 0,
/** AUTH_CHALLENGE_STATUS_PENDING - Вызов создан и ожидает подтверждения пользователем */
AUTH_CHALLENGE_STATUS_PENDING = 1,
/** AUTH_CHALLENGE_STATUS_VERIFIED - Вызов успешно подтвержден пользователем */
AUTH_CHALLENGE_STATUS_VERIFIED = 2,
/** AUTH_CHALLENGE_STATUS_CONSUMED - Вызов уже был использован для подтверждения и больше не действителен */
AUTH_CHALLENGE_STATUS_CONSUMED = 3,
/** AUTH_CHALLENGE_STATUS_EXPIRED - Вызов истек и больше не действителен (например, после определенного периода времени) */
AUTH_CHALLENGE_STATUS_EXPIRED = 4,
/** AUTH_CHALLENGE_STATUS_BLOCKED - Вызов заблокирован (например, из-за подозрительной активности) */
AUTH_CHALLENGE_STATUS_BLOCKED = 5,
UNRECOGNIZED = -1,
}
export enum QrLoginRequestStatus {
/** QR_LOGIN_REQUEST_STATUS_UNSPECIFIED - Неопределенный статус запроса на вход через QR-код */
QR_LOGIN_REQUEST_STATUS_UNSPECIFIED = 0,
/** QR_LOGIN_REQUEST_STATUS_PENDING - Запрос на вход через QR-код создан и ожидает сканирования пользователем */
QR_LOGIN_REQUEST_STATUS_PENDING = 1,
/** QR_LOGIN_REQUEST_STATUS_APPROVED - Запрос на вход через QR-код одобрен пользователем (например, через мобильное приложение) */
QR_LOGIN_REQUEST_STATUS_APPROVED = 2,
/** QR_LOGIN_REQUEST_STATUS_CONSUMED - Запрос на вход через QR-код уже был использован для входа и больше не действителен */
QR_LOGIN_REQUEST_STATUS_CONSUMED = 3,
/** QR_LOGIN_REQUEST_STATUS_EXPIRED - Запрос на вход через QR-код истек и больше не действителен (например, после определенного периода времени) */
QR_LOGIN_REQUEST_STATUS_EXPIRED = 4,
/** QR_LOGIN_REQUEST_STATUS_REJECTED - Запрос на вход через QR-код отклонен пользователем (например, через мобильное приложение) */
QR_LOGIN_REQUEST_STATUS_REJECTED = 5,
UNRECOGNIZED = -1,
}
export enum SecurityEventType {
/** SECURITY_EVENT_TYPE_UNSPECIFIED - Неопределенный тип события безопасности */
SECURITY_EVENT_TYPE_UNSPECIFIED = 0,
/** SECURITY_EVENT_TYPE_LOGIN_SUCCESS - Событие успешного входа в систему */
SECURITY_EVENT_TYPE_LOGIN_SUCCESS = 1,
/** SECURITY_EVENT_TYPE_LOGIN_FAILED - Событие неудачного входа в систему (например, из-за неправильного пароля) */
SECURITY_EVENT_TYPE_LOGIN_FAILED = 2,
/** SECURITY_EVENT_TYPE_CHALLENGE_SEND - Событие отправки аутентификационного вызова пользователю (например, отправка SMS с кодом подтверждения) */
SECURITY_EVENT_TYPE_CHALLENGE_SEND = 3,
/** SECURITY_EVENT_TYPE_CHALLENGE_VERIFIED - Событие успешного подтверждения аутентификационного вызова пользователем (например, пользователь ввел правильный код подтверждения) */
SECURITY_EVENT_TYPE_CHALLENGE_VERIFIED = 4,
/** SECURITY_EVENT_TYPE_TWO_FACTOR_ENABLED - Событие включения двухфакторной аутентификации пользователем */
SECURITY_EVENT_TYPE_TWO_FACTOR_ENABLED = 5,
/** SECURITY_EVENT_TYPE_TWO_FACTOR_DISABLED - Событие отключения двухфакторной аутентификации пользователем */
SECURITY_EVENT_TYPE_TWO_FACTOR_DISABLED = 6,
/** SECURITY_EVENT_TYPE_SESSION_CREATED - Событие создания новой сессии пользователя */
SECURITY_EVENT_TYPE_SESSION_CREATED = 7,
/** SECURITY_EVENT_TYPE_SESSION_LOCKED - Событие блокировки сессии пользователя (например, из-за подозрительной активности) */
SECURITY_EVENT_TYPE_SESSION_LOCKED = 8,
/** SECURITY_EVENT_TYPE_SESSION_UNLOCKED - Событие разблокировки сессии пользователя (например, после успешной аутентификации) */
SECURITY_EVENT_TYPE_SESSION_UNLOCKED = 9,
/** SECURITY_EVENT_TYPE_SESSION_REVOKED - Событие отзыва сессии пользователя (например, из-за нарушения безопасности) */
SECURITY_EVENT_TYPE_SESSION_REVOKED = 10,
/** SECURITY_EVENT_TYPE_SESSION_COMPROMISED - Событие компрометации сессии пользователя (например, обнаружена утечка учетных данных) */
SECURITY_EVENT_TYPE_SESSION_COMPROMISED = 11,
/** SECURITY_EVENT_TYPE_QR_APPROVED - Событие одобрения входа через QR-код на другом устройстве */
SECURITY_EVENT_TYPE_QR_APPROVED = 12,
/** SECURITY_EVENT_TYPE_QR_CONSUMED - Событие использования запроса на вход через QR-код для входа в систему */
SECURITY_EVENT_TYPE_QR_CONSUMED = 13,
/** SECURITY_EVENT_TYPE_QR_EXPIRED - Событие истечения срока действия запроса на вход через QR-код */
SECURITY_EVENT_TYPE_QR_EXPIRED = 14,
UNRECOGNIZED = -1,
}
export interface DeviceSession {
/** UUID сессии устройства */
id: string;
/** UUID пользователя, которому принадлежит сессия устройства */
userId: string;
/** UUID устройства, с которого была создана сесс */
deviceId: string;
/** Человеко-читаемое имя устройства (например, "iPhone 12 Pro") */
deviceName: string;
/** Платформа устройства (например, "iOS", "Android", "Web") */
platform: string;
/** Версия приложения, с которого была создана сессия устройства */
appVersion: string;
/** Статус сессии устройства */
status: DeviceSessionStatus;
/** Последний IP-адрес, с которого была активна сессия устройства */
lastIp: string;
/** User-Agent устройства, с которого была создана сессия */
userAgent: string;
/** Время последней активности сессии устройства */
lastSeenAt:
| Timestamp
| undefined;
/** Время, когда сессия устройства была мягко заблокирована (например, из-за подозрительной активности, но еще не отозвана) */
softLockAt:
| Timestamp
| undefined;
/** Время истечения срока действия сессии устройства (например, после определенного периода времени неактивности) */
expiresAt:
| Timestamp
| undefined;
/** Время создания сессии устройства */
createdAt:
| Timestamp
| undefined;
/** Время последнего обновления сессии устройства */
updatedAt: Timestamp | undefined;
}
export interface TokenPair {
/** JWT access token для аутентификации API-запросов */
accessToken: string;
/** Время истечения срока действия access token */
accessTokenExpiresAt:
| Timestamp
| undefined;
/** JWT refresh token для получения нового access token после истечения срока действия */
refreshToken: string;
/** Время истечения срока действия refresh token (например, через 30 дней) */
refreshTokenExpiresAt:
| Timestamp
| undefined;
/** UUID сессии, для которой был выдан токен */
sessionId: string;
/** UUID пользователя, которому принадлежит сессия и токен */
userId: string;
}
export interface LoginChallenge {
/** UUID аутентификационного вызова, который может быть использован для отслеживания и управления процессом аутентификации */
challengeId: string;
/** Временная метка, указывающая, когда этот аутентификационный вызов истекает и больше не может быть использован для подтверждения входа */
expiresAt: Timestamp | undefined;
}
export interface AuthChallenge {
/** UUID аутентификационного вызова */
id: string;
/** Цель аутентификационного вызова (например, "login", "password_reset") */
target: string;
/** Цель аутентификационного вызова (например, "login", "password_reset") */
purpose: AuthChallengePurpose;
/** Канал доставки аутентификационного вызова (например, "email", "sms") */
deliveryChannel: AuthChallengeDeliveryChannel;
/** Тип аутентификационного вызова (например, "code", "link") */
challengeType: AuthChallengeType;
/** Статус аутентификационного вызова (например, "pending", "verified") */
status: AuthChallengeStatus;
/** Количество попыток подтверждения аутентификационного вызова */
attemptCount: number;
/** Количество повторных отправок аутентификационного вызова */
resendCount: number;
/** Максимально допустимое количество попыток подтверждения аутентификационного вызова (например, 5) */
maxAttempts: number;
/** Время истечения срока действия аутентификационного вызова (например, через 10 минут) */
expiresAt:
| Timestamp
| undefined;
/** Время, когда аутентификационный вызов был успешно подтвержден и использован */
consumedAt:
| Timestamp
| undefined;
/** Время создания аутентификационного вызова */
createdAt:
| Timestamp
| undefined;
/** Время последнего обновления аутентификационного вызова (например, при каждой попытке подтверждения или повторной отправке) */
updatedAt: Timestamp | undefined;
}
export interface QrLoginRequest {
/** UUID запроса на вход через QR-код */
requestId: string;
/** Случайная строка для обеспечения безопасности QR-кода */
nonce: string;
/** Статус запроса на вход через QR-код (например, "pending", "approved") */
status: QrLoginRequestStatus;
/** Время истечения срока действия запроса на вход через QR-код (например, через 5 минут) */
expiresAt:
| Timestamp
| undefined;
/** Время, когда запрос на вход через QR-код был одобрен пользователем (например, через мобильное приложение) */
approvedAt:
| Timestamp
| undefined;
/** Время, когда запрос на вход через QR-код был использован для входа в систему */
consumedAt:
| Timestamp
| undefined;
/** Время создания запроса на вход через QR-код */
createdAt: Timestamp | undefined;
}
export interface SecurityEvent {
/** UUID события безопасности */
id: string;
/** UUID пользователя, которому относится событие безопасности */
userId: string;
/** UUID сессии, если событие безопасности связано с конкретной сессией пользователя */
sessionId: string;
/** Тип события безопасности (например, "login_success", "challenge_verified") */
eventType: SecurityEventType;
/** IP-адрес, с которого произошло событие безопасности */
ipAddress: string;
/** User-Agent, с которого произошло событие безопасности */
userAgent: string;
/** Дополнительные детали события безопасности в формате JSON (например, информация о вызове аутентификационного вызова, который был подтвержден) */
detailsJson: string;
/** Время создания события безопасности */
createdAt: Timestamp | undefined;
}
export const GLIFA_AUTH_V1_PACKAGE_NAME = "glifa.auth.v1";

View File

@@ -0,0 +1,307 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/channel/v1/service.proto
/* eslint-disable */
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { wrappers } from "protobufjs";
import { Observable } from "rxjs";
import { Struct } from "../../../google/protobuf/struct";
import { MessageContentType } from "../../common/v1/enums";
import { PageRequest, PageResponse, RequestMeta } from "../../common/v1/types";
import { Channel, ChannelPost, ChannelReadOffset, ChannelSubscriber } from "./types";
export const protobufPackage = "glifa.channel.v1";
export interface CreateChannelRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID пользователя, который создает канал */
ownerUserId: string;
/** Уникальный идентификатор канала (например, "general", "random") */
handle: string;
/** Название канала */
title: string;
/** Описание канала */
description: string;
/** Флаг, указывающий, является ли канал приватным (только по приглашениям) */
isPrivate: boolean;
}
export interface CreateChannelResponse {
/** Данные созданного канала */
channel: Channel | undefined;
}
export interface GetChannelRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID пользователя, который создал канал */
ownerUserId: string;
/** Уникальный идентификатор канала (например, "general", "random") */
handle: string;
/** Название канала */
title: string;
/** Описание канала */
description: string;
/** Флаг, указывающий, является ли канал приватным (только по приглашениям) */
isPrivate: boolean;
}
export interface GetChannelResponse {
/** Данные запрошенного канала */
channel: Channel | undefined;
}
export interface SubscribeRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID канала, в который пользователь хочет подписаться */
channelId: string;
/** UUID пользователя, который хочет подписаться на канал */
userId: string;
}
export interface SubscribeResponse {
/** Данные о новом подписчике канала */
subscriber: ChannelSubscriber | undefined;
}
export interface UnsubscribeRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID канала, из которого пользователь хочет отписаться */
channelId: string;
/** UUID пользователя, который хочет отписаться от канала */
userId: string;
}
export interface UnsubscribeResponse {
/** Флаг, указывающий, была ли операция отписки успешной */
success: boolean;
}
export interface CreatePostRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID канала, в котором пользователь хочет создать пост */
channelId: string;
/** Идентификатор поста, сгенерированный на клиенте (для обеспечения идемпотентности при повторной отправке) */
clientPostId: string;
/** Тип контента поста (например, "text", "image", "file") */
messageType: MessageContentType;
/** Текст поста (если message_type == "text") */
text: string;
/** UUID файла, прикрепленного к посту (если message_type == "file") */
fileId: string;
/** Дополнительные метаданные поста в виде произвольной JSON-структуры (например, для хранения информации о медиа-контенте) */
metadata: { [key: string]: any } | undefined;
}
export interface CreatePostResponse {
/** Данные созданного поста */
post: ChannelPost | undefined;
}
export interface EditPostRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID поста, который пользователь хочет отредактировать */
postId: string;
/** Новый текст поста (если message_type == "text") */
text: string;
/** Новые дополнительные метаданные поста в виде произвольной JSON-структуры (например, для обновления информации о медиа-контенте) */
metadata: { [key: string]: any } | undefined;
}
export interface EditPostResponse {
/** Данные отредактированного поста */
post: ChannelPost | undefined;
}
export interface DeletePostRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID поста, который пользователь хочет удалить */
postId: string;
}
export interface DeletePostResponse {
/** Флаг, указывающий, была ли операция удаления успешной */
success: boolean;
}
export interface GetPostRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID поста, который пользователь хочет получить */
postId: string;
}
export interface GetPostResponse {
/** Данные запрошенного поста */
post: ChannelPost | undefined;
}
export interface GetFeedRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID канала, для которого пользователь хочет получить ленту постов */
channelId: string;
/** Параметры пагинации (номер страницы и размер страницы) */
page: PageRequest | undefined;
}
export interface GetFeedResponse {
/** Список постов в запрошенной странице ленты */
items: ChannelPost[];
/** Информация о пагинации (номер страницы, размер страницы, общее количество элементов) */
page: PageResponse | undefined;
}
export interface UpdateReadOffsetRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID канала, для которого пользователь хочет обновить оффсет прочтения */
channelId: string;
/** Максимальный последовательный номер поста, который пользователь прочитал в канале (включительно) */
readPostSeq: string;
}
export interface UpdateReadOffsetResponse {
/** Данные обновленного оффсета прочтения пользователя в канале */
offset: ChannelReadOffset | undefined;
}
export interface GetReadOffsetRequest {
/** Метаданные запроса (например, для аутентификации и трассировки) */
meta:
| RequestMeta
| undefined;
/** UUID канала, для которого пользователь хочет получить оффсет прочтения */
channelId: string;
/** UUID пользователя, для которого нужно получить оффсет прочтения */
userId: string;
}
export interface GetReadOffsetResponse {
/** Данные оффсета прочтения пользователя в канале */
offset: ChannelReadOffset | undefined;
}
export const GLIFA_CHANNEL_V1_PACKAGE_NAME = "glifa.channel.v1";
wrappers[".google.protobuf.Struct"] = { fromObject: Struct.wrap, toObject: Struct.unwrap } as any;
export interface ChannelServiceClient {
createChannel(request: CreateChannelRequest): Observable<CreateChannelResponse>;
getChannel(request: GetChannelRequest): Observable<GetChannelResponse>;
subscribe(request: SubscribeRequest): Observable<SubscribeResponse>;
unsubscribe(request: UnsubscribeRequest): Observable<UnsubscribeResponse>;
createPost(request: CreatePostRequest): Observable<CreatePostResponse>;
editPost(request: EditPostRequest): Observable<EditPostResponse>;
deletePost(request: DeletePostRequest): Observable<DeletePostResponse>;
getPost(request: GetPostRequest): Observable<GetPostResponse>;
getFeed(request: GetFeedRequest): Observable<GetFeedResponse>;
updateReadOffset(request: UpdateReadOffsetRequest): Observable<UpdateReadOffsetResponse>;
getReadOffset(request: GetReadOffsetRequest): Observable<GetReadOffsetResponse>;
}
export interface ChannelServiceController {
createChannel(
request: CreateChannelRequest,
): Promise<CreateChannelResponse> | Observable<CreateChannelResponse> | CreateChannelResponse;
getChannel(
request: GetChannelRequest,
): Promise<GetChannelResponse> | Observable<GetChannelResponse> | GetChannelResponse;
subscribe(request: SubscribeRequest): Promise<SubscribeResponse> | Observable<SubscribeResponse> | SubscribeResponse;
unsubscribe(
request: UnsubscribeRequest,
): Promise<UnsubscribeResponse> | Observable<UnsubscribeResponse> | UnsubscribeResponse;
createPost(
request: CreatePostRequest,
): Promise<CreatePostResponse> | Observable<CreatePostResponse> | CreatePostResponse;
editPost(request: EditPostRequest): Promise<EditPostResponse> | Observable<EditPostResponse> | EditPostResponse;
deletePost(
request: DeletePostRequest,
): Promise<DeletePostResponse> | Observable<DeletePostResponse> | DeletePostResponse;
getPost(request: GetPostRequest): Promise<GetPostResponse> | Observable<GetPostResponse> | GetPostResponse;
getFeed(request: GetFeedRequest): Promise<GetFeedResponse> | Observable<GetFeedResponse> | GetFeedResponse;
updateReadOffset(
request: UpdateReadOffsetRequest,
): Promise<UpdateReadOffsetResponse> | Observable<UpdateReadOffsetResponse> | UpdateReadOffsetResponse;
getReadOffset(
request: GetReadOffsetRequest,
): Promise<GetReadOffsetResponse> | Observable<GetReadOffsetResponse> | GetReadOffsetResponse;
}
export function ChannelServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = [
"createChannel",
"getChannel",
"subscribe",
"unsubscribe",
"createPost",
"editPost",
"deletePost",
"getPost",
"getFeed",
"updateReadOffset",
"getReadOffset",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("ChannelService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("ChannelService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const CHANNEL_SERVICE_NAME = "ChannelService";

View File

@@ -0,0 +1,99 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/channel/v1/types.proto
/* eslint-disable */
import { wrappers } from "protobufjs";
import { Struct } from "../../../google/protobuf/struct";
import { Timestamp } from "../../../google/protobuf/timestamp";
import { MessageContentType } from "../../common/v1/enums";
export const protobufPackage = "glifa.channel.v1";
export interface Channel {
/** UUID канала */
id: string;
/** Идентификатор обработчика канала (например, "websocket", "mqtt") */
handler: string;
/** Название канала */
title: string;
/** Описание канала */
description: string;
/** UUID пользователя, который создал канал */
ownerUserId: string;
/** Последовательный номер последнего поста в канале (для генерации новых последовательных номеров) */
lastPostSeq: number;
/** UUID последнего поста в канале (для оптимистичной блокировки при добавлении новых постов) */
lastPostId: string;
/** Флаг, указывающий, является ли канал приватным (только по приглашениям) */
isPrivate: boolean;
/** Время создания канала */
createdAt:
| Timestamp
| undefined;
/** Время последнего обновления канала (например, при изменении названия или описания) */
updatedAt: Timestamp | undefined;
}
export interface ChannelSubscriber {
/** UUID канала, на который подписан пользователь */
channelId: string;
/** UUID пользователя, который подписан на канал */
userId: string;
/** Время подписки пользователя на канал */
subscribedAt: Timestamp | undefined;
}
export interface ChannelPost {
/** UUID поста */
id: string;
/** UUID канала, в котором опубликован пост */
channelId: string;
/** Последовательный номер поста в канале (для упорядочивания постов) */
postSeq: string;
/** Идентификатор поста, сгенерированный на клиенте (для обеспечения идемпотентности при повторной отправке) */
clientPostId: string;
/** UUID пользователя, который создал пост */
authorUserId: string;
/** Тип контента поста (например, "text", "image", "file") */
messageType: MessageContentType;
/** Текст поста (если message_type == "text") */
text: string;
/** UUID файла, прикрепленного к посту (если message_type == "file") */
fileId: string;
/** Дополнительные метаданные поста в виде произвольной JSON-структуры (например, для хранения информации о медиа-контент */
metadata:
| { [key: string]: any }
| undefined;
/** Флаг, указывающий, был ли пост отредактирован после создания */
isEdited: boolean;
/** Версия редактирования поста, которая увеличивается при каждом редактировании (для оптимистичной блокировки при редактировании) */
editVersion: number;
/** Время удаления поста (если пост был удален) */
deletedAt:
| Timestamp
| undefined;
/** Время создания поста */
createdAt:
| Timestamp
| undefined;
/** Время последнего обновления поста */
updatedAt: Timestamp | undefined;
}
export interface ChannelReadOffset {
/** UUID канала, для которого сохраняется смещение прочтения */
channelId: string;
/** UUID пользователя, для которого сохраняется смещение прочтения */
userId: string;
/** Последовательный номер последнего прочитанного поста в канале (для определения новых постов, которые пользователь еще не прочитал) */
readPostSeq: string;
/** Время последнего обновления смещения прочтения (например, при открытии канала пользователем) */
updatedAt: Timestamp | undefined;
}
export const GLIFA_CHANNEL_V1_PACKAGE_NAME = "glifa.channel.v1";
wrappers[".google.protobuf.Struct"] = { fromObject: Struct.wrap, toObject: Struct.unwrap } as any;

View File

@@ -0,0 +1,42 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/common/v1/authz.proto
/* eslint-disable */
export const protobufPackage = "glifa.common.v1";
export interface SubjectContext {
/** UUID пользователя, которому принадлежат права */
userId: string;
/** UUID устройства, с которого пришел запрос (если есть) */
deviceId: string;
/** UUID сессии, если пользователь авторизован */
sessionId: string;
/** Глобальные роли пользователя (например, "admin", "moderator") */
globalRoles: string[];
/** Глобальные права пользователя (например, "read_all", "write_all") */
globalPermissions: string[];
}
export interface PermissionCheck {
/** Тип ресурса (например, "user", "device", "session") */
resourceType: string;
/** UUID ресурса, к которому запрашиваются права */
resourceId: string;
/** Запрашиваемое право (например, "read", "write", "delete") */
permission: string;
}
export interface PermissionDecision {
/** Запрашиваемое право (например, "read", "write", "delete") */
permission: string;
/** Разрешено ли запрашиваемое право */
allowed: boolean;
/** Причина решения (например, "user_is_owner", "user_has_role_admin") */
reason: string;
}
export const GLIFA_COMMON_V1_PACKAGE_NAME = "glifa.common.v1";

View File

@@ -0,0 +1,63 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/common/v1/enums.proto
/* eslint-disable */
export const protobufPackage = "glifa.common.v1";
export enum SortDirection {
/** SORT_DIRECTION_UNSPECIFIED - Не указано */
SORT_DIRECTION_UNSPECIFIED = 0,
/** SORT_DIRECTION_ASC - По возрастанию */
SORT_DIRECTION_ASC = 1,
/** SORT_DIRECTION_DESC - По убыванию */
SORT_DIRECTION_DESC = 2,
UNRECOGNIZED = -1,
}
export enum Visibility {
/** VISIBILITY_UNSPECIFIED - Не указано */
VISIBILITY_UNSPECIFIED = 0,
/** VISIBILITY_PUBLIC - Публичный ресурс, доступный всем */
VISIBILITY_PUBLIC = 1,
/** VISIBILITY_PRIVATE - Приватный ресурс, доступный только владельцу */
VISIBILITY_PRIVATE = 2,
/** VISIBILITY_INTERNAL - Внутренний ресурс, доступный только внутри системы */
VISIBILITY_INTERNAL = 3,
UNRECOGNIZED = -1,
}
export enum MessageContentType {
/** MESSAGE_CONTENT_TYPE_UNSPECIFIED - Не указано */
MESSAGE_CONTENT_TYPE_UNSPECIFIED = 0,
/** MESSAGE_CONTENT_TYPE_TEXT - Текстовое сообщение */
MESSAGE_CONTENT_TYPE_TEXT = 1,
/** MESSAGE_CONTENT_TYPE_IMAGE - Изображение */
MESSAGE_CONTENT_TYPE_IMAGE = 2,
/** MESSAGE_CONTENT_TYPE_VIDEO - Видео */
MESSAGE_CONTENT_TYPE_VIDEO = 3,
/** MESSAGE_CONTENT_TYPE_AUDIO - Аудио */
MESSAGE_CONTENT_TYPE_AUDIO = 4,
/** MESSAGE_CONTENT_TYPE_FILE - Файл */
MESSAGE_CONTENT_TYPE_FILE = 5,
/** MESSAGE_CONTENT_TYPE_SYSTEM - Системное сообщение (например, уведомление о входе пользователя) */
MESSAGE_CONTENT_TYPE_SYSTEM = 6,
UNRECOGNIZED = -1,
}
export enum EncryptionMode {
/** ENCRYPTION_MODE_UNSPECIFIED - Не указано */
ENCRYPTION_MODE_UNSPECIFIED = 0,
/** ENCRYPTION_MODE_NONE - Без шифрования */
ENCRYPTION_MODE_NONE = 1,
/** ENCRYPTION_MODE_SERVER - Шифрование на стороне сервера */
ENCRYPTION_MODE_SERVER = 2,
/** ENCRYPTION_MODE_E2EE - End-to-End шифрование */
ENCRYPTION_MODE_E2EE = 3,
UNRECOGNIZED = -1,
}
export const GLIFA_COMMON_V1_PACKAGE_NAME = "glifa.common.v1";

View File

@@ -0,0 +1,102 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/common/v1/types.proto
/* eslint-disable */
import { Timestamp } from "../../../google/protobuf/timestamp";
export const protobufPackage = "glifa.common.v1";
export interface Empty {
}
export interface RequestMeta {
/** UUID4 для трассировки запроса */
requestId: string;
/** UUID4 для распределенного трейсинга */
traceId: string;
/** UUID4 для корреляции логов */
correlationId: string;
/** UUID4 для идемпотентности операций */
idempotencyKey: string;
/** UUID пользователя, инициировавшего запрос (если есть) */
actorUserId: string;
/** UUID устройства, с которого пришел запрос ( */
actorDeviceId: string;
/** UUID сессии, если пользователь авторизован */
actorSessionId: string;
/** IP-адрес клиента, от которого пришел запрос */
clientIp: string;
/** User-Agent клиента */
userAgent: string;
/** Локаль клиента (например, "en-US") */
locale: string;
}
export interface PageRequest {
/** Количество элементов на странице */
limit: number;
/** Курсор для пагинации (например, ID последнего элемента на предыдущей странице) */
cursor: string;
}
export interface PageResponse {
/** Курсор для следующей страницы (например, ID последнего элемента на текущей странице) */
nextCursor: string;
/** Флаг, указывающий, есть ли еще страницы */
hasMore: boolean;
}
export interface StringValue {
value: string;
}
export interface BoolValue {
value: boolean;
}
export interface Int64Value {
value: number;
}
export interface ErrorDetail {
/** Код ошибки (например, "USER_NOT_FOUND") */
code: string;
/** Человеко-читаемое сообщение об ошибке */
message: string;
/** Дополнительные данные об ошибке */
fields: { [key: string]: string };
}
export interface ErrorDetail_FieldsEntry {
key: string;
value: string;
}
export interface ResourceRef {
/** UUID ресурса */
id: string;
/** Тип ресурса (например, "user", "device", "session") */
type: string;
}
export interface AuditStamp {
/** Время создания ресурса */
createdAt:
| Timestamp
| undefined;
/** Ссылка на ресурс, который создал этот ресурс */
createdBy:
| ResourceRef
| undefined;
/** Время последнего обновления ресурса */
updatedAt:
| Timestamp
| undefined;
/** Ссылка на ресурс, который последний обновил этот ресурс */
updatedBy: ResourceRef | undefined;
}
export const GLIFA_COMMON_V1_PACKAGE_NAME = "glifa.common.v1";

View File

@@ -0,0 +1,393 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/core/v1/service.proto
/* eslint-disable */
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { wrappers } from "protobufjs";
import { Observable } from "rxjs";
import { Struct } from "../../../google/protobuf/struct";
import { PermissionCheck, PermissionDecision, SubjectContext } from "../../common/v1/authz";
import { EncryptionMode, MessageContentType } from "../../common/v1/enums";
import { PageRequest, PageResponse, RequestMeta } from "../../common/v1/types";
import { Chat, ChatMember, ChatMessage, ChatReadCursor, MessageSendStatus, UserProfile } from "./types";
export const protobufPackage = "glifa.core.v1";
export interface CreateDirectChatRequest {
meta:
| RequestMeta
| undefined;
/** UUID пользователя, который инициирует создание чата */
initiatorUserId: string;
/** UUID другого пользователя, с которым будет создан прямой чат */
peerUserId: string;
}
export interface CreateDirectChatResponse {
/** Информация о созданном чате */
chat: Chat | undefined;
}
export interface CreateGroupChatRequest {
meta:
| RequestMeta
| undefined;
/** UUID пользователя, который инициирует создание чата */
createdByUserId: string;
/** Название группового чата */
title: string;
/** Список UUID пользователей, которые будут добавлены в групповой чат (может быть пустым, тогда чат будет создан без участников, кроме создателя) */
memberUserIds: string[];
}
export interface CreateGroupChatResponse {
/** Информация о созданном чате */
chat: Chat | undefined;
}
export interface AddChatMemberRequest {
meta:
| RequestMeta
| undefined;
/** UUID чата, в который нужно добавить участника */
chatId: string;
/** UUID пользователя, которого нужно добавить в чат */
userId: string;
}
export interface AddChatMemberResponse {
/** Информация о добавленном участнике чата */
member: ChatMember | undefined;
}
export interface RemoveChatMemberRequest {
meta:
| RequestMeta
| undefined;
/** UUID чата, из которого нужно удалить участника */
chatId: string;
/** UUID пользователя, которого нужно удалить из чата */
userId: string;
}
export interface RemoveChatMemberResponse {
/** Флаг, указывающий, был ли участник успешно удален из чата */
success: boolean;
}
export interface SendMessageRequest {
meta:
| RequestMeta
| undefined;
/** UUID чата, в который нужно отправить сообщение */
chatId: string;
/** Идентификатор сообщения, сгенерированный на клиенте (для обеспечения идемпотентности при повторной отправке) */
clientMessageId: string;
/** Тип контента сообщения (например, "text", "image", "file") */
messageType: MessageContentType;
/** Текст сообщения (если message_type == "text") */
text: string;
/** UUID файла, прикрепленного к сообщению (если message_type == "file") */
fileId: string;
/** UUID сообщения, на которое был дан ответ (если это */
replyToMessageId: string;
/** Режим шифрования сообщения (например, "none", "client_side") */
encryptionMode: EncryptionMode;
/** Дополнительные метаданные сообщения в виде произвольной JSON-структуры (например, для хранения информации о медиа-контенте) */
metadata: { [key: string]: any } | undefined;
}
export interface SendMessageResponse {
/** Информация о созданном сообщении */
message:
| ChatMessage
| undefined;
/** Статус отправки сообщения (например, "sent", "delivered", "read") */
status: MessageSendStatus;
}
export interface EditMessageRequest {
meta:
| RequestMeta
| undefined;
/** UUID сообщения, которое нужно отредактировать */
messageId: string;
/** Новый текст сообщения (если message_type == "text") */
text: string;
/** Новые дополнительные метаданные сообщения в виде произвольной JSON-структуры (например, для обновления информации о медиа-контенте) */
metadata: { [key: string]: any } | undefined;
}
export interface EditMessageResponse {
/** Информация об отредактированном сообщении */
message: ChatMessage | undefined;
}
export interface DeleteMessageRequest {
meta:
| RequestMeta
| undefined;
/** UUID сообщения, которое нужно удалить */
messageId: string;
}
export interface DeleteMessageResponse {
/** Флаг, указывающий, было ли сообщение успешно удалено */
success: boolean;
}
export interface GetChatRequest {
meta:
| RequestMeta
| undefined;
/** UUID чата, информацию о котором нужно получить */
chatId: string;
}
export interface GetChatResponse {
/** Информация о запрошенном чате */
chat:
| Chat
| undefined;
/** Список участников чата */
members: ChatMember[];
}
export interface GetMessageRequest {
meta:
| RequestMeta
| undefined;
/** UUID сообщения, информацию о котором нужно получить */
messageId: string;
}
export interface GetMessageResponse {
/** Информация о запрошенном сообщении */
message: ChatMessage | undefined;
}
export interface GetHistoryRequest {
meta:
| RequestMeta
| undefined;
/** UUID чата, историю которого нужно получить */
chatId: string;
/** Параметры пагинации для получения истории сообщений */
page: PageRequest | undefined;
}
export interface GetHistoryResponse {
/** Список сообщений в запрошенной истории */
messages: ChatMessage[];
/** Информация о пагинации (номер страницы, размер страницы, общее количество сообщений) */
page: PageResponse | undefined;
}
export interface UpdateReadCursorRequest {
meta:
| RequestMeta
| undefined;
/** UUID чата, для которого нужно обновить курсор прочтения */
chatId: string;
/** Последовательный номер сообщения, до которого пользователь прочитал чат (включительно) */
readChatSeq: number;
}
export interface UpdateReadCursorResponse {
/** Информация об обновленном курсоре прочтения */
cursor: ChatReadCursor | undefined;
}
export interface GetReadCursorRequest {
meta:
| RequestMeta
| undefined;
/** UUID чата, для которого нужно получить курсор прочтения */
chatId: string;
/** UUID пользователя, для которого нужно получить курсор прочтения */
userId: string;
}
export interface GetReadCursorResponse {
/** Информация о курсоре прочтения, включая последний прочитанный последовательный номер сообщения в чате */
cursor: ChatReadCursor | undefined;
}
export interface GetUserProfileRequest {
meta:
| RequestMeta
| undefined;
/** UUID пользователя, профиль которого нужно получить */
userId: string;
}
export interface GetUserProfileResponse {
/** Информация о запрошенном профиле пользователя */
profile: UserProfile | undefined;
}
export interface SearchUserProfilesRequest {
meta:
| RequestMeta
| undefined;
/** Строка поиска, которая может соответствовать имени пользователя, отображаемому имени или биографии */
query: string;
/** Параметры пагинации для получения результатов поиска */
page: PageRequest | undefined;
}
export interface SearchUserProfilesResponse {
/** Список профилей пользователей, которые соответствуют строке поиска */
items: UserProfile[];
/** Информация о пагинации (номер страницы, размер страницы, общее количество результатов) */
page: PageResponse | undefined;
}
export interface CheckPermissionsRequest {
meta:
| RequestMeta
| undefined;
/** Контекст субъекта, для которого нужно проверить права (например, идентификатор пользователя, его роли и т.д.) */
subject:
| SubjectContext
| undefined;
/** Список прав, которые нужно проверить для данного субъекта (например, "read" право на ресурс "chat" с */
checks: PermissionCheck[];
}
export interface CheckPermissionsResponse {
/** Список решений по каждому запрашиваемому праву, указывающий, разрешено ли это право для данного субъекта и причину решения */
decisions: PermissionDecision[];
}
export const GLIFA_CORE_V1_PACKAGE_NAME = "glifa.core.v1";
wrappers[".google.protobuf.Struct"] = { fromObject: Struct.wrap, toObject: Struct.unwrap } as any;
export interface CoreServiceClient {
createDirectChat(request: CreateDirectChatRequest): Observable<CreateDirectChatResponse>;
createGroupChat(request: CreateGroupChatRequest): Observable<CreateGroupChatResponse>;
addChatMember(request: AddChatMemberRequest): Observable<AddChatMemberResponse>;
removeChatMember(request: RemoveChatMemberRequest): Observable<RemoveChatMemberResponse>;
sendMessage(request: SendMessageRequest): Observable<SendMessageResponse>;
editMessage(request: EditMessageRequest): Observable<EditMessageResponse>;
deleteMessage(request: DeleteMessageRequest): Observable<DeleteMessageResponse>;
getChat(request: GetChatRequest): Observable<GetChatResponse>;
getMessage(request: GetMessageRequest): Observable<GetMessageResponse>;
getHistory(request: GetHistoryRequest): Observable<GetHistoryResponse>;
updateReadCursor(request: UpdateReadCursorRequest): Observable<UpdateReadCursorResponse>;
getReadCursor(request: GetReadCursorRequest): Observable<GetReadCursorResponse>;
getUserProfile(request: GetUserProfileRequest): Observable<GetUserProfileResponse>;
searchUserProfiles(request: SearchUserProfilesRequest): Observable<SearchUserProfilesResponse>;
checkPermissions(request: CheckPermissionsRequest): Observable<CheckPermissionsResponse>;
}
export interface CoreServiceController {
createDirectChat(
request: CreateDirectChatRequest,
): Promise<CreateDirectChatResponse> | Observable<CreateDirectChatResponse> | CreateDirectChatResponse;
createGroupChat(
request: CreateGroupChatRequest,
): Promise<CreateGroupChatResponse> | Observable<CreateGroupChatResponse> | CreateGroupChatResponse;
addChatMember(
request: AddChatMemberRequest,
): Promise<AddChatMemberResponse> | Observable<AddChatMemberResponse> | AddChatMemberResponse;
removeChatMember(
request: RemoveChatMemberRequest,
): Promise<RemoveChatMemberResponse> | Observable<RemoveChatMemberResponse> | RemoveChatMemberResponse;
sendMessage(
request: SendMessageRequest,
): Promise<SendMessageResponse> | Observable<SendMessageResponse> | SendMessageResponse;
editMessage(
request: EditMessageRequest,
): Promise<EditMessageResponse> | Observable<EditMessageResponse> | EditMessageResponse;
deleteMessage(
request: DeleteMessageRequest,
): Promise<DeleteMessageResponse> | Observable<DeleteMessageResponse> | DeleteMessageResponse;
getChat(request: GetChatRequest): Promise<GetChatResponse> | Observable<GetChatResponse> | GetChatResponse;
getMessage(
request: GetMessageRequest,
): Promise<GetMessageResponse> | Observable<GetMessageResponse> | GetMessageResponse;
getHistory(
request: GetHistoryRequest,
): Promise<GetHistoryResponse> | Observable<GetHistoryResponse> | GetHistoryResponse;
updateReadCursor(
request: UpdateReadCursorRequest,
): Promise<UpdateReadCursorResponse> | Observable<UpdateReadCursorResponse> | UpdateReadCursorResponse;
getReadCursor(
request: GetReadCursorRequest,
): Promise<GetReadCursorResponse> | Observable<GetReadCursorResponse> | GetReadCursorResponse;
getUserProfile(
request: GetUserProfileRequest,
): Promise<GetUserProfileResponse> | Observable<GetUserProfileResponse> | GetUserProfileResponse;
searchUserProfiles(
request: SearchUserProfilesRequest,
): Promise<SearchUserProfilesResponse> | Observable<SearchUserProfilesResponse> | SearchUserProfilesResponse;
checkPermissions(
request: CheckPermissionsRequest,
): Promise<CheckPermissionsResponse> | Observable<CheckPermissionsResponse> | CheckPermissionsResponse;
}
export function CoreServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = [
"createDirectChat",
"createGroupChat",
"addChatMember",
"removeChatMember",
"sendMessage",
"editMessage",
"deleteMessage",
"getChat",
"getMessage",
"getHistory",
"updateReadCursor",
"getReadCursor",
"getUserProfile",
"searchUserProfiles",
"checkPermissions",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("CoreService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("CoreService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const CORE_SERVICE_NAME = "CoreService";

170
gen/glifa/core/v1/types.ts Normal file
View File

@@ -0,0 +1,170 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/core/v1/types.proto
/* eslint-disable */
import { wrappers } from "protobufjs";
import { Struct } from "../../../google/protobuf/struct";
import { Timestamp } from "../../../google/protobuf/timestamp";
import { EncryptionMode, MessageContentType } from "../../common/v1/enums";
export const protobufPackage = "glifa.core.v1";
export enum ChatType {
CHAT_TYPE_UNSPECIFIED = 0,
/** CHAT_TYPE_DIRECT - Прямой чат между двумя пользователями */
CHAT_TYPE_DIRECT = 1,
/** CHAT_TYPE_GROUP - Групповой чат с несколькими участниками */
CHAT_TYPE_GROUP = 2,
UNRECOGNIZED = -1,
}
export enum ChatMemberStatus {
CHAT_MEMBER_STATUS_UNSPECIFIED = 0,
/** CHAT_MEMBER_STATUS_ACTIVE - Участник активно участвует в чате */
CHAT_MEMBER_STATUS_ACTIVE = 1,
/** CHAT_MEMBER_STATUS_LEFT - Участник покинул чат */
CHAT_MEMBER_STATUS_LEFT = 2,
/** CHAT_MEMBER_STATUS_REMOVED - Участник был удален из чата */
CHAT_MEMBER_STATUS_REMOVED = 3,
/** CHAT_MEMBER_STATUS_BANNED - Участник был заблокирован в чате */
CHAT_MEMBER_STATUS_BANNED = 4,
UNRECOGNIZED = -1,
}
export enum MessageSendStatus {
MESSAGE_SEND_STATUS_UNSPECIFIED = 0,
/** MESSAGE_SEND_STATUS_ACCEPTED - Сообщение принято в обработку */
MESSAGE_SEND_STATUS_ACCEPTED = 1,
/** MESSAGE_SEND_STATUS_DEDUPLICATED - Сообщение является дубликатом (например, повторная отправка с тем же client_message_id) */
MESSAGE_SEND_STATUS_DEDUPLICATED = 2,
UNRECOGNIZED = -1,
}
export interface UserProfile {
/** UUID пользователя */
userId: string;
/** Уникальное имя пользователя (например, "john_doe") */
username: string;
/** Отображаемое имя пользователя (например, "John Doe") */
displayName: string;
/** Биография пользователя */
bio: string;
/** UUID медиа-объекта, который используется в качестве аватара пользователя */
avatarMediaObjectId: string;
/** Время создания профиля пользователя */
createdAt:
| Timestamp
| undefined;
/** Время последнего обновления профиля пользователя */
updatedAt: Timestamp | undefined;
}
export interface Chat {
/** UUID чата */
id: string;
/** Тип чата (прямой или групповой) */
type: ChatType;
/** Название чата (для группового чата) */
title: string;
/** UUID пользователя, который создал чат */
createdByUserId: string;
/** Последовательный номер последнего сообщения в чате (начинается с 0, увеличивается на 1 для каждого нового сообщения) */
lastChatSeq: number;
/** UUID последнего сообщения в чате */
lastMessageId: string;
/** Время создания чата */
createdAt:
| Timestamp
| undefined;
/** Время последнего обновления чата */
updatedAt: Timestamp | undefined;
}
export interface ChatMember {
/** UUID чата, к которому относится этот участник */
chatId: string;
/** UUID пользователя, который является участником чата */
userId: string;
/** Статус участника в чате (активный, покинувший, удаленный, заблокированный) */
status: ChatMemberStatus;
/** Время, когда пользователь присоединился к чату */
joinedAt:
| Timestamp
| undefined;
/** Время последнего обновления статуса участника в чате */
updatedAt: Timestamp | undefined;
}
export interface ChatRole {
/** UUID роли в чате */
id: string;
/** UUID чата, к которому относится эта роль */
chatId: string;
/** Уникальный ключ роли (например, "admin", "member") */
key: string;
/** Человекочитаемое название роли (например, "Администратор", "Участник") */
title: string;
/** Является ли роль встроенной (например, "admin" и "member" могут быть встроенными ролями, которые нельзя удалить) */
builtin: boolean;
}
export interface ChatMessage {
/** UUID сообщения */
id: string;
/** UUID чата, к которому относится это сообщение */
chatId: string;
/** Последовательный номер сообщения в рамках чата (начинается с 1 и увеличивается на 1 для каждого нового сообщения в этом чате) */
chatSeq: number;
/** Уникальный идентификатор сообщения, сгенерированный на клиенте (например, для обеспечения идемпотентности при отправке сообщений) */
clientMessageId: string;
/** UUID пользователя, который отправил сообщение */
senderUserId: string;
/** UUID сессии устройства, с которого было отправлено сообщение */
senderDeviceSessionId: string;
/** Тип содержимого сообщения (например, text, image, file) */
messageType: MessageContentType;
/** Текст сообщения (используется, если message_type == text) */
text: string;
/** Имя файла (используется, если message_type == file) */
fileName: string;
/** UUID сообщения, на которое данное сообщение является ответом (может быть пустым, если это не ответ на другое сообщение) */
replyToMessageId: string;
/** Режим шифрования сообщения (например, none, client_side) */
encryptionMode: EncryptionMode;
/** Дополнительные метаданные сообщения в виде */
metadata:
| { [key: string]: any }
| undefined;
/** Флаг, указывающий, было ли сообщение отредактировано после отправки */
isEdited: boolean;
/** Версия редактирования сообщения (увеличивается на 1 при каждом редактировании) */
editVersion: number;
/** Время удаления сообщения (устанавливается, если сообщение было удалено) */
deletedAt:
| Timestamp
| undefined;
/** Время создания сообщения */
createdAt:
| Timestamp
| undefined;
/** Время последнего обновления сообщения ( */
updatedAt: Timestamp | undefined;
}
export interface ChatReadCursor {
/** UUID чата */
chatId: string;
/** UUID пользователя */
userId: string;
/** Последовательный номер сообщения, до которого пользователь прочитал чат (включительно) */
readChatSeq: number;
/** Время последнего обновления курсора */
updatedAt: Timestamp | undefined;
}
export const GLIFA_CORE_V1_PACKAGE_NAME = "glifa.core.v1";
wrappers[".google.protobuf.Struct"] = { fromObject: Struct.wrap, toObject: Struct.unwrap } as any;

View File

@@ -0,0 +1,65 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/edge/v1/service.proto
/* eslint-disable */
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { Observable } from "rxjs";
import { RequestMeta } from "../../common/v1/types";
export const protobufPackage = "glifa.edge.v1";
export interface HealthRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta: RequestMeta | undefined;
}
export interface HealthResponse {
/** Статус здоровья сервиса, например, "healthy", "degraded", "unhealthy" */
status: string;
}
export interface ReadinessRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta: RequestMeta | undefined;
}
export interface ReadinessResponse {
/** Статус готовности сервиса, например, "ready", "not_ready" */
status: string;
/** Список проверок, которые были выполнены для определения готовности сервиса, и их результаты (например, "database: ok", "cache: ok", "external_api: timeout") */
checks: string[];
}
export const GLIFA_EDGE_V1_PACKAGE_NAME = "glifa.edge.v1";
export interface EdgeGagewayServiceClient {
health(request: HealthRequest): Observable<HealthResponse>;
readiness(request: ReadinessRequest): Observable<ReadinessResponse>;
}
export interface EdgeGagewayServiceController {
health(request: HealthRequest): Promise<HealthResponse> | Observable<HealthResponse> | HealthResponse;
readiness(request: ReadinessRequest): Promise<ReadinessResponse> | Observable<ReadinessResponse> | ReadinessResponse;
}
export function EdgeGagewayServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = ["health", "readiness"];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("EdgeGagewayService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("EdgeGagewayService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const EDGE_GAGEWAY_SERVICE_NAME = "EdgeGagewayService";

View File

@@ -0,0 +1,127 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/events/v1/auth_events.proto
/* eslint-disable */
import { Timestamp } from "../../../google/protobuf/timestamp";
export const protobufPackage = "glifa.events.v1";
export interface AuthUserCreated {
/** UUID нового пользователя */
userId: string;
/** Имя пользователя */
username: string;
/** Электронная почта пользователя */
email: string;
/** Номер телефона пользователя */
phone: string;
/** Время создания пользователя */
createdAt: Timestamp | undefined;
}
export interface AuthUserUpdated {
/** UUID пользователя */
userId: string;
/** Новое имя пользователя (если изменилось) */
username: string;
/** Новое отображаемое имя пользователя (если изменилось) */
displayName: string;
/** UUID нового аватара пользователя (если изменился) */
avatarMediaObjectId: string;
/** Время обновления пользователя */
updatedAt: Timestamp | undefined;
}
export interface AuthUserBlocked {
/** UUID заблокированного пользователя */
userId: string;
/** Причина блокировки пользователя */
reason: string;
/** Время блокировки пользователя */
blockedAt: Timestamp | undefined;
}
export interface AuthSessionCreated {
/** UUID новой сессии */
sessionId: string;
/** UUID пользователя, которому принадлежит сессия */
userId: string;
/** UUID устройства, с которого была создана сессия */
deviceId: string;
/** Статус сессии (например, "active", "inactive") */
status: string;
/** Время создания сессии */
createdAt: Timestamp | undefined;
}
export interface AuthSessionLocked {
/** UUID заблокированной сессии */
sessionId: string;
/** UUID пользователя, которому принадлежит сессия */
userId: string;
/** Причина блокировки сессии */
reason: string;
/** Время блокировки сессии */
lockedAt: Timestamp | undefined;
}
export interface AuthSessionUnlocked {
/** UUID разблокированной сессии */
sessionId: string;
/** UUID пользователя, которому принадлежит сессия */
userId: string;
/** Время разблокировки сессии */
unlockedAt: Timestamp | undefined;
}
export interface AuthSessionRevoked {
/** UUID отозванной сессии */
sessionId: string;
/** UUID пользователя, которому принадлежит сессия */
userId: string;
/** Причина отзыва сессии */
reason: string;
/** Время отзыва сессии */
revokedAt: Timestamp | undefined;
}
export interface AuthSessionCompromised {
/** UUID скомпрометированной сессии */
sessionId: string;
/** UUID пользователя, которому принадлежит сессия */
userId: string;
/** Причина компрометации сессии */
reason: string;
/** Время компрометации сессии */
compromisedAt: Timestamp | undefined;
}
export interface AuthQrRequestCreated {
/** UUID нового QR-запроса */
requestId: string;
/** Время истечения срока действия QR-запроса */
expiresAt: Timestamp | undefined;
}
export interface AuthQrRequestApproved {
/** UUID одобренного QR-запроса */
requestId: string;
/** UUID пользователя, который одобрил QR-запрос */
approvingUserId: string;
/** UUID сессии, с которой был одобрен QR-запрос */
approvingSessionId: string;
/** Время одобрения QR-запроса */
approvedAt: Timestamp | undefined;
}
export interface AuthQrRequestExpired {
/** UUID истекшего QR-запроса */
requestId: string;
/** Время истечения срока действия QR-запроса */
expiredAt: Timestamp | undefined;
}
export const GLIFA_EVENTS_V1_PACKAGE_NAME = "glifa.events.v1";

View File

@@ -0,0 +1,87 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/events/v1/channel_events.proto
/* eslint-disable */
import { Timestamp } from "../../../google/protobuf/timestamp";
import { MessageContentType } from "../../common/v1/enums";
export const protobufPackage = "glifa.events.v1";
export interface ChannelCreated {
/** UUID канала, который был создан */
channelId: string;
/** Уникальный идентификатор канала (например, "general", "random") */
handle: string;
/** Название канала */
title: string;
/** UUID пользователя, который создал канал */
ownerUserId: string;
/** Время создания канала */
createdAt: Timestamp | undefined;
}
export interface ChannelSubscriberAdded {
/** UUID канала, в который был добавлен подписчик */
channelId: string;
/** UUID пользователя, который был добавлен в канал */
userId: string;
/** Время добавления подписчика в канал */
addedAt: Timestamp | undefined;
}
export interface ChannelSubscriberRemoved {
/** UUID канала, из которого был удален подписчик */
channelId: string;
/** UUID пользователя, который был удален из канала */
userId: string;
/** Время удаления подписчика из канала */
removedAt: Timestamp | undefined;
}
export interface ChannelPostCreated {
/** UUID созданного поста */
postId: string;
/** UUID канала, в котором был создан пост */
channelId: string;
/** Последовательный номер поста в рамках канала (начинается с 1 и увеличивается на 1 для каждого нового поста в канале) */
postSeq: number;
/** Идентификатор поста, сгенерированный на клиенте (для обеспечения идемпотентности при повторной отправке) */
clientPostId: string;
/** UUID пользователя, который создал пост */
authorUserId: string;
/** Тип контента поста (например, "text", "image", "file") */
messageType: MessageContentType;
/** Текст поста (если message_type == "text") */
text: string;
/** UUID файла, прикрепленного к посту (если message_type == "file") */
fileId: string;
/** Время создания поста */
createdAt: Timestamp | undefined;
}
export interface ChannelPostEdited {
/** UUID отредактированного поста */
postId: string;
/** UUID канала, в котором был создан пост */
channelId: string;
/** Версия редактирования поста (начинается с 1 и увеличивается на 1 для каждого редактирования поста) */
editVersion: string;
/** Новый текст поста (если message_type == "text") */
text: string;
/** Время редактирования поста */
updatedAt: Timestamp | undefined;
}
export interface ChannelPostDeleted {
/** UUID удаленного поста */
postId: string;
/** UUID канала, в котором был создан пост */
channelId: string;
/** Время удаления поста */
deletedAt: Timestamp | undefined;
}
export const GLIFA_EVENTS_V1_PACKAGE_NAME = "glifa.events.v1";

View File

@@ -0,0 +1,126 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/events/v1/core_events.proto
/* eslint-disable */
import { Timestamp } from "../../../google/protobuf/timestamp";
import { EncryptionMode, MessageContentType } from "../../common/v1/enums";
export const protobufPackage = "glifa.events.v1";
export interface CoreUserProfileCreated {
/** UUID пользователя, для которого создан профиль */
userId: string;
/** Имя пользователя */
username: string;
/** Отображаемое имя пользователя */
displayName: string;
/** Время создания профиля пользователя */
createdAt: Timestamp | undefined;
}
export interface CoreUserProfileUpdated {
/** UUID пользователя, чей профиль был обновлен */
userId: string;
/** Новое отображаемое имя пользователя (если изменилось) */
displayName: string;
/** Новая биография пользователя (если изменилось) */
bio: string;
/** UUID нового аватара пользователя (если изменился) */
avatarMediaObjectId: string;
/** Время обновления профиля пользователя */
updatedAt: Timestamp | undefined;
}
export interface CoreChatMemberAdded {
/** UUID чата, в который был добавлен участник */
chatId: string;
/** UUID пользователя, который был добавлен в чат */
userId: string;
/** Время добавления участника в чат */
addedAt: Timestamp | undefined;
}
export interface CoreChatMemberRemoved {
/** UUID чата, из которого был удален участник */
chatId: string;
/** UUID пользователя, который был удален из чата */
userId: string;
/** Время удаления участника из чата */
removedAt: Timestamp | undefined;
}
export interface CoreChatRoleAssigned {
/** UUID чата, в котором была назначена роль */
chatId: string;
/** UUID пользователя, которому была назначена роль */
userId: string;
/** Ключ роли, которая была назначена пользователю (например, "admin", "moderator") */
roleKey: string;
/** Время назначения роли пользователю в ч */
assignedAt: Timestamp | undefined;
}
export interface CoreMessageCreated {
/** UUID созданного сообщения */
messageId: string;
/** UUID чата, в котором было создано сообщение */
chatId: string;
/** Последовательный номер сообщения в рамках чата (начинается с 1 и увеличивается на 1 для каждого нового сообщения в чате) */
chatSeq: string;
/** Идентификатор сообщения, сгенерированный на клиенте (для обеспечения идемпотентности при повторной отправке) */
clientMessageId: string;
/** UUID пользователя, который отправил сообщение */
senderUserId: string;
/** UUID сессии, с которой было отправлено сообщение */
senderSessionId: string;
/** Тип контента сообщения (например, "text", "image", "file") */
messageType: MessageContentType;
/** Режим шифрования сообщения (например, "none", "end-to-end") */
encryptionMode: EncryptionMode;
/** Текст сообщения (если message_type == "text") */
text: string;
/** UUID файла, прикрепленного к сообщению (если message_type == "file") */
fileId: string;
/** UUID сообщения, на которое был дан ответ (если это сообщение является ответом) */
replyToMessageId: string;
/** Время создания сообщения */
createdAt: Timestamp | undefined;
}
export interface CoreMessageEdited {
/** UUID отредактированного сообщения */
messageId: string;
/** UUID чата, в котором было отредактировано сообщение */
chatId: string;
/** Версия редактирования сообщения (начинается с 1 и увеличивается на 1 для каждого нового редактирования) */
editVersion: string;
/** Новый текст сообщения (если message_type == "text") */
text: string;
/** Время редактирования сообщения */
updatedAt: Timestamp | undefined;
}
export interface CoreMessageDeleted {
/** UUID удаленного сообщения */
messageId: string;
/** UUID чата, в котором было удалено сообщение */
chatId: string;
/** Время удаления сообщения */
deletedAt: Timestamp | undefined;
}
export interface CoreMessageReadUpdated {
/** UUID чата, в котором было обновлено состояние прочтения сообщений */
chatId: string;
/** UUID пользователя, который прочитал сообщения */
userId: string;
/** Максимальный последовательный номер сообщения, который пользователь прочитал в чате (включительно) */
readChatSeq: number;
/** Время обновления состояния прочтения */
updatedAt: Timestamp | undefined;
}
export const GLIFA_EVENTS_V1_PACKAGE_NAME = "glifa.events.v1";

View File

@@ -0,0 +1,42 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/events/v1/eventlope.proto
/* eslint-disable */
import { Any } from "../../../google/protobuf/any";
import { Timestamp } from "../../../google/protobuf/timestamp";
export const protobufPackage = "glifa.events.v1";
export interface DurableEventEventlope {
/** UUID события */
eventId: string;
/** Тип события (например, "user.created", " */
eventType: string;
/** Версия схемы данных события */
eventVersion: number;
/** Идентификатор системы, которая сгенерировала событие */
producer: string;
/** Тип агрегата, к которому относится событие (например, "user", "order") */
aggregateType: string;
/** UUID агрегата, к которому относится событие */
aggregateId: string;
/** Ключ для партиционирования (например, "user_id" или "order_id") */
partitionKey: string;
/** Время возникновения события */
occurredAt:
| Timestamp
| undefined;
/** UUID для распределенного трейсинга */
traceId: string;
/** UUID для корреляции логов */
correlationId: string;
/** UUID для идемпотентности операций */
idempotencyKey: string;
/** Данные события в виде сериализованного protobuf-сообщения (может быть любым типом, в зависимости от event_type) */
payload: Any | undefined;
}
export const GLIFA_EVENTS_V1_PACKAGE_NAME = "glifa.events.v1";

View File

@@ -0,0 +1,61 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/events/v1/media_events.proto
/* eslint-disable */
import { Timestamp } from "../../../google/protobuf/timestamp";
export const protobufPackage = "glifa.events.v1";
export interface MediaUploadInitiated {
/** UUID намерения загрузки, который будет использоваться для идентификации процесса загрузки */
uploadIntentId: string;
/** UUID пользователя, который инициализировал загрузку */
ownerUserId: string;
/** Время инициализации загрузки медиа */
initiatedAt: Timestamp | undefined;
}
export interface MediaUploadFinalized {
/** UUID намерения загрузки, который был использован для идентификации процесса загрузки */
uploadIntentId: string;
/** UUID созданного медиа-объекта после успешной загрузки */
mediaObjectId: string;
/** Время финализации загрузки медиа */
finalizedAt: Timestamp | undefined;
}
export interface MediaObjectActivated {
/** UUID медиа-объекта, который был активирован */
mediaObjectId: string;
/** UUID пользователя, который активировал медиа-объект */
ownerUserId: string;
/** Видимость медиа-объекта (например, "public", "private", "unlisted") */
visibility: string;
/** Время активации медиа-объекта (когда он стал доступен для использования) */
activatedAt: Timestamp | undefined;
}
export interface MediaObjectQuarantined {
/** UUID медиа-объекта, который был помещен в карантин */
mediaObjectId: string;
/** Причина помещения медиа-объекта в карантин (например, "inappropriate_content", "copyright_violation") */
reason: string;
/** Время помещения медиа-объекта в карантин */
quarantinedAt: Timestamp | undefined;
}
export interface MediaVariantCreated {
/** UUID созданного варианта медиа-объекта */
mediaVariantId: string;
/** UUID медиа-объекта, для которого был создан вариант */
mediaObjectId: string;
/** Тип варианта (например, "thumbnail", "preview", "full") */
variantKind: string;
/** Время создания варианта медиа-объекта */
createdAt: Timestamp | undefined;
}
export const GLIFA_EVENTS_V1_PACKAGE_NAME = "glifa.events.v1";

View File

@@ -0,0 +1,249 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/media/v1/service.proto
/* eslint-disable */
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { Observable } from "rxjs";
import { RequestMeta } from "../../common/v1/types";
import { MediaAccessGrant, MediaObject, MediaVisibility, UploadIntent, UploadPart } from "./types";
export const protobufPackage = "glifa.media.v1";
export interface InitiateUploadRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Исходное имя файла, который будет загружен */
fileName: string;
/** MIME-тип файла, который будет загружен (например, "image/jpeg", "video/mp4") */
declaredMimeType: string;
/** Ожидаемый размер файла в байтах, который будет загружен */
expectedSize: number;
/** Флаг, указывающий, будет ли загрузка выполняться в несколько частей (multipart upload) */
multipart: boolean;
/** Видимость медиа-объекта (публичный или приватный) */
visibility: MediaVisibility;
}
export interface InitiateUploadResponse {
/** Намерение загрузки, содержащее информацию о процессе загрузки и его статусе */
uploadIntent: UploadIntent | undefined;
}
export interface PresignPartUploadRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID намерения загрузки, к которому относится эта часть */
uploadIntentId: string;
/** Номер части в последовательности загрузки (начинается с 1) */
partNumber: number;
}
export interface PresignPartUploadResponse {
/** Предварительно подписанный URL для загрузки части файла в хранилище */
url: string;
/** Дополнительные заголовки, которые должны быть включены в запрос загрузки части (например, для аутентификации или указания типа контента) */
headers: { [key: string]: string };
}
export interface PresignPartUploadResponse_HeadersEntry {
key: string;
value: string;
}
export interface CompletePartRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID намерения загрузки, к которому относится эта часть */
uploadIntentId: string;
/** Номер части в последовательности загрузки (начинается с 1) */
partNumber: number;
/** ETag, возвращаемый хранилищем после успешной загрузки части, который будет использоваться для финализации загрузки */
etag: string;
/** Размер части в байтах */
size: number;
}
export interface CompletePartResponse {
/** Информация о загруженной части, включая номер части, ETag и размер */
part: UploadPart | undefined;
}
export interface FinalizeUploadRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID намерения загрузки, который будет финализирован */
uploadIntentId: string;
/** Контрольная сумма (например, MD5 или SHA-256) всего файла, который был загружен, для проверки целостности данных */
checksum: string;
}
export interface FinalizeUploadResponse {
/** Намерение загрузки с обновленным статусом, указывающим, что загрузка была успешно завершена */
uploadIntent:
| UploadIntent
| undefined;
/** Информация о созданном медиа-объекте, включая его UUID, размер, MIME-тип и т.д. */
mediaObject: MediaObject | undefined;
}
export interface AbortUploadRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID намерения загрузки, который будет прерван */
uploadIntentId: string;
}
export interface AbortUploadResponse {
/** Флаг, указывающий, была ли операция прерывания успешной */
success: boolean;
}
export interface GetMediaObjectRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID медиа-объекта, который пользователь хочет получить */
mediaObjectId: string;
}
export interface GetMediaObjectResponse {
/** Информация о запрошенном медиа-объекте, включая его UUID, размер, MIME-тип, статус и т.д. */
mediaObject: MediaObject | undefined;
}
export interface CreateAccessGrantRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID медиа-объекта, для которого создается грант доступа */
mediaObjectId: string;
/** UUID пользователя, которому предоставляется доступ к медиа-объекту */
subjectUserId: string;
/** Флаг, указывающий, является ли грант доступа одноразовым (может быть использован только один раз для доступа к медиа-объекту) */
singleUse: boolean;
}
export interface CreateAccessGrantResponse {
/** Информация о созданном гранте доступа, включая его UUID, связанный медиа-объект, субъект доступа и т.д. */
grant: MediaAccessGrant | undefined;
}
export interface ResolveDownloadRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID медиа-объекта, который пользователь хочет скачать */
mediaObjectId: string;
/** UUID гранта доступа, который будет использоваться для авторизации доступа к медиа-объекту при скачивании */
accessGrantId: string;
}
export interface ResolveDownloadResponse {
/** Предварительно подписанный URL для скачивания файла медиа-объекта из хранилища */
url: string;
/** Дополнительные заголовки, которые должны быть включены в запрос скачивания файла (например, для аутентификации или указания типа контента) */
headers: { [key: string]: string };
/** HTTP-метод, который должен быть использован для скачивания файла (например, "GET", "POST") */
method: string;
}
export interface ResolveDownloadResponse_HeadersEntry {
key: string;
value: string;
}
export const GLIFA_MEDIA_V1_PACKAGE_NAME = "glifa.media.v1";
export interface MediaServiceClient {
initiateUpload(request: InitiateUploadRequest): Observable<InitiateUploadResponse>;
presignPartUpload(request: PresignPartUploadRequest): Observable<PresignPartUploadResponse>;
completePart(request: CompletePartRequest): Observable<CompletePartResponse>;
finalizeUpload(request: FinalizeUploadRequest): Observable<FinalizeUploadResponse>;
abortUpload(request: AbortUploadRequest): Observable<AbortUploadResponse>;
getMediaObject(request: GetMediaObjectRequest): Observable<GetMediaObjectResponse>;
createAccessGrant(request: CreateAccessGrantRequest): Observable<CreateAccessGrantResponse>;
resolveDownload(request: ResolveDownloadRequest): Observable<ResolveDownloadResponse>;
}
export interface MediaServiceController {
initiateUpload(
request: InitiateUploadRequest,
): Promise<InitiateUploadResponse> | Observable<InitiateUploadResponse> | InitiateUploadResponse;
presignPartUpload(
request: PresignPartUploadRequest,
): Promise<PresignPartUploadResponse> | Observable<PresignPartUploadResponse> | PresignPartUploadResponse;
completePart(
request: CompletePartRequest,
): Promise<CompletePartResponse> | Observable<CompletePartResponse> | CompletePartResponse;
finalizeUpload(
request: FinalizeUploadRequest,
): Promise<FinalizeUploadResponse> | Observable<FinalizeUploadResponse> | FinalizeUploadResponse;
abortUpload(
request: AbortUploadRequest,
): Promise<AbortUploadResponse> | Observable<AbortUploadResponse> | AbortUploadResponse;
getMediaObject(
request: GetMediaObjectRequest,
): Promise<GetMediaObjectResponse> | Observable<GetMediaObjectResponse> | GetMediaObjectResponse;
createAccessGrant(
request: CreateAccessGrantRequest,
): Promise<CreateAccessGrantResponse> | Observable<CreateAccessGrantResponse> | CreateAccessGrantResponse;
resolveDownload(
request: ResolveDownloadRequest,
): Promise<ResolveDownloadResponse> | Observable<ResolveDownloadResponse> | ResolveDownloadResponse;
}
export function MediaServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = [
"initiateUpload",
"presignPartUpload",
"completePart",
"finalizeUpload",
"abortUpload",
"getMediaObject",
"createAccessGrant",
"resolveDownload",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("MediaService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("MediaService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const MEDIA_SERVICE_NAME = "MediaService";

144
gen/glifa/media/v1/types.ts Normal file
View File

@@ -0,0 +1,144 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/media/v1/types.proto
/* eslint-disable */
import { Timestamp } from "../../../google/protobuf/timestamp";
export const protobufPackage = "glifa.media.v1";
export enum UploadIntentStatus {
/** UPLOAD_INTENT_STATUS_UNSPECIFIED - Неопределенный статус намерения загрузки */
UPLOAD_INTENT_STATUS_UNSPECIFIED = 0,
/** UPLOAD_INTENT_STATUS_INITIATED - Намерение загрузки было инициализировано, но загрузка еще не началась */
UPLOAD_INTENT_STATUS_INITIATED = 1,
/** UPLOAD_INTENT_STATUS_UPLOADING - Процесс загрузки медиа-объекта начался, но еще не завершился */
UPLOAD_INTENT_STATUS_UPLOADING = 2,
/** UPLOAD_INTENT_STATUS_FINALIZED - Процесс загрузки медиа-объекта успешно завершился, и медиа-объект был создан */
UPLOAD_INTENT_STATUS_FINALIZED = 3,
/** UPLOAD_INTENT_STATUS_ABORTED - Процесс загрузки был прерван или отменен до его завершения */
UPLOAD_INTENT_STATUS_ABORTED = 4,
/** UPLOAD_INTENT_STATUS_EXPIRED - Намерение загрузки истекло, и загрузка не может быть завершена */
UPLOAD_INTENT_STATUS_EXPIRED = 5,
UNRECOGNIZED = -1,
}
export enum MediaObjectStatus {
/** MEDIA_OBJECT_STATUS_UNSPECIFIED - Неопределенный статус медиа-объекта */
MEDIA_OBJECT_STATUS_UNSPECIFIED = 0,
/** MEDIA_OBJECT_STATUS_PENDING - Медиа-объект находится в ожидании обработки (например, конвертации или проверки) */
MEDIA_OBJECT_STATUS_PENDING = 1,
/** MEDIA_OBJECT_STATUS_ACTIVE - Медиа-объект активен и доступен для использования */
MEDIA_OBJECT_STATUS_ACTIVE = 2,
/** MEDIA_OBJECT_STATUS_QUARANTINED - Медиа-объект помещен в карантин из-за подозрения на нарушение правил (например, неподобающий контент) */
MEDIA_OBJECT_STATUS_QUARANTINED = 3,
/** MEDIA_OBJECT_STATUS_DELETED - Медиа-объект удален и больше не доступен */
MEDIA_OBJECT_STATUS_DELETED = 4,
UNRECOGNIZED = -1,
}
export enum MediaVisibility {
/** MEDIA_VISIBILITY_UNSPECIFIED - Неопределенная видимость медиа-объекта */
MEDIA_VISIBILITY_UNSPECIFIED = 0,
/** MEDIA_VISIBILITY_PUBLIC - Медиа-объект публичный и доступен всем пользователям */
MEDIA_VISIBILITY_PUBLIC = 1,
/** MEDIA_VISIBILITY_PRIVATE - Медиа-объект приватный и доступен только владельцу */
MEDIA_VISIBILITY_PRIVATE = 2,
UNRECOGNIZED = -1,
}
export interface UploadIntent {
/** UUID намерения загрузки, который будет использоваться для идентификации процесса загрузки */
id: string;
/** UUID пользователя, который инициализировал */
ownerUserId: string;
/** Исходное имя файла, который будет загружен */
fileName: string;
/** MIME-тип файла, который будет загружен (например, "image/jpeg", "video/mp4") */
declaredMimeType: string;
/** Ожидаемый размер файла в байтах, который будет загружен */
expectedSize: number;
/** Флаг, указывающий, будет ли загрузка выполняться в несколько частей (multipart upload) */
multipart: boolean;
/** Текущий статус намерения загрузки */
status: UploadIntentStatus;
/** Временная метка, указывающая, когда намерение загрузки истекает и больше не может быть использовано для загрузки файла */
expiresAt:
| Timestamp
| undefined;
/** Временная метка создания намерения загрузки */
createdAt:
| Timestamp
| undefined;
/** Временная метка последнего обновления намерения загрузки */
updatedAt: Timestamp | undefined;
}
export interface UploadPart {
/** UUID намерения загрузки, к которому относится эта часть */
uploadIntentId: string;
/** Номер части в последовательности загрузки (начинается с 1) */
partNumber: number;
/** ETag, возвращаемый хранилищем после успешной загрузки части, который будет использоваться для финализации загрузки */
etag: string;
/** Размер части в байтах */
size: number;
/** Временная метка, указывающая, когда эта часть была успешно загружена */
completedAt: Timestamp | undefined;
}
export interface MediaObject {
/** UUID медиа-объекта, который будет использоваться для идентификации и доступа к медиа-объекту */
id: string;
/** UUID пользователя, которому принадлежит этот медиа-объект */
ownerUserId: string;
/** Ключ объекта в хранилище, который указывает на местоположение файла медиа-объекта */
objectKey: string;
/** Контрольная сумма (например, MD5 или SHA-256) файла медиа-объекта, которая может использоваться для проверки целостности данных */
checksum: string;
/** Размер файла медиа-объекта в бай */
size: number;
/** MIME-тип, определенный после загрузки и анализа файла медиа-объекта */
detectedMimeType: string;
/** Видимость медиа-объекта (публичный или приватный) */
visibility: MediaVisibility;
/** Текущий статус медиа-объекта (например, ожидает обработки, активен, в карантине, удален) */
status: MediaObjectStatus;
/** Ссылка на ключ шифрования, если медиа-объект зашифрован */
encryptionKeyRef: string;
/** Тип ресурса, с которым связан этот медиа-объект (например, "post", "profile_picture", "document") */
linkResourceType: string;
/** UUID ресурса, с которым связан этот медиа-объект (например, идентификатор поста, идентификатор профиля пользователя, идентификатор документа) */
linkResourceId: string;
/** Временная метка создания медиа-объекта */
createdAt:
| Timestamp
| undefined;
/** Временная метка последнего обновления медиа-объекта */
updatedAt: Timestamp | undefined;
}
export interface MediaAccessGrant {
/** UUID разрешения доступа, который будет использоваться для идентификации и управления разрешением доступа */
id: string;
/** UUID медиа-объекта, к */
mediaObjectId: string;
/** UUID пользователя, которому предоставлено разрешение доступа к медиа-объекту */
subjectUserId: string;
/** Флаг, указывающий, является ли это разрешение одноразовым (single-use), которое может быть использовано только один раз для доступа к медиа-объекту */
singleUse: boolean;
/** Временная метка, указывающая, когда разрешение доступа истекает и больше не может быть использовано для доступа к медиа-объекту */
expiresAt:
| Timestamp
| undefined;
/** Временная метка, указывающая, когда это разрешение доступа было использовано для доступа к медиа-объекту (для одноразовых разрешений) */
consumedAt:
| Timestamp
| undefined;
/** Временная метка создания разрешения доступа */
createdAt: Timestamp | undefined;
}
export const GLIFA_MEDIA_V1_PACKAGE_NAME = "glifa.media.v1";

173
gen/glifa/ws/v1/service.ts Normal file
View File

@@ -0,0 +1,173 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/ws/v1/service.proto
/* eslint-disable */
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { Observable } from "rxjs";
import { RequestMeta } from "../../common/v1/types";
import { ConnectionInfo, PresenceState, RealtimeEnvelope, TypingState } from "./types";
export const protobufPackage = "glifa.ws.v1";
export interface RegisterConnectionRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Токен доступа, который будет использоваться для аутентификации и авторизации соединения */
accessToken: string;
/** Уникальный идентификатор соединения, который может быть сгенерирован клиентом или сервером для отслеживания этого соединения */
connectionId: string;
/** Идентификатор узла, к которому подключается это соединение, если используется распределенная архитектура с несколькими узлами */
nodeId: string;
}
export interface RegisterConnectionResponse {
/** Информация о зарегистрированном соединении, включая его статус и метаданные */
connection: ConnectionInfo | undefined;
}
export interface UnregisterConnectionRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Уникальный идентификатор соединения, которое должно быть удалено или разорвано */
connectionId: string;
}
export interface UnregisterConnectionResponse {
/** Флаг, указывающий, было ли соединение успешно удалено или разорвано */
success: boolean;
}
export interface PublishEnvelopeRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Список UUID пользователей, которые являются целевыми получателями этого сообщения, и которым должно быть доставлено это сообщение */
targetUserIds: string[];
/** Список UUID сессий, которые являются целевыми получателями этого сообщения, и которым должно быть доставлено это сообщение */
targetSessionIds: string[];
/** Список UUID каналов или тем, на которые подписаны получатели, которым должно быть доставлено это сообщение */
targetChannelIds: string[];
/** Конверт в реальном времени, который содержит данные и метаданные сообщения, которое должно быть доставлено получателям */
envelope: RealtimeEnvelope | undefined;
}
export interface PublishEnvelopeResponse {
/** Количество целевых получателей, которым было принято это сообщение для доставки (например, количество пользователей, сессий или каналов, которым было отправлено это сообщение) */
acceptedTargets: number;
}
export interface PublishPresenceRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Состояние присутствия пользователя, которое должно быть опубликовано и доставлено подписчикам */
presence: PresenceState | undefined;
}
export interface PublishPresenceResponse {
/** Флаг, указывающий, было ли состояние присутствия успешно опубликовано и доставлено подписчикам */
success: boolean;
}
export interface PublishTypingRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** Состояние печати пользователя, которое должно быть опубликовано и доставлено подписчикам */
typing: TypingState | undefined;
}
export interface PublishTypingResponse {
/** Флаг, указывающий, было ли состояние печати успешно опубликовано и доставлено подписчикам */
success: boolean;
}
export interface ListUserConnectionsRequest {
/** Метаданные запроса, такие как идентификатор корреляции, язык и т.д. */
meta:
| RequestMeta
| undefined;
/** UUID пользователя, для которого нужно получить список активных соединений */
userId: string;
}
export interface ListUserConnectionsResponse {
/** Список активных соединений, связанных с указанным пользователем, включая их статус и метаданные */
items: ConnectionInfo[];
}
export const GLIFA_WS_V1_PACKAGE_NAME = "glifa.ws.v1";
export interface WsGatewayServiceClient {
registerConnection(request: RegisterConnectionRequest): Observable<RegisterConnectionResponse>;
unregisterConnection(request: UnregisterConnectionRequest): Observable<UnregisterConnectionResponse>;
publishEnvelope(request: PublishEnvelopeRequest): Observable<PublishEnvelopeResponse>;
publishPresence(request: PublishPresenceRequest): Observable<PublishPresenceResponse>;
publishTyping(request: PublishTypingRequest): Observable<PublishTypingResponse>;
listUserConnections(request: ListUserConnectionsRequest): Observable<ListUserConnectionsResponse>;
}
export interface WsGatewayServiceController {
registerConnection(
request: RegisterConnectionRequest,
): Promise<RegisterConnectionResponse> | Observable<RegisterConnectionResponse> | RegisterConnectionResponse;
unregisterConnection(
request: UnregisterConnectionRequest,
): Promise<UnregisterConnectionResponse> | Observable<UnregisterConnectionResponse> | UnregisterConnectionResponse;
publishEnvelope(
request: PublishEnvelopeRequest,
): Promise<PublishEnvelopeResponse> | Observable<PublishEnvelopeResponse> | PublishEnvelopeResponse;
publishPresence(
request: PublishPresenceRequest,
): Promise<PublishPresenceResponse> | Observable<PublishPresenceResponse> | PublishPresenceResponse;
publishTyping(
request: PublishTypingRequest,
): Promise<PublishTypingResponse> | Observable<PublishTypingResponse> | PublishTypingResponse;
listUserConnections(
request: ListUserConnectionsRequest,
): Promise<ListUserConnectionsResponse> | Observable<ListUserConnectionsResponse> | ListUserConnectionsResponse;
}
export function WsGatewayServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = [
"registerConnection",
"unregisterConnection",
"publishEnvelope",
"publishPresence",
"publishTyping",
"listUserConnections",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("WsGatewayService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("WsGatewayService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const WS_GATEWAY_SERVICE_NAME = "WsGatewayService";

101
gen/glifa/ws/v1/types.ts Normal file
View File

@@ -0,0 +1,101 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: glifa/ws/v1/types.proto
/* eslint-disable */
import { Any } from "../../../google/protobuf/any";
import { Timestamp } from "../../../google/protobuf/timestamp";
export const protobufPackage = "glifa.ws.v1";
export enum ConnectionStatus {
/** CONNECTION_STATUS_UNSPECIFIED - Неопределенный статус соединения */
CONNECTION_STATUS_UNSPECIFIED = 0,
/** CONNECTION_STATUS_CONNECTED - Соединение установлено и активно */
CONNECTION_STATUS_CONNECTED = 1,
/** CONNECTION_STATUS_DRAINING - Соединение находится в процессе завершения, и новые сообщения не принимаются, но существующие сообщения могут быть доставлены */
CONNECTION_STATUS_DRAINING = 2,
/** CONNECTION_STATUS_DISCONNECTED - Соединение было разорвано или потеряно */
CONNECTION_STATUS_DISCONNECTED = 3,
UNRECOGNIZED = -1,
}
export enum RealtimeEnvelopeKind {
/** REALTIME_ENVELOPE_KIND_UNSPECIFIED - Неопределенный тип конверта в реальном времени */
REALTIME_ENVELOPE_KIND_UNSPECIFIED = 0,
/** REALTIME_ENVELOPE_KIND_DURABLE - Конверт в реальном времени, который гарантирует доставку сообщения получателю, даже если он временно недоступен (например, из-за отключения от сети) */
REALTIME_ENVELOPE_KIND_DURABLE = 1,
/** REALTIME_ENVELOPE_KIND_EPHEMERAL - Конверт в реальном времени, который не гарантирует доставку сообщения получателю, если он временно недоступен (например, из-за отключения от сети), и может быть потерян в таких случаях */
REALTIME_ENVELOPE_KIND_EPHEMERAL = 2,
UNRECOGNIZED = -1,
}
export interface ConnectionInfo {
/** Уникальный идентификатор соединения, который может использоваться для отслеживания и управления соединением */
connectionId: string;
/** UUID пользователя, которому принадлежит это соединение */
userId: string;
/** UUID сессии, которая связана с этим соединением */
sessionId: string;
/** UUID устройства, с которого установлено это соединение */
deviceId: string;
/** Идентификатор узла, к которому подключено это соединение, если используется распределенная архитектура с несколькими узлами */
nodeId: string;
/** Текущий статус соединения (например, подключено, в процессе завершения, отключено) */
status: ConnectionStatus;
/** Временная метка, указывающая, когда это соединение было установлено */
connectedAt:
| Timestamp
| undefined;
/** Временная метка, указывающая, когда это соединение в последний раз было активно или получало сообщения */
lastSeenAt:
| Timestamp
| undefined;
/** Список подписок, на которые подписано это соединение, например, идентификаторы каналов или тем, на которые оно подписано для получения сообщений */
subscriptions: string[];
}
export interface RealtimeEnvelope {
/** Уникальный идентификатор конверта в реальном времени, который может использоваться для отслеживания и управления сообщениями */
envelopeId: string;
/** Тип конверта в реальном времени, который определяет гарантии доставки сообщения (например, долговременный или эфемерный) */
kind: RealtimeEnvelopeKind;
/** Тема или канал, на который это сообщение предназначено, и на который подписаны получатели, которые должны получить это сообщение */
topic: string;
/** Идентификатор агрегата, который может использоваться для группировки связанных сообщений вместе (например, все сообщения, относящиеся к одному чату или разговору) */
aggregateId: string;
/** Тип события, который описывает содержание или действие, связанное с этим сообщением (например, "message.created", "user.typing", "notification.new") */
eventType: string;
/** Версия схемы события, которая может использоваться для управления изменениями в структуре данных события с течением времени */
eventVersion: string;
/** Временная метка, указывающая, когда это событие произошло или было создано, что может использоваться для упорядочивания сообщений и управления временем жизни сообщений */
occurredAt:
| Timestamp
| undefined;
/** Полезная нагрузка сообщения, которая может содержать любые данные, связанные с этим событием, и может быть сериализована в формате JSON */
payload: Any | undefined;
}
export interface PresenceState {
/** UUID пользователя, чье присутствие отслеживается */
userId: string;
/** Статус присутствия пользователя (true - онлайн, false - офлайн) */
online: boolean;
/** Временная метка, указывающая, когда пользователь в последний раз был онлайн или активен */
lastSeenAt: Timestamp | undefined;
}
export interface TypingState {
/** UUID чата или канала, в котором пользователь печатает */
chatId: string;
/** UUID пользователя, который печатает */
userId: string;
/** UUID сессии пользователя, который печатает */
sessionId: string;
/** Временная метка, указывающая, когда статус печати должен истечь (например, если пользователь перестал печатать и не отправил сообщение в течение определенного времени) */
expiresAt: Timestamp | undefined;
}
export const GLIFA_WS_V1_PACKAGE_NAME = "glifa.ws.v1";

134
gen/google/protobuf/any.ts Normal file
View File

@@ -0,0 +1,134 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: google/protobuf/any.proto
/* eslint-disable */
export const protobufPackage = "google.protobuf";
/**
* `Any` contains an arbitrary serialized protocol buffer message along with a
* URL that describes the type of the serialized message.
*
* Protobuf library provides support to pack/unpack Any values in the form
* of utility functions or additional generated methods of the Any type.
*
* Example 1: Pack and unpack a message in C++.
*
* Foo foo = ...;
* Any any;
* any.PackFrom(foo);
* ...
* if (any.UnpackTo(&foo)) {
* ...
* }
*
* Example 2: Pack and unpack a message in Java.
*
* Foo foo = ...;
* Any any = Any.pack(foo);
* ...
* if (any.is(Foo.class)) {
* foo = any.unpack(Foo.class);
* }
* // or ...
* if (any.isSameTypeAs(Foo.getDefaultInstance())) {
* foo = any.unpack(Foo.getDefaultInstance());
* }
*
* Example 3: Pack and unpack a message in Python.
*
* foo = Foo(...)
* any = Any()
* any.Pack(foo)
* ...
* if any.Is(Foo.DESCRIPTOR):
* any.Unpack(foo)
* ...
*
* Example 4: Pack and unpack a message in Go
*
* foo := &pb.Foo{...}
* any, err := anypb.New(foo)
* if err != nil {
* ...
* }
* ...
* foo := &pb.Foo{}
* if err := any.UnmarshalTo(foo); err != nil {
* ...
* }
*
* The pack methods provided by protobuf library will by default use
* 'type.googleapis.com/full.type.name' as the type URL and the unpack
* methods only use the fully qualified type name after the last '/'
* in the type URL, for example "foo.bar.com/x/y.z" will yield type
* name "y.z".
*
* JSON
* ====
* The JSON representation of an `Any` value uses the regular
* representation of the deserialized, embedded message, with an
* additional field `@type` which contains the type URL. Example:
*
* package google.profile;
* message Person {
* string first_name = 1;
* string last_name = 2;
* }
*
* {
* "@type": "type.googleapis.com/google.profile.Person",
* "firstName": <string>,
* "lastName": <string>
* }
*
* If the embedded message type is well-known and has a custom JSON
* representation, that representation will be embedded adding a field
* `value` which holds the custom JSON in addition to the `@type`
* field. Example (for message [google.protobuf.Duration][]):
*
* {
* "@type": "type.googleapis.com/google.protobuf.Duration",
* "value": "1.212s"
* }
*/
export interface Any {
/**
* A URL/resource name that uniquely identifies the type of the serialized
* protocol buffer message. This string must contain at least
* one "/" character. The last segment of the URL's path must represent
* the fully qualified name of the type (as in
* `path/google.protobuf.Duration`). The name should be in a canonical form
* (e.g., leading "." is not accepted).
*
* In practice, teams usually precompile into the binary all types that they
* expect it to use in the context of Any. However, for URLs which use the
* scheme `http`, `https`, or no scheme, one can optionally set up a type
* server that maps type URLs to message definitions as follows:
*
* * If no scheme is provided, `https` is assumed.
* * An HTTP GET on the URL must yield a [google.protobuf.Type][]
* value in binary format, or produce an error.
* * Applications are allowed to cache lookup results based on the
* URL, or have them precompiled into a binary to avoid any
* lookup. Therefore, binary compatibility needs to be preserved
* on changes to types. (Use versioned type names to manage
* breaking changes.)
*
* Note: this functionality is not currently available in the official
* protobuf release, and it is not used for type URLs beginning with
* type.googleapis.com. As of May 2023, there are no widely used type server
* implementations and no plans to implement one.
*
* Schemes other than `http`, `https` (or the empty scheme) might be
* used with implementation specific semantics.
*/
typeUrl: string;
/** Must be a valid serialized protocol buffer of the above specified type. */
value: Uint8Array;
}
export const GOOGLE_PROTOBUF_PACKAGE_NAME = "google.protobuf";

View File

@@ -0,0 +1,197 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: google/protobuf/struct.proto
/* eslint-disable */
import { wrappers } from "protobufjs";
export const protobufPackage = "google.protobuf";
/**
* `NullValue` is a singleton enumeration to represent the null value for the
* `Value` type union.
*
* The JSON representation for `NullValue` is JSON `null`.
*/
export enum NullValue {
/** NULL_VALUE - Null value. */
NULL_VALUE = 0,
UNRECOGNIZED = -1,
}
/**
* `Struct` represents a structured data value, consisting of fields
* which map to dynamically typed values. In some languages, `Struct`
* might be supported by a native representation. For example, in
* scripting languages like JS a struct is represented as an
* object. The details of that representation are described together
* with the proto support for the language.
*
* The JSON representation for `Struct` is JSON object.
*/
export interface Struct {
/** Unordered map of dynamically typed values. */
fields: { [key: string]: any | undefined };
}
export interface Struct_FieldsEntry {
key: string;
value: any | undefined;
}
/**
* `Value` represents a dynamically typed value which can be either
* null, a number, a string, a boolean, a recursive struct value, or a
* list of values. A producer of value is expected to set one of these
* variants. Absence of any variant indicates an error.
*
* The JSON representation for `Value` is JSON value.
*/
export interface Value {
/** Represents a null value. */
nullValue?:
| NullValue
| undefined;
/** Represents a double value. */
numberValue?:
| number
| undefined;
/** Represents a string value. */
stringValue?:
| string
| undefined;
/** Represents a boolean value. */
boolValue?:
| boolean
| undefined;
/** Represents a structured value. */
structValue?:
| { [key: string]: any }
| undefined;
/** Represents a repeated `Value`. */
listValue?: Array<any> | undefined;
}
/**
* `ListValue` is a wrapper around a repeated field of values.
*
* The JSON representation for `ListValue` is JSON array.
*/
export interface ListValue {
/** Repeated field of dynamically typed values. */
values: any[];
}
export const GOOGLE_PROTOBUF_PACKAGE_NAME = "google.protobuf";
function createBaseStruct(): Struct {
return { fields: {} };
}
export const Struct: MessageFns<Struct> & StructWrapperFns = {
wrap(object: { [key: string]: any } | undefined): Struct {
const struct = createBaseStruct();
if (object !== undefined) {
for (const key of globalThis.Object.keys(object)) {
struct.fields[key] = Value.wrap(object[key]);
}
}
return struct;
},
unwrap(message: Struct): { [key: string]: any } {
const object: { [key: string]: any } = {};
if (message.fields) {
for (const key of globalThis.Object.keys(message.fields)) {
object[key] = Value.unwrap(message.fields[key]);
}
}
return object;
},
};
function createBaseValue(): Value {
return {};
}
export const Value: MessageFns<Value> & AnyValueWrapperFns = {
wrap(value: any): Value {
const result = {} as any;
if (value === null) {
result.nullValue = NullValue.NULL_VALUE;
} else if (typeof value === "boolean") {
result.boolValue = value;
} else if (typeof value === "number") {
result.numberValue = value;
} else if (typeof value === "string") {
result.stringValue = value;
} else if (globalThis.Array.isArray(value)) {
result.listValue = ListValue.wrap(value);
} else if (typeof value === "object") {
result.structValue = Struct.wrap(value);
} else if (typeof value !== "undefined") {
throw new globalThis.Error("Unsupported any value type: " + typeof value);
}
return result;
},
unwrap(message: any): string | number | boolean | Object | null | Array<any> | undefined {
if (message?.hasOwnProperty("stringValue") && message.stringValue !== undefined) {
return message.stringValue;
} else if (message?.hasOwnProperty("numberValue") && message?.numberValue !== undefined) {
return message.numberValue;
} else if (message?.hasOwnProperty("boolValue") && message?.boolValue !== undefined) {
return message.boolValue;
} else if (message?.hasOwnProperty("structValue") && message?.structValue !== undefined) {
return Struct.unwrap(message.structValue as any);
} else if (message?.hasOwnProperty("listValue") && message?.listValue !== undefined) {
return ListValue.unwrap(message.listValue);
} else if (message?.hasOwnProperty("nullValue") && message?.nullValue !== undefined) {
return null;
}
return undefined;
},
};
function createBaseListValue(): ListValue {
return { values: [] };
}
export const ListValue: MessageFns<ListValue> & ListValueWrapperFns = {
wrap(array: Array<any> | undefined): ListValue {
const result = createBaseListValue();
result.values = (array ?? []).map(Value.wrap);
return result;
},
unwrap(message: ListValue): Array<any> {
if (message?.hasOwnProperty("values") && globalThis.Array.isArray(message.values)) {
return message.values.map(Value.unwrap);
} else {
return message as any;
}
},
};
wrappers[".google.protobuf.Struct"] = { fromObject: Struct.wrap, toObject: Struct.unwrap } as any;
export interface MessageFns<T> {
}
export interface StructWrapperFns {
wrap(object: { [key: string]: any } | undefined): Struct;
unwrap(message: Struct): { [key: string]: any };
}
export interface AnyValueWrapperFns {
wrap(value: any): Value;
unwrap(message: any): string | number | boolean | Object | null | Array<any> | undefined;
}
export interface ListValueWrapperFns {
wrap(array: Array<any> | undefined): ListValue;
unwrap(message: ListValue): Array<any>;
}

View File

@@ -0,0 +1,118 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: google/protobuf/timestamp.proto
/* eslint-disable */
export const protobufPackage = "google.protobuf";
/**
* A Timestamp represents a point in time independent of any time zone or local
* calendar, encoded as a count of seconds and fractions of seconds at
* nanosecond resolution. The count is relative to an epoch at UTC midnight on
* January 1, 1970, in the proleptic Gregorian calendar which extends the
* Gregorian calendar backwards to year one.
*
* All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
* second table is needed for interpretation, using a [24-hour linear
* smear](https://developers.google.com/time/smear).
*
* The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
* restricting to that range, we ensure that we can convert to and from [RFC
* 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
*
* # Examples
*
* Example 1: Compute Timestamp from POSIX `time()`.
*
* Timestamp timestamp;
* timestamp.set_seconds(time(NULL));
* timestamp.set_nanos(0);
*
* Example 2: Compute Timestamp from POSIX `gettimeofday()`.
*
* struct timeval tv;
* gettimeofday(&tv, NULL);
*
* Timestamp timestamp;
* timestamp.set_seconds(tv.tv_sec);
* timestamp.set_nanos(tv.tv_usec * 1000);
*
* Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
*
* FILETIME ft;
* GetSystemTimeAsFileTime(&ft);
* UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
*
* // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
* // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
* Timestamp timestamp;
* timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
* timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
*
* Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
*
* long millis = System.currentTimeMillis();
*
* Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
* .setNanos((int) ((millis % 1000) * 1000000)).build();
*
* Example 5: Compute Timestamp from Java `Instant.now()`.
*
* Instant now = Instant.now();
*
* Timestamp timestamp =
* Timestamp.newBuilder().setSeconds(now.getEpochSecond())
* .setNanos(now.getNano()).build();
*
* Example 6: Compute Timestamp from current time in Python.
*
* timestamp = Timestamp()
* timestamp.GetCurrentTime()
*
* # JSON Mapping
*
* In JSON format, the Timestamp type is encoded as a string in the
* [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
* format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
* where {year} is always expressed using four digits while {month}, {day},
* {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
* seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
* are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
* is required. A proto3 JSON serializer should always use UTC (as indicated by
* "Z") when printing the Timestamp type and a proto3 JSON parser should be
* able to accept both UTC and other timezones (as indicated by an offset).
*
* For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
* 01:30 UTC on January 15, 2017.
*
* In JavaScript, one can convert a Date object to this format using the
* standard
* [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
* method. In Python, a standard `datetime.datetime` object can be converted
* to this format using
* [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
* the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
* the Joda Time's [`ISODateTimeFormat.dateTime()`](
* http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
* ) to obtain a formatter capable of generating timestamps in this format.
*/
export interface Timestamp {
/**
* Represents seconds of UTC time since Unix epoch
* 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
* 9999-12-31T23:59:59Z inclusive.
*/
seconds: number;
/**
* Non-negative fractions of a second at nanosecond resolution. Negative
* second values with fractions must still have non-negative nanos values
* that count forward in time. Must be from 0 to 999,999,999
* inclusive.
*/
nanos: number;
}
export const GOOGLE_PROTOBUF_PACKAGE_NAME = "google.protobuf";