Fix ClickHouse int encoding; generate protobuf at build time

- adv_timestamp is a uint32 epoch in ClickHouse; type it uint32 (was string,
  which failed JSON encoding with "expected string, got <number>").
- ClickHouse serializes UInt64/aggregate columns (count(), message_count,
  packet_count, advert_count) as JSON strings. Coerce every integer field with
  a num() helper before building int32 proto messages, fixing intermittent
  "expected number (int32), got \"97\"" errors on GetChat/GetNode/etc.
- Stop committing generated code: gitignore src/gen and regenerate it via a
  `prebuild` (buf generate) step so `npm run build` always produces it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alex Vanderpot
2026-05-29 04:14:43 -04:00
parent 5e00946834
commit da838d679a
15 changed files with 47 additions and 6739 deletions
+3
View File
@@ -39,3 +39,6 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts
# generated protobuf / ConnectRPC code (produced by `npm run generate`, run on build)
/src/gen
+1
View File
@@ -4,6 +4,7 @@
"private": true,
"scripts": {
"dev": "next dev",
"prebuild": "buf generate --include-imports",
"build": "next build",
"start": "next start",
"lint": "next lint",
@@ -30,7 +30,8 @@ message OriginPathPubkeyTuple {
// An advert grouped by packet_hash, with all the paths it was heard over.
message Advert {
string adv_timestamp = 1;
// Unix epoch seconds from the meshcore advert (uint32 in ClickHouse).
uint32 adv_timestamp = 1;
repeated OriginPathPubkeyTuple origin_path_pubkey_tuples = 2;
int32 advert_count = 3;
string earliest_timestamp = 4;
File diff suppressed because one or more lines are too long
@@ -1,292 +0,0 @@
// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none"
// @generated from file meshexplorer/v1/chat.proto (package meshexplorer.v1, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import { file_buf_validate_validate } from "../../buf/validate/validate_pb";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file meshexplorer/v1/chat.proto.
*/
export const file_meshexplorer_v1_chat: GenFile = /*@__PURE__*/
fileDesc("ChptZXNoZXhwbG9yZXIvdjEvY2hhdC5wcm90bxIPbWVzaGV4cGxvcmVyLnYxImQKDk9yaWdpblBhdGhJbmZvEg4KBm9yaWdpbhgBIAEoCRIVCg1vcmlnaW5fcHVia2V5GAIgASgJEgwKBHBhdGgYAyABKAkSDgoGYnJva2VyGAQgASgJEg0KBXRvcGljGAUgASgJImQKDURlY3J5cHRlZENoYXQSEQoJdGltZXN0YW1wGAEgASgBEhAKCG1zZ190eXBlGAIgASgFEg4KBnNlbmRlchgDIAEoCRIMCgR0ZXh0GAQgASgJEhAKCHJhd190ZXh0GAUgASgJIqkCCgtDaGF0TWVzc2FnZRIYChBpbmdlc3RfdGltZXN0YW1wGAEgASgJEhYKDm1lc2hfdGltZXN0YW1wGAIgASgJEhQKDGNoYW5uZWxfaGFzaBgDIAEoCRILCgNtYWMYBCABKAkSGQoRZW5jcnlwdGVkX21lc3NhZ2UYBSABKAkSFQoNbWVzc2FnZV9jb3VudBgGIAEoBRI5ChBvcmlnaW5fcGF0aF9pbmZvGAcgAygLMh8ubWVzaGV4cGxvcmVyLnYxLk9yaWdpblBhdGhJbmZvEhIKCm1lc3NhZ2VfaWQYCCABKAkSNgoJZGVjcnlwdGVkGAkgASgLMh4ubWVzaGV4cGxvcmVyLnYxLkRlY3J5cHRlZENoYXRIAIgBAUIMCgpfZGVjcnlwdGVkIv4BCg5HZXRDaGF0UmVxdWVzdBIeCgVsaW1pdBgBIAEoBUIKukgHGgUY6AcoAUgAiAEBEhMKBmJlZm9yZRgCIAEoCUgBiAEBEhIKBWFmdGVyGAMgASgJSAKIAQESLgoKY2hhbm5lbF9pZBgEIAEoCUIVukgSchAyDl5bMC05QS1GYS1mXSskSAOIAQESEwoGcmVnaW9uGAUgASgJSASIAQESDwoHZGVjcnlwdBgGIAEoCBIUCgxwcml2YXRlX2tleXMYByADKAlCCAoGX2xpbWl0QgkKB19iZWZvcmVCCAoGX2FmdGVyQg0KC19jaGFubmVsX2lkQgkKB19yZWdpb24iQQoPR2V0Q2hhdFJlc3BvbnNlEi4KCG1lc3NhZ2VzGAEgAygLMhwubWVzaGV4cGxvcmVyLnYxLkNoYXRNZXNzYWdlIqICChFTdHJlYW1DaGF0UmVxdWVzdBIuCgpjaGFubmVsX2lkGAEgASgJQhW6SBJyEDIOXlswLTlBLUZhLWZdKyRIAIgBARITCgZyZWdpb24YAiABKAlIAYgBARIPCgdkZWNyeXB0GAMgASgIEhQKDHByaXZhdGVfa2V5cxgEIAMoCRImCg1wb2xsX2ludGVydmFsGAUgASgFQgq6SAcaBRiQTihkSAKIAQESIQoIbWF4X3Jvd3MYBiABKAVCCrpIBxoFGOgHKApIA4gBARIdChVza2lwX2luaXRpYWxfbWVzc2FnZXMYByABKAhCDQoLX2NoYW5uZWxfaWRCCQoHX3JlZ2lvbkIQCg5fcG9sbF9pbnRlcnZhbEILCglfbWF4X3Jvd3MyrQEKC0NoYXRTZXJ2aWNlEkwKB0dldENoYXQSHy5tZXNoZXhwbG9yZXIudjEuR2V0Q2hhdFJlcXVlc3QaIC5tZXNoZXhwbG9yZXIudjEuR2V0Q2hhdFJlc3BvbnNlElAKClN0cmVhbUNoYXQSIi5tZXNoZXhwbG9yZXIudjEuU3RyZWFtQ2hhdFJlcXVlc3QaHC5tZXNoZXhwbG9yZXIudjEuQ2hhdE1lc3NhZ2UwAWIGcHJvdG8z", [file_buf_validate_validate]);
/**
* One (origin, origin_pubkey, path, broker, topic) reception tuple.
*
* @generated from message meshexplorer.v1.OriginPathInfo
*/
export type OriginPathInfo = Message<"meshexplorer.v1.OriginPathInfo"> & {
/**
* @generated from field: string origin = 1;
*/
origin: string;
/**
* @generated from field: string origin_pubkey = 2;
*/
originPubkey: string;
/**
* @generated from field: string path = 3;
*/
path: string;
/**
* @generated from field: string broker = 4;
*/
broker: string;
/**
* @generated from field: string topic = 5;
*/
topic: string;
};
/**
* Describes the message meshexplorer.v1.OriginPathInfo.
* Use `create(OriginPathInfoSchema)` to create a new message.
*/
export const OriginPathInfoSchema: GenMessage<OriginPathInfo> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_chat, 0);
/**
* A parsed/decrypted public-channel message (parseMeshcoreGroupMessage).
*
* @generated from message meshexplorer.v1.DecryptedChat
*/
export type DecryptedChat = Message<"meshexplorer.v1.DecryptedChat"> & {
/**
* @generated from field: double timestamp = 1;
*/
timestamp: number;
/**
* @generated from field: int32 msg_type = 2;
*/
msgType: number;
/**
* @generated from field: string sender = 3;
*/
sender: string;
/**
* @generated from field: string text = 4;
*/
text: string;
/**
* @generated from field: string raw_text = 5;
*/
rawText: string;
};
/**
* Describes the message meshexplorer.v1.DecryptedChat.
* Use `create(DecryptedChatSchema)` to create a new message.
*/
export const DecryptedChatSchema: GenMessage<DecryptedChat> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_chat, 1);
/**
* @generated from message meshexplorer.v1.ChatMessage
*/
export type ChatMessage = Message<"meshexplorer.v1.ChatMessage"> & {
/**
* @generated from field: string ingest_timestamp = 1;
*/
ingestTimestamp: string;
/**
* @generated from field: string mesh_timestamp = 2;
*/
meshTimestamp: string;
/**
* @generated from field: string channel_hash = 3;
*/
channelHash: string;
/**
* @generated from field: string mac = 4;
*/
mac: string;
/**
* Hex-encoded ciphertext.
*
* @generated from field: string encrypted_message = 5;
*/
encryptedMessage: string;
/**
* @generated from field: int32 message_count = 6;
*/
messageCount: number;
/**
* @generated from field: repeated meshexplorer.v1.OriginPathInfo origin_path_info = 7;
*/
originPathInfo: OriginPathInfo[];
/**
* @generated from field: string message_id = 8;
*/
messageId: string;
/**
* Present only when decrypt was requested and decryption succeeded.
*
* @generated from field: optional meshexplorer.v1.DecryptedChat decrypted = 9;
*/
decrypted?: DecryptedChat | undefined;
};
/**
* Describes the message meshexplorer.v1.ChatMessage.
* Use `create(ChatMessageSchema)` to create a new message.
*/
export const ChatMessageSchema: GenMessage<ChatMessage> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_chat, 2);
/**
* @generated from message meshexplorer.v1.GetChatRequest
*/
export type GetChatRequest = Message<"meshexplorer.v1.GetChatRequest"> & {
/**
* @generated from field: optional int32 limit = 1;
*/
limit?: number | undefined;
/**
* @generated from field: optional string before = 2;
*/
before?: string | undefined;
/**
* @generated from field: optional string after = 3;
*/
after?: string | undefined;
/**
* @generated from field: optional string channel_id = 4;
*/
channelId?: string | undefined;
/**
* @generated from field: optional string region = 5;
*/
region?: string | undefined;
/**
* @generated from field: bool decrypt = 6;
*/
decrypt: boolean;
/**
* @generated from field: repeated string private_keys = 7;
*/
privateKeys: string[];
};
/**
* Describes the message meshexplorer.v1.GetChatRequest.
* Use `create(GetChatRequestSchema)` to create a new message.
*/
export const GetChatRequestSchema: GenMessage<GetChatRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_chat, 3);
/**
* @generated from message meshexplorer.v1.GetChatResponse
*/
export type GetChatResponse = Message<"meshexplorer.v1.GetChatResponse"> & {
/**
* @generated from field: repeated meshexplorer.v1.ChatMessage messages = 1;
*/
messages: ChatMessage[];
};
/**
* Describes the message meshexplorer.v1.GetChatResponse.
* Use `create(GetChatResponseSchema)` to create a new message.
*/
export const GetChatResponseSchema: GenMessage<GetChatResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_chat, 4);
/**
* @generated from message meshexplorer.v1.StreamChatRequest
*/
export type StreamChatRequest = Message<"meshexplorer.v1.StreamChatRequest"> & {
/**
* @generated from field: optional string channel_id = 1;
*/
channelId?: string | undefined;
/**
* @generated from field: optional string region = 2;
*/
region?: string | undefined;
/**
* @generated from field: bool decrypt = 3;
*/
decrypt: boolean;
/**
* @generated from field: repeated string private_keys = 4;
*/
privateKeys: string[];
/**
* Poll interval in ms (clamped 100..10000, default 1000).
*
* @generated from field: optional int32 poll_interval = 5;
*/
pollInterval?: number | undefined;
/**
* Max rows per poll (clamped 10..1000, default 500).
*
* @generated from field: optional int32 max_rows = 6;
*/
maxRows?: number | undefined;
/**
* @generated from field: bool skip_initial_messages = 7;
*/
skipInitialMessages: boolean;
};
/**
* Describes the message meshexplorer.v1.StreamChatRequest.
* Use `create(StreamChatRequestSchema)` to create a new message.
*/
export const StreamChatRequestSchema: GenMessage<StreamChatRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_chat, 5);
/**
* @generated from service meshexplorer.v1.ChatService
*/
export const ChatService: GenService<{
/**
* @generated from rpc meshexplorer.v1.ChatService.GetChat
*/
getChat: {
methodKind: "unary";
input: typeof GetChatRequestSchema;
output: typeof GetChatResponseSchema;
},
/**
* @generated from rpc meshexplorer.v1.ChatService.StreamChat
*/
streamChat: {
methodKind: "server_streaming";
input: typeof StreamChatRequestSchema;
output: typeof ChatMessageSchema;
},
}> = /*@__PURE__*/
serviceDesc(file_meshexplorer_v1_chat, 0);
@@ -1,90 +0,0 @@
// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none"
// @generated from file meshexplorer/v1/common.proto (package meshexplorer.v1, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file meshexplorer/v1/common.proto.
*/
export const file_meshexplorer_v1_common: GenFile = /*@__PURE__*/
fileDesc("ChxtZXNoZXhwbG9yZXIvdjEvY29tbW9uLnByb3RvEg9tZXNoZXhwbG9yZXIudjEisQIKDE5laWdoYm9yRWRnZRITCgtzb3VyY2Vfbm9kZRgBIAEoCRITCgt0YXJnZXRfbm9kZRgCIAEoCRIXCg9jb25uZWN0aW9uX3R5cGUYAyABKAkSFAoMcGFja2V0X2NvdW50GAQgASgFEhMKC3NvdXJjZV9uYW1lGAUgASgJEhcKD3NvdXJjZV9sYXRpdHVkZRgGIAEoARIYChBzb3VyY2VfbG9uZ2l0dWRlGAcgASgBEhsKE3NvdXJjZV9oYXNfbG9jYXRpb24YCCABKAUSEwoLdGFyZ2V0X25hbWUYCSABKAkSFwoPdGFyZ2V0X2xhdGl0dWRlGAogASgBEhgKEHRhcmdldF9sb25naXR1ZGUYCyABKAESGwoTdGFyZ2V0X2hhc19sb2NhdGlvbhgMIAEoBWIGcHJvdG8z");
/**
* A directed edge in the neighbor graph between two located nodes.
* Shared by MapService.GetMap (when includeNeighbors=true) and
* NeighborsService.GetAllNeighbors. Mirrors meshcore_all_neighbor_edges.
*
* @generated from message meshexplorer.v1.NeighborEdge
*/
export type NeighborEdge = Message<"meshexplorer.v1.NeighborEdge"> & {
/**
* @generated from field: string source_node = 1;
*/
sourceNode: string;
/**
* @generated from field: string target_node = 2;
*/
targetNode: string;
/**
* @generated from field: string connection_type = 3;
*/
connectionType: string;
/**
* @generated from field: int32 packet_count = 4;
*/
packetCount: number;
/**
* @generated from field: string source_name = 5;
*/
sourceName: string;
/**
* @generated from field: double source_latitude = 6;
*/
sourceLatitude: number;
/**
* @generated from field: double source_longitude = 7;
*/
sourceLongitude: number;
/**
* @generated from field: int32 source_has_location = 8;
*/
sourceHasLocation: number;
/**
* @generated from field: string target_name = 9;
*/
targetName: string;
/**
* @generated from field: double target_latitude = 10;
*/
targetLatitude: number;
/**
* @generated from field: double target_longitude = 11;
*/
targetLongitude: number;
/**
* @generated from field: int32 target_has_location = 12;
*/
targetHasLocation: number;
};
/**
* Describes the message meshexplorer.v1.NeighborEdge.
* Use `create(NeighborEdgeSchema)` to create a new message.
*/
export const NeighborEdgeSchema: GenMessage<NeighborEdge> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_common, 0);
@@ -1,169 +0,0 @@
// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none"
// @generated from file meshexplorer/v1/map.proto (package meshexplorer.v1, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import { file_buf_validate_validate } from "../../buf/validate/validate_pb";
import type { NeighborEdge } from "./common_pb";
import { file_meshexplorer_v1_common } from "./common_pb";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file meshexplorer/v1/map.proto.
*/
export const file_meshexplorer_v1_map: GenFile = /*@__PURE__*/
fileDesc("ChltZXNoZXhwbG9yZXIvdjEvbWFwLnByb3RvEg9tZXNoZXhwbG9yZXIudjEi0QEKDE5vZGVQb3NpdGlvbhIPCgdub2RlX2lkGAEgASgJEhEKBG5hbWUYAiABKAlIAIgBARIXCgpzaG9ydF9uYW1lGAMgASgJSAGIAQESEAoIbGF0aXR1ZGUYBCABKAESEQoJbG9uZ2l0dWRlGAUgASgBEhEKCWxhc3Rfc2VlbhgGIAEoCRIXCgpmaXJzdF9zZWVuGAcgASgJSAKIAQESDAoEdHlwZRgIIAEoCUIHCgVfbmFtZUINCgtfc2hvcnRfbmFtZUINCgtfZmlyc3Rfc2VlbiL5AgoNR2V0TWFwUmVxdWVzdBItCgdtaW5fbGF0GAEgASgBQhe6SBQSEhkAAAAAAIBWQCkAAAAAAIBWwEgAiAEBEi0KB21heF9sYXQYAiABKAFCF7pIFBISGQAAAAAAgFZAKQAAAAAAgFbASAGIAQESLQoHbWluX2xuZxgDIAEoAUIXukgUEhIZAAAAAACAZkApAAAAAACAZsBIAogBARItCgdtYXhfbG5nGAQgASgBQhe6SBQSEhkAAAAAAIBmQCkAAAAAAIBmwEgDiAEBEhIKCm5vZGVfdHlwZXMYBSADKAkSHwoJbGFzdF9zZWVuGAYgASgFQge6SAQaAigASASIAQESEwoGcmVnaW9uGAcgASgJSAWIAQESGQoRaW5jbHVkZV9uZWlnaGJvcnMYCCABKAhCCgoIX21pbl9sYXRCCgoIX21heF9sYXRCCgoIX21pbl9sbmdCCgoIX21heF9sbmdCDAoKX2xhc3Rfc2VlbkIJCgdfcmVnaW9uInAKDkdldE1hcFJlc3BvbnNlEiwKBW5vZGVzGAEgAygLMh0ubWVzaGV4cGxvcmVyLnYxLk5vZGVQb3NpdGlvbhIwCgluZWlnaGJvcnMYAiADKAsyHS5tZXNoZXhwbG9yZXIudjEuTmVpZ2hib3JFZGdlMlcKCk1hcFNlcnZpY2USSQoGR2V0TWFwEh4ubWVzaGV4cGxvcmVyLnYxLkdldE1hcFJlcXVlc3QaHy5tZXNoZXhwbG9yZXIudjEuR2V0TWFwUmVzcG9uc2ViBnByb3RvMw", [file_buf_validate_validate, file_meshexplorer_v1_common]);
/**
* Latest known position of a node. Mirrors unified_latest_nodeinfo rows
* returned by getNodePositions().
*
* @generated from message meshexplorer.v1.NodePosition
*/
export type NodePosition = Message<"meshexplorer.v1.NodePosition"> & {
/**
* @generated from field: string node_id = 1;
*/
nodeId: string;
/**
* @generated from field: optional string name = 2;
*/
name?: string | undefined;
/**
* @generated from field: optional string short_name = 3;
*/
shortName?: string | undefined;
/**
* @generated from field: double latitude = 4;
*/
latitude: number;
/**
* @generated from field: double longitude = 5;
*/
longitude: number;
/**
* @generated from field: string last_seen = 6;
*/
lastSeen: string;
/**
* @generated from field: optional string first_seen = 7;
*/
firstSeen?: string | undefined;
/**
* @generated from field: string type = 8;
*/
type: string;
};
/**
* Describes the message meshexplorer.v1.NodePosition.
* Use `create(NodePositionSchema)` to create a new message.
*/
export const NodePositionSchema: GenMessage<NodePosition> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_map, 0);
/**
* @generated from message meshexplorer.v1.GetMapRequest
*/
export type GetMapRequest = Message<"meshexplorer.v1.GetMapRequest"> & {
/**
* Bounding box (decimal degrees). Unset fields mean "unbounded" on that edge.
*
* @generated from field: optional double min_lat = 1;
*/
minLat?: number | undefined;
/**
* @generated from field: optional double max_lat = 2;
*/
maxLat?: number | undefined;
/**
* @generated from field: optional double min_lng = 3;
*/
minLng?: number | undefined;
/**
* @generated from field: optional double max_lng = 4;
*/
maxLng?: number | undefined;
/**
* @generated from field: repeated string node_types = 5;
*/
nodeTypes: string[];
/**
* Only include nodes seen within this many seconds.
*
* @generated from field: optional int32 last_seen = 6;
*/
lastSeen?: number | undefined;
/**
* @generated from field: optional string region = 7;
*/
region?: string | undefined;
/**
* When true, also compute and return the neighbor edge graph.
*
* @generated from field: bool include_neighbors = 8;
*/
includeNeighbors: boolean;
};
/**
* Describes the message meshexplorer.v1.GetMapRequest.
* Use `create(GetMapRequestSchema)` to create a new message.
*/
export const GetMapRequestSchema: GenMessage<GetMapRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_map, 1);
/**
* @generated from message meshexplorer.v1.GetMapResponse
*/
export type GetMapResponse = Message<"meshexplorer.v1.GetMapResponse"> & {
/**
* @generated from field: repeated meshexplorer.v1.NodePosition nodes = 1;
*/
nodes: NodePosition[];
/**
* Populated only when include_neighbors was set on the request.
*
* @generated from field: repeated meshexplorer.v1.NeighborEdge neighbors = 2;
*/
neighbors: NeighborEdge[];
};
/**
* Describes the message meshexplorer.v1.GetMapResponse.
* Use `create(GetMapResponseSchema)` to create a new message.
*/
export const GetMapResponseSchema: GenMessage<GetMapResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_map, 2);
/**
* @generated from service meshexplorer.v1.MapService
*/
export const MapService: GenService<{
/**
* @generated from rpc meshexplorer.v1.MapService.GetMap
*/
getMap: {
methodKind: "unary";
input: typeof GetMapRequestSchema;
output: typeof GetMapResponseSchema;
},
}> = /*@__PURE__*/
serviceDesc(file_meshexplorer_v1_map, 0);
@@ -1,96 +0,0 @@
// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none"
// @generated from file meshexplorer/v1/neighbors.proto (package meshexplorer.v1, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import { file_buf_validate_validate } from "../../buf/validate/validate_pb";
import type { NeighborEdge } from "./common_pb";
import { file_meshexplorer_v1_common } from "./common_pb";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file meshexplorer/v1/neighbors.proto.
*/
export const file_meshexplorer_v1_neighbors: GenFile = /*@__PURE__*/
fileDesc("Ch9tZXNoZXhwbG9yZXIvdjEvbmVpZ2hib3JzLnByb3RvEg9tZXNoZXhwbG9yZXIudjEi5wIKFkdldEFsbE5laWdoYm9yc1JlcXVlc3QSLQoHbWluX2xhdBgBIAEoAUIXukgUEhIZAAAAAACAVkApAAAAAACAVsBIAIgBARItCgdtYXhfbGF0GAIgASgBQhe6SBQSEhkAAAAAAIBWQCkAAAAAAIBWwEgBiAEBEi0KB21pbl9sbmcYAyABKAFCF7pIFBISGQAAAAAAgGZAKQAAAAAAgGbASAKIAQESLQoHbWF4X2xuZxgEIAEoAUIXukgUEhIZAAAAAACAZkApAAAAAACAZsBIA4gBARISCgpub2RlX3R5cGVzGAUgAygJEh8KCWxhc3Rfc2VlbhgGIAEoBUIHukgEGgIoAEgEiAEBEhMKBnJlZ2lvbhgHIAEoCUgFiAEBQgoKCF9taW5fbGF0QgoKCF9tYXhfbGF0QgoKCF9taW5fbG5nQgoKCF9tYXhfbG5nQgwKCl9sYXN0X3NlZW5CCQoHX3JlZ2lvbiJLChdHZXRBbGxOZWlnaGJvcnNSZXNwb25zZRIwCgluZWlnaGJvcnMYASADKAsyHS5tZXNoZXhwbG9yZXIudjEuTmVpZ2hib3JFZGdlMngKEE5laWdoYm9yc1NlcnZpY2USZAoPR2V0QWxsTmVpZ2hib3JzEicubWVzaGV4cGxvcmVyLnYxLkdldEFsbE5laWdoYm9yc1JlcXVlc3QaKC5tZXNoZXhwbG9yZXIudjEuR2V0QWxsTmVpZ2hib3JzUmVzcG9uc2ViBnByb3RvMw", [file_buf_validate_validate, file_meshexplorer_v1_common]);
/**
* @generated from message meshexplorer.v1.GetAllNeighborsRequest
*/
export type GetAllNeighborsRequest = Message<"meshexplorer.v1.GetAllNeighborsRequest"> & {
/**
* @generated from field: optional double min_lat = 1;
*/
minLat?: number | undefined;
/**
* @generated from field: optional double max_lat = 2;
*/
maxLat?: number | undefined;
/**
* @generated from field: optional double min_lng = 3;
*/
minLng?: number | undefined;
/**
* @generated from field: optional double max_lng = 4;
*/
maxLng?: number | undefined;
/**
* @generated from field: repeated string node_types = 5;
*/
nodeTypes: string[];
/**
* @generated from field: optional int32 last_seen = 6;
*/
lastSeen?: number | undefined;
/**
* @generated from field: optional string region = 7;
*/
region?: string | undefined;
};
/**
* Describes the message meshexplorer.v1.GetAllNeighborsRequest.
* Use `create(GetAllNeighborsRequestSchema)` to create a new message.
*/
export const GetAllNeighborsRequestSchema: GenMessage<GetAllNeighborsRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_neighbors, 0);
/**
* @generated from message meshexplorer.v1.GetAllNeighborsResponse
*/
export type GetAllNeighborsResponse = Message<"meshexplorer.v1.GetAllNeighborsResponse"> & {
/**
* @generated from field: repeated meshexplorer.v1.NeighborEdge neighbors = 1;
*/
neighbors: NeighborEdge[];
};
/**
* Describes the message meshexplorer.v1.GetAllNeighborsResponse.
* Use `create(GetAllNeighborsResponseSchema)` to create a new message.
*/
export const GetAllNeighborsResponseSchema: GenMessage<GetAllNeighborsResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_neighbors, 1);
/**
* @generated from service meshexplorer.v1.NeighborsService
*/
export const NeighborsService: GenService<{
/**
* @generated from rpc meshexplorer.v1.NeighborsService.GetAllNeighbors
*/
getAllNeighbors: {
methodKind: "unary";
input: typeof GetAllNeighborsRequestSchema;
output: typeof GetAllNeighborsResponseSchema;
},
}> = /*@__PURE__*/
serviceDesc(file_meshexplorer_v1_neighbors, 0);
@@ -1,654 +0,0 @@
// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none"
// @generated from file meshexplorer/v1/node.proto (package meshexplorer.v1, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import { file_buf_validate_validate } from "../../buf/validate/validate_pb";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file meshexplorer/v1/node.proto.
*/
export const file_meshexplorer_v1_node: GenFile = /*@__PURE__*/
fileDesc("ChptZXNoZXhwbG9yZXIvdjEvbm9kZS5wcm90bxIPbWVzaGV4cGxvcmVyLnYxIssCCghOb2RlSW5mbxISCgpwdWJsaWNfa2V5GAEgASgJEhEKCW5vZGVfbmFtZRgCIAEoCRIVCghsYXRpdHVkZRgDIAEoAUgAiAEBEhYKCWxvbmdpdHVkZRgEIAEoAUgBiAEBEhQKDGhhc19sb2NhdGlvbhgFIAEoBRITCgtpc19yZXBlYXRlchgGIAEoBRIUCgxpc19jaGF0X25vZGUYByABKAUSFgoOaXNfcm9vbV9zZXJ2ZXIYCCABKAUSEAoIaGFzX25hbWUYCSABKAUSEwoGYnJva2VyGAogASgJSAKIAQESEgoFdG9waWMYCyABKAlIA4gBARISCgpmaXJzdF9zZWVuGAwgASgJEhEKCWxhc3Rfc2VlbhgNIAEoCUILCglfbGF0aXR1ZGVCDAoKX2xvbmdpdHVkZUIJCgdfYnJva2VyQggKBl90b3BpYyJMChVPcmlnaW5QYXRoUHVia2V5VHVwbGUSDgoGb3JpZ2luGAEgASgJEgwKBHBhdGgYAiABKAkSFQoNb3JpZ2luX3B1YmtleRgDIAEoCSLuAgoGQWR2ZXJ0EhUKDWFkdl90aW1lc3RhbXAYASABKAkSSQoZb3JpZ2luX3BhdGhfcHVia2V5X3R1cGxlcxgCIAMoCzImLm1lc2hleHBsb3Jlci52MS5PcmlnaW5QYXRoUHVia2V5VHVwbGUSFAoMYWR2ZXJ0X2NvdW50GAMgASgFEhoKEmVhcmxpZXN0X3RpbWVzdGFtcBgEIAEoCRIYChBsYXRlc3RfdGltZXN0YW1wGAUgASgJEhUKCGxhdGl0dWRlGAYgASgBSACIAQESFgoJbG9uZ2l0dWRlGAcgASgBSAGIAQESEwoLaXNfcmVwZWF0ZXIYCCABKAUSFAoMaXNfY2hhdF9ub2RlGAkgASgFEhYKDmlzX3Jvb21fc2VydmVyGAogASgFEhQKDGhhc19sb2NhdGlvbhgLIAEoBRITCgtwYWNrZXRfaGFzaBgMIAEoCUILCglfbGF0aXR1ZGVCDAoKX2xvbmdpdHVkZSJOCg9Mb2NhdGlvbkhpc3RvcnkSFgoObWVzaF90aW1lc3RhbXAYASABKAkSEAoIbGF0aXR1ZGUYAiABKAESEQoJbG9uZ2l0dWRlGAMgASgBIlcKCU1xdHRUb3BpYxINCgV0b3BpYxgBIAEoCRIOCgZicm9rZXIYAiABKAkSGAoQbGFzdF9wYWNrZXRfdGltZRgDIAEoCRIRCglpc19yZWNlbnQYBCABKAgiYAoITXF0dEluZm8SEwoLaXNfdXBsaW5rZWQYASABKAgSEwoLaGFzX3BhY2tldHMYAiABKAgSKgoGdG9waWNzGAMgAygLMhoubWVzaGV4cGxvcmVyLnYxLk1xdHRUb3BpYyJXCg5HZXROb2RlUmVxdWVzdBIbCgpwdWJsaWNfa2V5GAEgASgJQge6SARyAhAKEh4KBWxpbWl0GAIgASgFQgq6SAcaBRjoBygBSACIAQFCCAoGX2xpbWl0IvABCg9HZXROb2RlUmVzcG9uc2USJwoEbm9kZRgBIAEoCzIZLm1lc2hleHBsb3Jlci52MS5Ob2RlSW5mbxIvCg5yZWNlbnRfYWR2ZXJ0cxgCIAMoCzIXLm1lc2hleHBsb3Jlci52MS5BZHZlcnQSOgoQbG9jYXRpb25faGlzdG9yeRgDIAMoCzIgLm1lc2hleHBsb3Jlci52MS5Mb2NhdGlvbkhpc3RvcnkSJwoEbXF0dBgEIAEoCzIZLm1lc2hleHBsb3Jlci52MS5NcXR0SW5mbxITCgZyZWdpb24YBSABKAlIAIgBAUIJCgdfcmVnaW9uIvoBCghOZWlnaGJvchISCgpwdWJsaWNfa2V5GAEgASgJEhEKCW5vZGVfbmFtZRgCIAEoCRIVCghsYXRpdHVkZRgDIAEoAUgAiAEBEhYKCWxvbmdpdHVkZRgEIAEoAUgBiAEBEhQKDGhhc19sb2NhdGlvbhgFIAEoBRITCgtpc19yZXBlYXRlchgGIAEoBRIUCgxpc19jaGF0X25vZGUYByABKAUSFgoOaXNfcm9vbV9zZXJ2ZXIYCCABKAUSEAoIaGFzX25hbWUYCSABKAUSEgoKZGlyZWN0aW9ucxgKIAMoCUILCglfbGF0aXR1ZGVCDAoKX2xvbmdpdHVkZSJlChdHZXROb2RlTmVpZ2hib3JzUmVxdWVzdBIbCgpwdWJsaWNfa2V5GAEgASgJQge6SARyAhAKEh8KCWxhc3Rfc2VlbhgCIAEoBUIHukgEGgIoAEgAiAEBQgwKCl9sYXN0X3NlZW4iSAoYR2V0Tm9kZU5laWdoYm9yc1Jlc3BvbnNlEiwKCW5laWdoYm9ycxgBIAMoCzIZLm1lc2hleHBsb3Jlci52MS5OZWlnaGJvciL1AQoLU2VhcmNoUXVlcnkSGwoFcXVlcnkYASABKAlCB7pIBHICGGRIAIgBARITCgZyZWdpb24YAiABKAlIAYgBARIfCglsYXN0X3NlZW4YAyABKAVCB7pIBBoCKABIAogBARIeCgVsaW1pdBgEIAEoBUIKukgHGgUYyAEoAUgDiAEBEhIKBWV4YWN0GAUgASgISASIAQESGAoLaXNfcmVwZWF0ZXIYBiABKAhIBYgBAUIICgZfcXVlcnlCCQoHX3JlZ2lvbkIMCgpfbGFzdF9zZWVuQggKBl9saW1pdEIICgZfZXhhY3RCDgoMX2lzX3JlcGVhdGVyIrECCgxTZWFyY2hSZXN1bHQSEgoKcHVibGljX2tleRgBIAEoCRIRCglub2RlX25hbWUYAiABKAkSFQoIbGF0aXR1ZGUYAyABKAFIAIgBARIWCglsb25naXR1ZGUYBCABKAFIAYgBARIUCgxoYXNfbG9jYXRpb24YBSABKAUSEwoLaXNfcmVwZWF0ZXIYBiABKAUSFAoMaXNfY2hhdF9ub2RlGAcgASgFEhYKDmlzX3Jvb21fc2VydmVyGAggASgFEhAKCGhhc19uYW1lGAkgASgFEhMKC2ZpcnN0X2hlYXJkGAogASgJEhEKCWxhc3Rfc2VlbhgLIAEoCRIOCgZicm9rZXIYDCABKAkSDQoFdG9waWMYDSABKAlCCwoJX2xhdGl0dWRlQgwKCl9sb25naXR1ZGUiQgoQU2VhcmNoUmVzdWx0TGlzdBIuCgdyZXN1bHRzGAEgAygLMh0ubWVzaGV4cGxvcmVyLnYxLlNlYXJjaFJlc3VsdCJOChJTZWFyY2hOb2Rlc1JlcXVlc3QSOAoHcXVlcmllcxgBIAMoCzIcLm1lc2hleHBsb3Jlci52MS5TZWFyY2hRdWVyeUIJukgGkgEDEPQDIkkKE1NlYXJjaE5vZGVzUmVzcG9uc2USMgoHcmVzdWx0cxgBIAMoCzIhLm1lc2hleHBsb3Jlci52MS5TZWFyY2hSZXN1bHRMaXN0Mp4CCgtOb2RlU2VydmljZRJMCgdHZXROb2RlEh8ubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVSZXF1ZXN0GiAubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVSZXNwb25zZRJnChBHZXROb2RlTmVpZ2hib3JzEigubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVOZWlnaGJvcnNSZXF1ZXN0GikubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVOZWlnaGJvcnNSZXNwb25zZRJYCgtTZWFyY2hOb2RlcxIjLm1lc2hleHBsb3Jlci52MS5TZWFyY2hOb2Rlc1JlcXVlc3QaJC5tZXNoZXhwbG9yZXIudjEuU2VhcmNoTm9kZXNSZXNwb25zZWIGcHJvdG8z", [file_buf_validate_validate]);
/**
* Basic node identity/capabilities from the latest advert (getMeshcoreNodeInfo).
*
* @generated from message meshexplorer.v1.NodeInfo
*/
export type NodeInfo = Message<"meshexplorer.v1.NodeInfo"> & {
/**
* @generated from field: string public_key = 1;
*/
publicKey: string;
/**
* @generated from field: string node_name = 2;
*/
nodeName: string;
/**
* @generated from field: optional double latitude = 3;
*/
latitude?: number | undefined;
/**
* @generated from field: optional double longitude = 4;
*/
longitude?: number | undefined;
/**
* @generated from field: int32 has_location = 5;
*/
hasLocation: number;
/**
* @generated from field: int32 is_repeater = 6;
*/
isRepeater: number;
/**
* @generated from field: int32 is_chat_node = 7;
*/
isChatNode: number;
/**
* @generated from field: int32 is_room_server = 8;
*/
isRoomServer: number;
/**
* @generated from field: int32 has_name = 9;
*/
hasName: number;
/**
* @generated from field: optional string broker = 10;
*/
broker?: string | undefined;
/**
* @generated from field: optional string topic = 11;
*/
topic?: string | undefined;
/**
* @generated from field: string first_seen = 12;
*/
firstSeen: string;
/**
* @generated from field: string last_seen = 13;
*/
lastSeen: string;
};
/**
* Describes the message meshexplorer.v1.NodeInfo.
* Use `create(NodeInfoSchema)` to create a new message.
*/
export const NodeInfoSchema: GenMessage<NodeInfo> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 0);
/**
* One (origin, path, origin_pubkey) tuple from an advert's reception paths.
*
* @generated from message meshexplorer.v1.OriginPathPubkeyTuple
*/
export type OriginPathPubkeyTuple = Message<"meshexplorer.v1.OriginPathPubkeyTuple"> & {
/**
* @generated from field: string origin = 1;
*/
origin: string;
/**
* @generated from field: string path = 2;
*/
path: string;
/**
* @generated from field: string origin_pubkey = 3;
*/
originPubkey: string;
};
/**
* Describes the message meshexplorer.v1.OriginPathPubkeyTuple.
* Use `create(OriginPathPubkeyTupleSchema)` to create a new message.
*/
export const OriginPathPubkeyTupleSchema: GenMessage<OriginPathPubkeyTuple> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 1);
/**
* An advert grouped by packet_hash, with all the paths it was heard over.
*
* @generated from message meshexplorer.v1.Advert
*/
export type Advert = Message<"meshexplorer.v1.Advert"> & {
/**
* @generated from field: string adv_timestamp = 1;
*/
advTimestamp: string;
/**
* @generated from field: repeated meshexplorer.v1.OriginPathPubkeyTuple origin_path_pubkey_tuples = 2;
*/
originPathPubkeyTuples: OriginPathPubkeyTuple[];
/**
* @generated from field: int32 advert_count = 3;
*/
advertCount: number;
/**
* @generated from field: string earliest_timestamp = 4;
*/
earliestTimestamp: string;
/**
* @generated from field: string latest_timestamp = 5;
*/
latestTimestamp: string;
/**
* @generated from field: optional double latitude = 6;
*/
latitude?: number | undefined;
/**
* @generated from field: optional double longitude = 7;
*/
longitude?: number | undefined;
/**
* @generated from field: int32 is_repeater = 8;
*/
isRepeater: number;
/**
* @generated from field: int32 is_chat_node = 9;
*/
isChatNode: number;
/**
* @generated from field: int32 is_room_server = 10;
*/
isRoomServer: number;
/**
* @generated from field: int32 has_location = 11;
*/
hasLocation: number;
/**
* @generated from field: string packet_hash = 12;
*/
packetHash: string;
};
/**
* Describes the message meshexplorer.v1.Advert.
* Use `create(AdvertSchema)` to create a new message.
*/
export const AdvertSchema: GenMessage<Advert> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 2);
/**
* @generated from message meshexplorer.v1.LocationHistory
*/
export type LocationHistory = Message<"meshexplorer.v1.LocationHistory"> & {
/**
* @generated from field: string mesh_timestamp = 1;
*/
meshTimestamp: string;
/**
* @generated from field: double latitude = 2;
*/
latitude: number;
/**
* @generated from field: double longitude = 3;
*/
longitude: number;
};
/**
* Describes the message meshexplorer.v1.LocationHistory.
* Use `create(LocationHistorySchema)` to create a new message.
*/
export const LocationHistorySchema: GenMessage<LocationHistory> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 3);
/**
* @generated from message meshexplorer.v1.MqttTopic
*/
export type MqttTopic = Message<"meshexplorer.v1.MqttTopic"> & {
/**
* @generated from field: string topic = 1;
*/
topic: string;
/**
* @generated from field: string broker = 2;
*/
broker: string;
/**
* @generated from field: string last_packet_time = 3;
*/
lastPacketTime: string;
/**
* @generated from field: bool is_recent = 4;
*/
isRecent: boolean;
};
/**
* Describes the message meshexplorer.v1.MqttTopic.
* Use `create(MqttTopicSchema)` to create a new message.
*/
export const MqttTopicSchema: GenMessage<MqttTopic> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 4);
/**
* @generated from message meshexplorer.v1.MqttInfo
*/
export type MqttInfo = Message<"meshexplorer.v1.MqttInfo"> & {
/**
* @generated from field: bool is_uplinked = 1;
*/
isUplinked: boolean;
/**
* @generated from field: bool has_packets = 2;
*/
hasPackets: boolean;
/**
* @generated from field: repeated meshexplorer.v1.MqttTopic topics = 3;
*/
topics: MqttTopic[];
};
/**
* Describes the message meshexplorer.v1.MqttInfo.
* Use `create(MqttInfoSchema)` to create a new message.
*/
export const MqttInfoSchema: GenMessage<MqttInfo> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 5);
/**
* @generated from message meshexplorer.v1.GetNodeRequest
*/
export type GetNodeRequest = Message<"meshexplorer.v1.GetNodeRequest"> & {
/**
* @generated from field: string public_key = 1;
*/
publicKey: string;
/**
* Max number of recent adverts to return (default 50).
*
* @generated from field: optional int32 limit = 2;
*/
limit?: number | undefined;
};
/**
* Describes the message meshexplorer.v1.GetNodeRequest.
* Use `create(GetNodeRequestSchema)` to create a new message.
*/
export const GetNodeRequestSchema: GenMessage<GetNodeRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 6);
/**
* @generated from message meshexplorer.v1.GetNodeResponse
*/
export type GetNodeResponse = Message<"meshexplorer.v1.GetNodeResponse"> & {
/**
* @generated from field: meshexplorer.v1.NodeInfo node = 1;
*/
node?: NodeInfo | undefined;
/**
* @generated from field: repeated meshexplorer.v1.Advert recent_adverts = 2;
*/
recentAdverts: Advert[];
/**
* @generated from field: repeated meshexplorer.v1.LocationHistory location_history = 3;
*/
locationHistory: LocationHistory[];
/**
* @generated from field: meshexplorer.v1.MqttInfo mqtt = 4;
*/
mqtt?: MqttInfo | undefined;
/**
* @generated from field: optional string region = 5;
*/
region?: string | undefined;
};
/**
* Describes the message meshexplorer.v1.GetNodeResponse.
* Use `create(GetNodeResponseSchema)` to create a new message.
*/
export const GetNodeResponseSchema: GenMessage<GetNodeResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 7);
/**
* Direct neighbor of a node (meshcore_node_direct_neighbors).
*
* @generated from message meshexplorer.v1.Neighbor
*/
export type Neighbor = Message<"meshexplorer.v1.Neighbor"> & {
/**
* @generated from field: string public_key = 1;
*/
publicKey: string;
/**
* @generated from field: string node_name = 2;
*/
nodeName: string;
/**
* @generated from field: optional double latitude = 3;
*/
latitude?: number | undefined;
/**
* @generated from field: optional double longitude = 4;
*/
longitude?: number | undefined;
/**
* @generated from field: int32 has_location = 5;
*/
hasLocation: number;
/**
* @generated from field: int32 is_repeater = 6;
*/
isRepeater: number;
/**
* @generated from field: int32 is_chat_node = 7;
*/
isChatNode: number;
/**
* @generated from field: int32 is_room_server = 8;
*/
isRoomServer: number;
/**
* @generated from field: int32 has_name = 9;
*/
hasName: number;
/**
* @generated from field: repeated string directions = 10;
*/
directions: string[];
};
/**
* Describes the message meshexplorer.v1.Neighbor.
* Use `create(NeighborSchema)` to create a new message.
*/
export const NeighborSchema: GenMessage<Neighbor> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 8);
/**
* @generated from message meshexplorer.v1.GetNodeNeighborsRequest
*/
export type GetNodeNeighborsRequest = Message<"meshexplorer.v1.GetNodeNeighborsRequest"> & {
/**
* @generated from field: string public_key = 1;
*/
publicKey: string;
/**
* @generated from field: optional int32 last_seen = 2;
*/
lastSeen?: number | undefined;
};
/**
* Describes the message meshexplorer.v1.GetNodeNeighborsRequest.
* Use `create(GetNodeNeighborsRequestSchema)` to create a new message.
*/
export const GetNodeNeighborsRequestSchema: GenMessage<GetNodeNeighborsRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 9);
/**
* @generated from message meshexplorer.v1.GetNodeNeighborsResponse
*/
export type GetNodeNeighborsResponse = Message<"meshexplorer.v1.GetNodeNeighborsResponse"> & {
/**
* @generated from field: repeated meshexplorer.v1.Neighbor neighbors = 1;
*/
neighbors: Neighbor[];
};
/**
* Describes the message meshexplorer.v1.GetNodeNeighborsResponse.
* Use `create(GetNodeNeighborsResponseSchema)` to create a new message.
*/
export const GetNodeNeighborsResponseSchema: GenMessage<GetNodeNeighborsResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 10);
/**
* One search request within a (possibly batched) SearchNodes call.
*
* @generated from message meshexplorer.v1.SearchQuery
*/
export type SearchQuery = Message<"meshexplorer.v1.SearchQuery"> & {
/**
* @generated from field: optional string query = 1;
*/
query?: string | undefined;
/**
* @generated from field: optional string region = 2;
*/
region?: string | undefined;
/**
* @generated from field: optional int32 last_seen = 3;
*/
lastSeen?: number | undefined;
/**
* @generated from field: optional int32 limit = 4;
*/
limit?: number | undefined;
/**
* @generated from field: optional bool exact = 5;
*/
exact?: boolean | undefined;
/**
* @generated from field: optional bool is_repeater = 6;
*/
isRepeater?: boolean | undefined;
};
/**
* Describes the message meshexplorer.v1.SearchQuery.
* Use `create(SearchQuerySchema)` to create a new message.
*/
export const SearchQuerySchema: GenMessage<SearchQuery> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 11);
/**
* @generated from message meshexplorer.v1.SearchResult
*/
export type SearchResult = Message<"meshexplorer.v1.SearchResult"> & {
/**
* @generated from field: string public_key = 1;
*/
publicKey: string;
/**
* @generated from field: string node_name = 2;
*/
nodeName: string;
/**
* @generated from field: optional double latitude = 3;
*/
latitude?: number | undefined;
/**
* @generated from field: optional double longitude = 4;
*/
longitude?: number | undefined;
/**
* @generated from field: int32 has_location = 5;
*/
hasLocation: number;
/**
* @generated from field: int32 is_repeater = 6;
*/
isRepeater: number;
/**
* @generated from field: int32 is_chat_node = 7;
*/
isChatNode: number;
/**
* @generated from field: int32 is_room_server = 8;
*/
isRoomServer: number;
/**
* @generated from field: int32 has_name = 9;
*/
hasName: number;
/**
* @generated from field: string first_heard = 10;
*/
firstHeard: string;
/**
* @generated from field: string last_seen = 11;
*/
lastSeen: string;
/**
* @generated from field: string broker = 12;
*/
broker: string;
/**
* @generated from field: string topic = 13;
*/
topic: string;
};
/**
* Describes the message meshexplorer.v1.SearchResult.
* Use `create(SearchResultSchema)` to create a new message.
*/
export const SearchResultSchema: GenMessage<SearchResult> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 12);
/**
* Results for a single query in the batch (preserves per-query grouping).
*
* @generated from message meshexplorer.v1.SearchResultList
*/
export type SearchResultList = Message<"meshexplorer.v1.SearchResultList"> & {
/**
* @generated from field: repeated meshexplorer.v1.SearchResult results = 1;
*/
results: SearchResult[];
};
/**
* Describes the message meshexplorer.v1.SearchResultList.
* Use `create(SearchResultListSchema)` to create a new message.
*/
export const SearchResultListSchema: GenMessage<SearchResultList> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 13);
/**
* @generated from message meshexplorer.v1.SearchNodesRequest
*/
export type SearchNodesRequest = Message<"meshexplorer.v1.SearchNodesRequest"> & {
/**
* @generated from field: repeated meshexplorer.v1.SearchQuery queries = 1;
*/
queries: SearchQuery[];
};
/**
* Describes the message meshexplorer.v1.SearchNodesRequest.
* Use `create(SearchNodesRequestSchema)` to create a new message.
*/
export const SearchNodesRequestSchema: GenMessage<SearchNodesRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 14);
/**
* @generated from message meshexplorer.v1.SearchNodesResponse
*/
export type SearchNodesResponse = Message<"meshexplorer.v1.SearchNodesResponse"> & {
/**
* One entry per input query, in the same order.
*
* @generated from field: repeated meshexplorer.v1.SearchResultList results = 1;
*/
results: SearchResultList[];
};
/**
* Describes the message meshexplorer.v1.SearchNodesResponse.
* Use `create(SearchNodesResponseSchema)` to create a new message.
*/
export const SearchNodesResponseSchema: GenMessage<SearchNodesResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_node, 15);
/**
* @generated from service meshexplorer.v1.NodeService
*/
export const NodeService: GenService<{
/**
* @generated from rpc meshexplorer.v1.NodeService.GetNode
*/
getNode: {
methodKind: "unary";
input: typeof GetNodeRequestSchema;
output: typeof GetNodeResponseSchema;
},
/**
* @generated from rpc meshexplorer.v1.NodeService.GetNodeNeighbors
*/
getNodeNeighbors: {
methodKind: "unary";
input: typeof GetNodeNeighborsRequestSchema;
output: typeof GetNodeNeighborsResponseSchema;
},
/**
* @generated from rpc meshexplorer.v1.NodeService.SearchNodes
*/
searchNodes: {
methodKind: "unary";
input: typeof SearchNodesRequestSchema;
output: typeof SearchNodesResponseSchema;
},
}> = /*@__PURE__*/
serviceDesc(file_meshexplorer_v1_node, 0);
@@ -1,154 +0,0 @@
// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none"
// @generated from file meshexplorer/v1/packets.proto (package meshexplorer.v1, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import { file_buf_validate_validate } from "../../buf/validate/validate_pb";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file meshexplorer/v1/packets.proto.
*/
export const file_meshexplorer_v1_packets: GenFile = /*@__PURE__*/
fileDesc("Ch1tZXNoZXhwbG9yZXIvdjEvcGFja2V0cy5wcm90bxIPbWVzaGV4cGxvcmVyLnYxIvMBCgZQYWNrZXQSGAoQaW5nZXN0X3RpbWVzdGFtcBgBIAEoCRIWCg5tZXNoX3RpbWVzdGFtcBgCIAEoCRIOCgZicm9rZXIYAyABKAkSDQoFdG9waWMYBCABKAkSDgoGcGFja2V0GAUgASgJEhAKCHBhdGhfbGVuGAYgASgFEgwKBHBhdGgYByABKAkSEgoKcm91dGVfdHlwZRgIIAEoBRIUCgxwYXlsb2FkX3R5cGUYCSABKAUSFwoPcGF5bG9hZF92ZXJzaW9uGAogASgFEg4KBmhlYWRlchgLIAEoBRIVCg1vcmlnaW5fcHVia2V5GAwgASgJIs8CChRTdHJlYW1QYWNrZXRzUmVxdWVzdBITCgZyZWdpb24YASABKAlIAIgBARIkCgxwYXlsb2FkX3R5cGUYAiABKAVCCbpIBhoEGA8oAEgBiAEBEiIKCnJvdXRlX3R5cGUYAyABKAVCCbpIBhoEGAMoAEgCiAEBEjEKDW9yaWdpbl9wdWJrZXkYBCABKAlCFbpIEnIQMg5eWzAtOUEtRmEtZl0rJEgDiAEBEiYKDXBvbGxfaW50ZXJ2YWwYBSABKAVCCrpIBxoFGJBOKGRIBIgBARIhCghtYXhfcm93cxgGIAEoBUIKukgHGgUYkE4oCkgFiAEBQgkKB19yZWdpb25CDwoNX3BheWxvYWRfdHlwZUINCgtfcm91dGVfdHlwZUIQCg5fb3JpZ2luX3B1YmtleUIQCg5fcG9sbF9pbnRlcnZhbEILCglfbWF4X3Jvd3MyYwoOUGFja2V0c1NlcnZpY2USUQoNU3RyZWFtUGFja2V0cxIlLm1lc2hleHBsb3Jlci52MS5TdHJlYW1QYWNrZXRzUmVxdWVzdBoXLm1lc2hleHBsb3Jlci52MS5QYWNrZXQwAWIGcHJvdG8z", [file_buf_validate_validate]);
/**
* A raw mesh packet (meshcore_packets), hex fields kept as hex strings.
*
* @generated from message meshexplorer.v1.Packet
*/
export type Packet = Message<"meshexplorer.v1.Packet"> & {
/**
* @generated from field: string ingest_timestamp = 1;
*/
ingestTimestamp: string;
/**
* @generated from field: string mesh_timestamp = 2;
*/
meshTimestamp: string;
/**
* @generated from field: string broker = 3;
*/
broker: string;
/**
* @generated from field: string topic = 4;
*/
topic: string;
/**
* @generated from field: string packet = 5;
*/
packet: string;
/**
* @generated from field: int32 path_len = 6;
*/
pathLen: number;
/**
* @generated from field: string path = 7;
*/
path: string;
/**
* @generated from field: int32 route_type = 8;
*/
routeType: number;
/**
* @generated from field: int32 payload_type = 9;
*/
payloadType: number;
/**
* @generated from field: int32 payload_version = 10;
*/
payloadVersion: number;
/**
* @generated from field: int32 header = 11;
*/
header: number;
/**
* @generated from field: string origin_pubkey = 12;
*/
originPubkey: string;
};
/**
* Describes the message meshexplorer.v1.Packet.
* Use `create(PacketSchema)` to create a new message.
*/
export const PacketSchema: GenMessage<Packet> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_packets, 0);
/**
* @generated from message meshexplorer.v1.StreamPacketsRequest
*/
export type StreamPacketsRequest = Message<"meshexplorer.v1.StreamPacketsRequest"> & {
/**
* @generated from field: optional string region = 1;
*/
region?: string | undefined;
/**
* Payload type filter (0..15).
*
* @generated from field: optional int32 payload_type = 2;
*/
payloadType?: number | undefined;
/**
* Route type filter (0..3).
*
* @generated from field: optional int32 route_type = 3;
*/
routeType?: number | undefined;
/**
* @generated from field: optional string origin_pubkey = 4;
*/
originPubkey?: string | undefined;
/**
* Poll interval in ms (clamped 100..10000, default 500).
*
* @generated from field: optional int32 poll_interval = 5;
*/
pollInterval?: number | undefined;
/**
* Max rows per poll (clamped 10..10000, default 10).
*
* @generated from field: optional int32 max_rows = 6;
*/
maxRows?: number | undefined;
};
/**
* Describes the message meshexplorer.v1.StreamPacketsRequest.
* Use `create(StreamPacketsRequestSchema)` to create a new message.
*/
export const StreamPacketsRequestSchema: GenMessage<StreamPacketsRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_packets, 1);
/**
* @generated from service meshexplorer.v1.PacketsService
*/
export const PacketsService: GenService<{
/**
* @generated from rpc meshexplorer.v1.PacketsService.StreamPackets
*/
streamPackets: {
methodKind: "server_streaming";
input: typeof StreamPacketsRequestSchema;
output: typeof PacketSchema;
},
}> = /*@__PURE__*/
serviceDesc(file_meshexplorer_v1_packets, 0);
@@ -1,224 +0,0 @@
// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none"
// @generated from file meshexplorer/v1/stats.proto (package meshexplorer.v1, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file meshexplorer/v1/stats.proto.
*/
export const file_meshexplorer_v1_stats: GenFile = /*@__PURE__*/
fileDesc("ChttZXNoZXhwbG9yZXIvdjEvc3RhdHMucHJvdG8SD21lc2hleHBsb3Jlci52MSIuCgxTdGF0c1JlcXVlc3QSEwoGcmVnaW9uGAEgASgJSACIAQFCCQoHX3JlZ2lvbiIsChVHZXRUb3RhbE5vZGVzUmVzcG9uc2USEwoLdG90YWxfbm9kZXMYASABKAUipgEKEE5vZGVzT3ZlclRpbWVSb3cSCwoDZGF5GAEgASgJEh8KF2N1bXVsYXRpdmVfdW5pcXVlX25vZGVzGAIgASgFEhsKE25vZGVzX3dpdGhfbG9jYXRpb24YAyABKAUSHgoWbm9kZXNfd2l0aG91dF9sb2NhdGlvbhgEIAEoBRIRCglyZXBlYXRlcnMYBSABKAUSFAoMcm9vbV9zZXJ2ZXJzGAYgASgFIksKGEdldE5vZGVzT3ZlclRpbWVSZXNwb25zZRIvCgRkYXRhGAEgAygLMiEubWVzaGV4cGxvcmVyLnYxLk5vZGVzT3ZlclRpbWVSb3ciQAoRUG9wdWxhckNoYW5uZWxSb3cSFAoMY2hhbm5lbF9oYXNoGAEgASgJEhUKDW1lc3NhZ2VfY291bnQYAiABKAUiTgoaR2V0UG9wdWxhckNoYW5uZWxzUmVzcG9uc2USMAoEZGF0YRgBIAMoCzIiLm1lc2hleHBsb3Jlci52MS5Qb3B1bGFyQ2hhbm5lbFJvdyI3ChFSZXBlYXRlclByZWZpeFJvdxIOCgZwcmVmaXgYASABKAkSEgoKbm9kZV9uYW1lcxgCIAMoCSJPChtHZXRSZXBlYXRlclByZWZpeGVzUmVzcG9uc2USMAoEZGF0YRgBIAMoCzIiLm1lc2hleHBsb3Jlci52MS5SZXBlYXRlclByZWZpeFJvdzKKAwoMU3RhdHNTZXJ2aWNlElYKDUdldFRvdGFsTm9kZXMSHS5tZXNoZXhwbG9yZXIudjEuU3RhdHNSZXF1ZXN0GiYubWVzaGV4cGxvcmVyLnYxLkdldFRvdGFsTm9kZXNSZXNwb25zZRJcChBHZXROb2Rlc092ZXJUaW1lEh0ubWVzaGV4cGxvcmVyLnYxLlN0YXRzUmVxdWVzdBopLm1lc2hleHBsb3Jlci52MS5HZXROb2Rlc092ZXJUaW1lUmVzcG9uc2USYAoSR2V0UG9wdWxhckNoYW5uZWxzEh0ubWVzaGV4cGxvcmVyLnYxLlN0YXRzUmVxdWVzdBorLm1lc2hleHBsb3Jlci52MS5HZXRQb3B1bGFyQ2hhbm5lbHNSZXNwb25zZRJiChNHZXRSZXBlYXRlclByZWZpeGVzEh0ubWVzaGV4cGxvcmVyLnYxLlN0YXRzUmVxdWVzdBosLm1lc2hleHBsb3Jlci52MS5HZXRSZXBlYXRlclByZWZpeGVzUmVzcG9uc2ViBnByb3RvMw");
/**
* @generated from message meshexplorer.v1.StatsRequest
*/
export type StatsRequest = Message<"meshexplorer.v1.StatsRequest"> & {
/**
* @generated from field: optional string region = 1;
*/
region?: string | undefined;
};
/**
* Describes the message meshexplorer.v1.StatsRequest.
* Use `create(StatsRequestSchema)` to create a new message.
*/
export const StatsRequestSchema: GenMessage<StatsRequest> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 0);
/**
* @generated from message meshexplorer.v1.GetTotalNodesResponse
*/
export type GetTotalNodesResponse = Message<"meshexplorer.v1.GetTotalNodesResponse"> & {
/**
* @generated from field: int32 total_nodes = 1;
*/
totalNodes: number;
};
/**
* Describes the message meshexplorer.v1.GetTotalNodesResponse.
* Use `create(GetTotalNodesResponseSchema)` to create a new message.
*/
export const GetTotalNodesResponseSchema: GenMessage<GetTotalNodesResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 1);
/**
* @generated from message meshexplorer.v1.NodesOverTimeRow
*/
export type NodesOverTimeRow = Message<"meshexplorer.v1.NodesOverTimeRow"> & {
/**
* @generated from field: string day = 1;
*/
day: string;
/**
* @generated from field: int32 cumulative_unique_nodes = 2;
*/
cumulativeUniqueNodes: number;
/**
* @generated from field: int32 nodes_with_location = 3;
*/
nodesWithLocation: number;
/**
* @generated from field: int32 nodes_without_location = 4;
*/
nodesWithoutLocation: number;
/**
* @generated from field: int32 repeaters = 5;
*/
repeaters: number;
/**
* @generated from field: int32 room_servers = 6;
*/
roomServers: number;
};
/**
* Describes the message meshexplorer.v1.NodesOverTimeRow.
* Use `create(NodesOverTimeRowSchema)` to create a new message.
*/
export const NodesOverTimeRowSchema: GenMessage<NodesOverTimeRow> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 2);
/**
* @generated from message meshexplorer.v1.GetNodesOverTimeResponse
*/
export type GetNodesOverTimeResponse = Message<"meshexplorer.v1.GetNodesOverTimeResponse"> & {
/**
* @generated from field: repeated meshexplorer.v1.NodesOverTimeRow data = 1;
*/
data: NodesOverTimeRow[];
};
/**
* Describes the message meshexplorer.v1.GetNodesOverTimeResponse.
* Use `create(GetNodesOverTimeResponseSchema)` to create a new message.
*/
export const GetNodesOverTimeResponseSchema: GenMessage<GetNodesOverTimeResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 3);
/**
* @generated from message meshexplorer.v1.PopularChannelRow
*/
export type PopularChannelRow = Message<"meshexplorer.v1.PopularChannelRow"> & {
/**
* @generated from field: string channel_hash = 1;
*/
channelHash: string;
/**
* @generated from field: int32 message_count = 2;
*/
messageCount: number;
};
/**
* Describes the message meshexplorer.v1.PopularChannelRow.
* Use `create(PopularChannelRowSchema)` to create a new message.
*/
export const PopularChannelRowSchema: GenMessage<PopularChannelRow> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 4);
/**
* @generated from message meshexplorer.v1.GetPopularChannelsResponse
*/
export type GetPopularChannelsResponse = Message<"meshexplorer.v1.GetPopularChannelsResponse"> & {
/**
* @generated from field: repeated meshexplorer.v1.PopularChannelRow data = 1;
*/
data: PopularChannelRow[];
};
/**
* Describes the message meshexplorer.v1.GetPopularChannelsResponse.
* Use `create(GetPopularChannelsResponseSchema)` to create a new message.
*/
export const GetPopularChannelsResponseSchema: GenMessage<GetPopularChannelsResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 5);
/**
* @generated from message meshexplorer.v1.RepeaterPrefixRow
*/
export type RepeaterPrefixRow = Message<"meshexplorer.v1.RepeaterPrefixRow"> & {
/**
* @generated from field: string prefix = 1;
*/
prefix: string;
/**
* @generated from field: repeated string node_names = 2;
*/
nodeNames: string[];
};
/**
* Describes the message meshexplorer.v1.RepeaterPrefixRow.
* Use `create(RepeaterPrefixRowSchema)` to create a new message.
*/
export const RepeaterPrefixRowSchema: GenMessage<RepeaterPrefixRow> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 6);
/**
* @generated from message meshexplorer.v1.GetRepeaterPrefixesResponse
*/
export type GetRepeaterPrefixesResponse = Message<"meshexplorer.v1.GetRepeaterPrefixesResponse"> & {
/**
* @generated from field: repeated meshexplorer.v1.RepeaterPrefixRow data = 1;
*/
data: RepeaterPrefixRow[];
};
/**
* Describes the message meshexplorer.v1.GetRepeaterPrefixesResponse.
* Use `create(GetRepeaterPrefixesResponseSchema)` to create a new message.
*/
export const GetRepeaterPrefixesResponseSchema: GenMessage<GetRepeaterPrefixesResponse> = /*@__PURE__*/
messageDesc(file_meshexplorer_v1_stats, 7);
/**
* @generated from service meshexplorer.v1.StatsService
*/
export const StatsService: GenService<{
/**
* @generated from rpc meshexplorer.v1.StatsService.GetTotalNodes
*/
getTotalNodes: {
methodKind: "unary";
input: typeof StatsRequestSchema;
output: typeof GetTotalNodesResponseSchema;
},
/**
* @generated from rpc meshexplorer.v1.StatsService.GetNodesOverTime
*/
getNodesOverTime: {
methodKind: "unary";
input: typeof StatsRequestSchema;
output: typeof GetNodesOverTimeResponseSchema;
},
/**
* @generated from rpc meshexplorer.v1.StatsService.GetPopularChannels
*/
getPopularChannels: {
methodKind: "unary";
input: typeof StatsRequestSchema;
output: typeof GetPopularChannelsResponseSchema;
},
/**
* @generated from rpc meshexplorer.v1.StatsService.GetRepeaterPrefixes
*/
getRepeaterPrefixes: {
methodKind: "unary";
input: typeof StatsRequestSchema;
output: typeof GetRepeaterPrefixesResponseSchema;
},
}> = /*@__PURE__*/
serviceDesc(file_meshexplorer_v1_stats, 0);
+2 -1
View File
@@ -8,6 +8,7 @@ import {
createChatMessagesStreamerConfig,
} from "@/lib/clickhouse/streaming";
import { decryptMeshcoreGroupMessage } from "@/lib/meshcore";
import { num } from "./mappers";
const PUBLIC_MESHCORE_KEY = "izOH6cXN6mrJ5e26oRXNcg==";
@@ -40,7 +41,7 @@ function toChatMessage(
channelHash: row.channel_hash,
mac: row.mac,
encryptedMessage: row.encrypted_message,
messageCount: row.message_count,
messageCount: num(row.message_count),
originPathInfo: (row.origin_path_info ?? []).map(
([origin, originPubkey, path, broker, topic]) => ({
origin,
+10 -3
View File
@@ -17,21 +17,28 @@ export interface NeighborEdgeRow {
target_has_location: number;
}
// ClickHouse serializes UInt64/Int64 and aggregate columns (count(), etc.) as
// JSON *strings* in JSONEachRow. Coerce every integer field we feed into an
// int32 proto field, or protobuf-es rejects the string at encode time.
export function num(v: unknown): number {
return Number(v ?? 0);
}
/** Maps a ClickHouse neighbor-edge row to the NeighborEdge proto init shape. */
export function toNeighborEdge(row: NeighborEdgeRow): MessageInitShape<typeof NeighborEdgeSchema> {
return {
sourceNode: row.source_node,
targetNode: row.target_node,
connectionType: row.connection_type,
packetCount: row.packet_count,
packetCount: num(row.packet_count),
sourceName: row.source_name,
sourceLatitude: row.source_latitude,
sourceLongitude: row.source_longitude,
sourceHasLocation: row.source_has_location,
sourceHasLocation: num(row.source_has_location),
targetName: row.target_name,
targetLatitude: row.target_latitude,
targetLongitude: row.target_longitude,
targetHasLocation: row.target_has_location,
targetHasLocation: num(row.target_has_location),
};
}
+23 -22
View File
@@ -7,6 +7,7 @@ import {
getMeshcoreNodeNeighbors,
searchMeshcoreNodes,
} from "@/lib/clickhouse/actions";
import { num } from "./mappers";
interface SearchResultRow {
public_key: string;
@@ -30,11 +31,11 @@ function toSearchResult(row: SearchResultRow): MessageInitShape<typeof SearchRes
nodeName: row.node_name,
latitude: row.latitude ?? undefined,
longitude: row.longitude ?? undefined,
hasLocation: row.has_location,
isRepeater: row.is_repeater,
isChatNode: row.is_chat_node,
isRoomServer: row.is_room_server,
hasName: row.has_name,
hasLocation: num(row.has_location),
isRepeater: num(row.is_repeater),
isChatNode: num(row.is_chat_node),
isRoomServer: num(row.is_room_server),
hasName: num(row.has_name),
firstHeard: row.first_heard,
lastSeen: row.last_seen,
broker: row.broker,
@@ -54,7 +55,7 @@ export const nodeServiceImpl: ServiceImpl<typeof NodeService> = {
const node = nodeInfo.node;
// recentAdverts / locationHistory come back as untyped JSON rows.
const adverts = nodeInfo.recentAdverts as Array<{
adv_timestamp: string;
adv_timestamp: number;
origin_path_pubkey_tuples: Array<[string, string, string]>;
advert_count: number;
earliest_timestamp: string;
@@ -79,30 +80,30 @@ export const nodeServiceImpl: ServiceImpl<typeof NodeService> = {
nodeName: node.node_name,
latitude: node.latitude ?? undefined,
longitude: node.longitude ?? undefined,
hasLocation: node.has_location,
isRepeater: node.is_repeater,
isChatNode: node.is_chat_node,
isRoomServer: node.is_room_server,
hasName: node.has_name,
hasLocation: num(node.has_location),
isRepeater: num(node.is_repeater),
isChatNode: num(node.is_chat_node),
isRoomServer: num(node.is_room_server),
hasName: num(node.has_name),
broker: node.broker ?? undefined,
topic: node.topic ?? undefined,
firstSeen: node.first_seen,
lastSeen: node.last_seen,
},
recentAdverts: adverts.map((a) => ({
advTimestamp: a.adv_timestamp,
advTimestamp: num(a.adv_timestamp),
originPathPubkeyTuples: (a.origin_path_pubkey_tuples ?? []).map(
([origin, path, originPubkey]) => ({ origin, path, originPubkey }),
),
advertCount: a.advert_count,
advertCount: num(a.advert_count),
earliestTimestamp: a.earliest_timestamp,
latestTimestamp: a.latest_timestamp,
latitude: a.latitude ?? undefined,
longitude: a.longitude ?? undefined,
isRepeater: a.is_repeater,
isChatNode: a.is_chat_node,
isRoomServer: a.is_room_server,
hasLocation: a.has_location,
isRepeater: num(a.is_repeater),
isChatNode: num(a.is_chat_node),
isRoomServer: num(a.is_room_server),
hasLocation: num(a.has_location),
packetHash: a.packet_hash,
})),
locationHistory: locationHistory.map((l) => ({
@@ -135,11 +136,11 @@ export const nodeServiceImpl: ServiceImpl<typeof NodeService> = {
nodeName: n.node_name,
latitude: n.latitude ?? undefined,
longitude: n.longitude ?? undefined,
hasLocation: n.has_location,
isRepeater: n.is_repeater,
isChatNode: n.is_chat_node,
isRoomServer: n.is_room_server,
hasName: n.has_name,
hasLocation: num(n.has_location),
isRepeater: num(n.is_repeater),
isChatNode: num(n.is_chat_node),
isRoomServer: num(n.is_room_server),
hasName: num(n.has_name),
directions: n.directions,
})),
};
+6 -5
View File
@@ -4,6 +4,7 @@ import {
createClickHouseStreamer,
createMeshcorePacketsStreamerConfig,
} from "@/lib/clickhouse/streaming";
import { num } from "./mappers";
interface PacketRow {
ingest_timestamp: string;
@@ -47,12 +48,12 @@ export const packetsServiceImpl: ServiceImpl<typeof PacketsService> = {
broker: row.broker,
topic: row.topic,
packet: row.packet,
pathLen: row.path_len,
pathLen: num(row.path_len),
path: row.path,
routeType: row.route_type,
payloadType: row.payload_type,
payloadVersion: row.payload_version,
header: row.header,
routeType: num(row.route_type),
payloadType: num(row.payload_type),
payloadVersion: num(row.payload_version),
header: num(row.header),
originPubkey: row.origin_pubkey,
};
}