mirror of
https://github.com/DeBrosOfficial/network.git
synced 2025-12-15 23:18:49 +00:00
chore: remove example files for Go and TypeScript SDK
- Deleted basic usage example in Go, TypeScript package.json, README.md, tsconfig.json, and client.ts to streamline the examples directory and remove outdated content.
This commit is contained in:
parent
5b05f52162
commit
f2d6254b7b
@ -1,151 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/DeBrosOfficial/network/pkg/client"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// Create client configuration
|
|
||||||
config := client.DefaultClientConfig("example_app")
|
|
||||||
config.BootstrapPeers = []string{
|
|
||||||
"/ip4/127.0.0.1/tcp/4001/p2p/QmBootstrap1",
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create network client
|
|
||||||
networkClient, err := client.NewClient(config)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to create network client: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connect to network
|
|
||||||
if err := networkClient.Connect(); err != nil {
|
|
||||||
log.Fatalf("Failed to connect to network: %v", err)
|
|
||||||
}
|
|
||||||
defer networkClient.Disconnect()
|
|
||||||
|
|
||||||
log.Printf("Connected to network successfully!")
|
|
||||||
|
|
||||||
// Example: Database operations
|
|
||||||
demonstrateDatabase(networkClient)
|
|
||||||
|
|
||||||
// Example: Pub/Sub messaging
|
|
||||||
demonstratePubSub(networkClient)
|
|
||||||
|
|
||||||
// Example: Network information
|
|
||||||
demonstrateNetworkInfo(networkClient)
|
|
||||||
|
|
||||||
log.Printf("Example completed successfully!")
|
|
||||||
}
|
|
||||||
|
|
||||||
func demonstrateDatabase(client client.NetworkClient) {
|
|
||||||
ctx := context.Background()
|
|
||||||
db := client.Database()
|
|
||||||
|
|
||||||
log.Printf("=== Database Operations ===")
|
|
||||||
|
|
||||||
// Create a table
|
|
||||||
schema := `
|
|
||||||
CREATE TABLE IF NOT EXISTS messages (
|
|
||||||
id INTEGER PRIMARY KEY,
|
|
||||||
content TEXT NOT NULL,
|
|
||||||
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
||||||
)
|
|
||||||
`
|
|
||||||
if err := db.CreateTable(ctx, schema); err != nil {
|
|
||||||
log.Printf("Error creating table: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Table created successfully")
|
|
||||||
|
|
||||||
// Insert some data
|
|
||||||
insertSQL := "INSERT INTO messages (content) VALUES (?)"
|
|
||||||
result, err := db.Query(ctx, insertSQL, "Hello, distributed world!")
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error inserting data: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Data inserted, result: %+v", result)
|
|
||||||
|
|
||||||
// Query data
|
|
||||||
selectSQL := "SELECT * FROM messages"
|
|
||||||
result, err = db.Query(ctx, selectSQL)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error querying data: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Query result: %+v", result)
|
|
||||||
}
|
|
||||||
|
|
||||||
func demonstratePubSub(client client.NetworkClient) {
|
|
||||||
ctx := context.Background()
|
|
||||||
pubsub := client.PubSub()
|
|
||||||
|
|
||||||
log.Printf("=== Pub/Sub Operations ===")
|
|
||||||
|
|
||||||
// Subscribe to a topic
|
|
||||||
topic := "notifications"
|
|
||||||
handler := func(topic string, data []byte) error {
|
|
||||||
log.Printf("Received message on topic '%s': %s", topic, string(data))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := pubsub.Subscribe(ctx, topic, handler); err != nil {
|
|
||||||
log.Printf("Error subscribing: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Subscribed to topic: %s", topic)
|
|
||||||
|
|
||||||
// Publish a message
|
|
||||||
message := []byte("Hello from pub/sub!")
|
|
||||||
if err := pubsub.Publish(ctx, topic, message); err != nil {
|
|
||||||
log.Printf("Error publishing: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Message published")
|
|
||||||
|
|
||||||
// Wait a bit for message delivery
|
|
||||||
time.Sleep(time.Millisecond * 100)
|
|
||||||
|
|
||||||
// List topics
|
|
||||||
topics, err := pubsub.ListTopics(ctx)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error listing topics: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Subscribed topics: %v", topics)
|
|
||||||
}
|
|
||||||
|
|
||||||
func demonstrateNetworkInfo(client client.NetworkClient) {
|
|
||||||
ctx := context.Background()
|
|
||||||
network := client.Network()
|
|
||||||
|
|
||||||
log.Printf("=== Network Information ===")
|
|
||||||
|
|
||||||
// Get network status
|
|
||||||
status, err := network.GetStatus(ctx)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error getting status: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Network status: %+v", status)
|
|
||||||
|
|
||||||
// Get peers
|
|
||||||
peers, err := network.GetPeers(ctx)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error getting peers: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Connected peers: %+v", peers)
|
|
||||||
|
|
||||||
// Get client health
|
|
||||||
health, err := client.Health()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error getting health: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("Client health: %+v", health)
|
|
||||||
}
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
# DeBros Gateway TypeScript SDK (Minimal Example)
|
|
||||||
|
|
||||||
Minimal, dependency-light wrapper around the HTTP Gateway.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm i
|
|
||||||
export GATEWAY_BASE_URL=http://127.0.0.1:6001
|
|
||||||
export GATEWAY_API_KEY=your_api_key
|
|
||||||
```
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import { GatewayClient } from './src/client';
|
|
||||||
|
|
||||||
const c = new GatewayClient(process.env.GATEWAY_BASE_URL!, process.env.GATEWAY_API_KEY!);
|
|
||||||
await c.createTable('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
|
|
||||||
await c.transaction([
|
|
||||||
'INSERT INTO users (id,name) VALUES (1,\'Alice\')'
|
|
||||||
]);
|
|
||||||
const res = await c.query('SELECT name FROM users WHERE id = ?', [1]);
|
|
||||||
console.log(res.rows);
|
|
||||||
```
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "debros-gateway-sdk",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"private": true,
|
|
||||||
"type": "module",
|
|
||||||
"main": "dist/index.js",
|
|
||||||
"types": "dist/index.d.ts",
|
|
||||||
"scripts": {
|
|
||||||
"build": "tsc -p tsconfig.json"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"isomorphic-ws": "^5.0.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,154 +0,0 @@
|
|||||||
import WebSocket from "isomorphic-ws";
|
|
||||||
|
|
||||||
export class GatewayClient {
|
|
||||||
constructor(
|
|
||||||
private baseUrl: string,
|
|
||||||
private apiKey: string,
|
|
||||||
private http = fetch
|
|
||||||
) {}
|
|
||||||
|
|
||||||
private headers(json = true): Record<string, string> {
|
|
||||||
const h: Record<string, string> = { "X-API-Key": this.apiKey };
|
|
||||||
if (json) h["Content-Type"] = "application/json";
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Database
|
|
||||||
async createTable(schema: string): Promise<void> {
|
|
||||||
const r = await this.http(`${this.baseUrl}/v1/rqlite/create-table`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: this.headers(),
|
|
||||||
body: JSON.stringify({ schema }),
|
|
||||||
});
|
|
||||||
if (!r.ok) throw new Error(`createTable failed: ${r.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
async dropTable(table: string): Promise<void> {
|
|
||||||
const r = await this.http(`${this.baseUrl}/v1/rqlite/drop-table`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: this.headers(),
|
|
||||||
body: JSON.stringify({ table }),
|
|
||||||
});
|
|
||||||
if (!r.ok) throw new Error(`dropTable failed: ${r.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
async query<T = any>(sql: string, args: any[] = []): Promise<{ rows: T[] }> {
|
|
||||||
const r = await this.http(`${this.baseUrl}/v1/rqlite/query`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: this.headers(),
|
|
||||||
body: JSON.stringify({ sql, args }),
|
|
||||||
});
|
|
||||||
if (!r.ok) throw new Error(`query failed: ${r.status}`);
|
|
||||||
return r.json();
|
|
||||||
}
|
|
||||||
|
|
||||||
async transaction(statements: string[]): Promise<void> {
|
|
||||||
const r = await this.http(`${this.baseUrl}/v1/rqlite/transaction`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: this.headers(),
|
|
||||||
body: JSON.stringify({ statements }),
|
|
||||||
});
|
|
||||||
if (!r.ok) throw new Error(`transaction failed: ${r.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
async schema(): Promise<any> {
|
|
||||||
const r = await this.http(`${this.baseUrl}/v1/rqlite/schema`, {
|
|
||||||
headers: this.headers(false),
|
|
||||||
});
|
|
||||||
if (!r.ok) throw new Error(`schema failed: ${r.status}`);
|
|
||||||
return r.json();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Storage
|
|
||||||
async put(key: string, value: Uint8Array | string): Promise<void> {
|
|
||||||
const body =
|
|
||||||
typeof value === "string" ? new TextEncoder().encode(value) : value;
|
|
||||||
const r = await this.http(
|
|
||||||
`${this.baseUrl}/v1/storage/put?key=${encodeURIComponent(key)}`,
|
|
||||||
{
|
|
||||||
method: "POST",
|
|
||||||
headers: { "X-API-Key": this.apiKey },
|
|
||||||
body,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (!r.ok) throw new Error(`put failed: ${r.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
async get(key: string): Promise<Uint8Array> {
|
|
||||||
const r = await this.http(
|
|
||||||
`${this.baseUrl}/v1/storage/get?key=${encodeURIComponent(key)}`,
|
|
||||||
{
|
|
||||||
headers: { "X-API-Key": this.apiKey },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (!r.ok) throw new Error(`get failed: ${r.status}`);
|
|
||||||
const buf = new Uint8Array(await r.arrayBuffer());
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
async exists(key: string): Promise<boolean> {
|
|
||||||
const r = await this.http(
|
|
||||||
`${this.baseUrl}/v1/storage/exists?key=${encodeURIComponent(key)}`,
|
|
||||||
{
|
|
||||||
headers: this.headers(false),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (!r.ok) throw new Error(`exists failed: ${r.status}`);
|
|
||||||
const j = await r.json();
|
|
||||||
return !!j.exists;
|
|
||||||
}
|
|
||||||
|
|
||||||
async list(prefix = ""): Promise<string[]> {
|
|
||||||
const r = await this.http(
|
|
||||||
`${this.baseUrl}/v1/storage/list?prefix=${encodeURIComponent(prefix)}`,
|
|
||||||
{
|
|
||||||
headers: this.headers(false),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (!r.ok) throw new Error(`list failed: ${r.status}`);
|
|
||||||
const j = await r.json();
|
|
||||||
return j.keys || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
async delete(key: string): Promise<void> {
|
|
||||||
const r = await this.http(`${this.baseUrl}/v1/storage/delete`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: this.headers(),
|
|
||||||
body: JSON.stringify({ key }),
|
|
||||||
});
|
|
||||||
if (!r.ok) throw new Error(`delete failed: ${r.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// PubSub (minimal)
|
|
||||||
subscribe(
|
|
||||||
topic: string,
|
|
||||||
onMessage: (data: Uint8Array) => void
|
|
||||||
): { close: () => void } {
|
|
||||||
const url = new URL(`${this.baseUrl.replace(/^http/, "ws")}/v1/pubsub/ws`);
|
|
||||||
url.searchParams.set("topic", topic);
|
|
||||||
const ws = new WebSocket(url.toString(), {
|
|
||||||
headers: { "X-API-Key": this.apiKey },
|
|
||||||
} as any);
|
|
||||||
ws.binaryType = "arraybuffer";
|
|
||||||
ws.onmessage = (ev: any) => {
|
|
||||||
const data =
|
|
||||||
ev.data instanceof ArrayBuffer
|
|
||||||
? new Uint8Array(ev.data)
|
|
||||||
: new TextEncoder().encode(String(ev.data));
|
|
||||||
onMessage(data);
|
|
||||||
};
|
|
||||||
return { close: () => ws.close() };
|
|
||||||
}
|
|
||||||
|
|
||||||
async publish(topic: string, data: Uint8Array | string): Promise<void> {
|
|
||||||
const bytes =
|
|
||||||
typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
||||||
const b64 = Buffer.from(bytes).toString("base64");
|
|
||||||
const r = await this.http(`${this.baseUrl}/v1/pubsub/publish`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: this.headers(),
|
|
||||||
body: JSON.stringify({ topic, data_base64: b64 }),
|
|
||||||
});
|
|
||||||
if (!r.ok) throw new Error(`publish failed: ${r.status}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "ES2020",
|
|
||||||
"module": "ES2020",
|
|
||||||
"declaration": true,
|
|
||||||
"outDir": "dist",
|
|
||||||
"rootDir": "src",
|
|
||||||
"strict": true,
|
|
||||||
"moduleResolution": "Node"
|
|
||||||
},
|
|
||||||
"include": ["src/**/*"]
|
|
||||||
}
|
|
||||||
@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/libp2p/go-libp2p/core/host"
|
"github.com/libp2p/go-libp2p/core/host"
|
||||||
@ -114,9 +115,46 @@ func (d *Manager) handlePeerExchangeStream(s network.Stream) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filter addresses to only include configured listen addresses, not ephemeral ports
|
||||||
|
// Ephemeral ports are typically > 32768, so we filter those out
|
||||||
|
filteredAddrs := make([]multiaddr.Multiaddr, 0)
|
||||||
|
for _, addr := range addrs {
|
||||||
|
// Extract TCP port from multiaddr
|
||||||
|
port, err := addr.ValueForProtocol(multiaddr.P_TCP)
|
||||||
|
if err == nil {
|
||||||
|
portNum, err := strconv.Atoi(port)
|
||||||
|
if err == nil {
|
||||||
|
// Only include ports that are reasonable (not ephemeral ports > 32768)
|
||||||
|
// Common LibP2P ports are typically < 10000
|
||||||
|
if portNum > 0 && portNum <= 32767 {
|
||||||
|
filteredAddrs = append(filteredAddrs, addr)
|
||||||
|
} else {
|
||||||
|
d.logger.Debug("Filtering out ephemeral port address",
|
||||||
|
zap.String("peer_id", pid.String()[:8]+"..."),
|
||||||
|
zap.String("addr", addr.String()),
|
||||||
|
zap.Int("port", portNum))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If we can't parse port, include it anyway (might be non-TCP)
|
||||||
|
filteredAddrs = append(filteredAddrs, addr)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If no TCP port found, include it anyway (might be non-TCP)
|
||||||
|
filteredAddrs = append(filteredAddrs, addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no addresses remain after filtering, skip this peer
|
||||||
|
if len(filteredAddrs) == 0 {
|
||||||
|
d.logger.Debug("No valid addresses after filtering ephemeral ports",
|
||||||
|
zap.String("peer_id", pid.String()[:8]+"..."),
|
||||||
|
zap.Int("original_count", len(addrs)))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Convert addresses to strings
|
// Convert addresses to strings
|
||||||
addrStrs := make([]string, len(addrs))
|
addrStrs := make([]string, len(filteredAddrs))
|
||||||
for i, addr := range addrs {
|
for i, addr := range filteredAddrs {
|
||||||
addrStrs[i] = addr.String()
|
addrStrs[i] = addr.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user