basic network established
This commit is contained in:
34
packages/gsio-node-client/.gitignore
vendored
Normal file
34
packages/gsio-node-client/.gitignore
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
# dependencies (bun install)
|
||||
node_modules
|
||||
|
||||
# output
|
||||
out
|
||||
dist
|
||||
*.tgz
|
||||
|
||||
# code coverage
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# logs
|
||||
logs
|
||||
_.log
|
||||
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# caches
|
||||
.eslintcache
|
||||
.cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# IntelliJ based IDEs
|
||||
.idea
|
||||
|
||||
# Finder (MacOS) folder config
|
||||
.DS_Store
|
231
packages/gsio-node-client/README.md
Normal file
231
packages/gsio-node-client/README.md
Normal file
@@ -0,0 +1,231 @@
|
||||
# gsio-node-client
|
||||
|
||||
A TypeScript client library for connecting to the GSIO-Net distributed ledger system.
|
||||
|
||||
## Overview
|
||||
|
||||
The gsio-node-client component is a TypeScript client that:
|
||||
- Connects to gsio-node servers using Socket.IO
|
||||
- Interacts with the distributed ledger
|
||||
- Participates in the peer-to-peer network
|
||||
- Provides a simple API for adding and retrieving ledger entries
|
||||
|
||||
## Features
|
||||
|
||||
- **Socket.IO Client**: Connects to gsio-node servers for real-time communication
|
||||
- **WebSocket Client**: Connects to gsio-relay for peer-to-peer communication
|
||||
- **Ledger Interaction**: Add entries to and retrieve entries from the distributed ledger
|
||||
- **Node Discovery**: Discover other nodes in the network
|
||||
- **Event-Based API**: Simple event-based API for easy integration
|
||||
|
||||
## Installation
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js (latest LTS version)
|
||||
- Bun (for running TypeScript code and tests)
|
||||
|
||||
### Installing
|
||||
|
||||
```bash
|
||||
# Clone the repository (if you haven't already)
|
||||
git clone <repository-url>
|
||||
cd gsio-net
|
||||
|
||||
# Install dependencies
|
||||
cd packages/gsio-node-client
|
||||
bun install
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Connecting to a Node
|
||||
|
||||
```typescript
|
||||
import { Manager as SocketIO } from "socket.io-client";
|
||||
|
||||
// Create a Socket.IO manager
|
||||
const socketIO = new SocketIO("http://localhost:3000");
|
||||
|
||||
// Connect to the root namespace
|
||||
const socket = socketIO.socket("/", {
|
||||
auth: {
|
||||
token: "your-auth-token"
|
||||
}
|
||||
});
|
||||
|
||||
// Basic Socket.IO event handlers
|
||||
socket.on("connect", () => {
|
||||
console.log("Connected to GSIO-Net node");
|
||||
});
|
||||
|
||||
socket.on("disconnect", () => {
|
||||
console.log("Disconnected from GSIO-Net node");
|
||||
});
|
||||
```
|
||||
|
||||
### Interacting with the Ledger
|
||||
|
||||
```typescript
|
||||
// Function to add a new entry to the ledger
|
||||
function addLedgerEntry(data) {
|
||||
socket.emit("add_ledger_entry", data);
|
||||
console.log("Adding ledger entry:", data);
|
||||
}
|
||||
|
||||
// Function to get all entries in the ledger
|
||||
function getLedgerEntries() {
|
||||
socket.emit("get_ledger");
|
||||
console.log("Requesting ledger entries");
|
||||
}
|
||||
|
||||
// Function to get all known nodes in the network
|
||||
function getKnownNodes() {
|
||||
socket.emit("get_known_nodes");
|
||||
console.log("Requesting known nodes");
|
||||
}
|
||||
|
||||
// Handle ledger-related events
|
||||
socket.on("ledger_entry_added", (entry) => {
|
||||
console.log("New ledger entry added:", entry);
|
||||
});
|
||||
|
||||
socket.on("ledger_entries", (entries) => {
|
||||
console.log("Received ledger entries:", entries);
|
||||
});
|
||||
|
||||
socket.on("known_nodes", (data) => {
|
||||
console.log("Known nodes in the network:", data.nodes);
|
||||
});
|
||||
|
||||
// Example usage
|
||||
addLedgerEntry({
|
||||
message: "Hello, distributed ledger!",
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
```
|
||||
|
||||
### Connecting to the P2P Network
|
||||
|
||||
```typescript
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
// Generate a unique ID for this node
|
||||
const nodeId = uuidv4();
|
||||
|
||||
// Connect to the relay server
|
||||
const websocket = new WebSocket("wss://localhost:8787");
|
||||
|
||||
// Set up event handlers
|
||||
websocket.addEventListener("open", () => {
|
||||
console.log("Connected to relay server");
|
||||
|
||||
// Announce this node to the network
|
||||
sendP2PMessage({
|
||||
message_type: "NodeAnnounce",
|
||||
sender_id: nodeId,
|
||||
recipient_id: "",
|
||||
payload: { node_id: nodeId }
|
||||
});
|
||||
});
|
||||
|
||||
websocket.addEventListener("message", (event) => {
|
||||
console.log("Message received from relay server");
|
||||
|
||||
try {
|
||||
const message = JSON.parse(event.data);
|
||||
handleP2PMessage(message);
|
||||
} catch (error) {
|
||||
console.error("Error parsing message:", error);
|
||||
}
|
||||
});
|
||||
|
||||
// Function to send a p2p message
|
||||
function sendP2PMessage(message) {
|
||||
// Add a unique message ID if not provided
|
||||
if (!message.message_id) {
|
||||
message.message_id = uuidv4();
|
||||
}
|
||||
|
||||
websocket.send(JSON.stringify(message));
|
||||
}
|
||||
|
||||
// Function to handle incoming p2p messages
|
||||
function handleP2PMessage(message) {
|
||||
console.log("Handling p2p message:", message);
|
||||
|
||||
switch (message.message_type) {
|
||||
case "NodeAnnounce":
|
||||
console.log(`Node announced: ${message.payload.node_id}`);
|
||||
break;
|
||||
case "NodeListResponse":
|
||||
console.log("Received node list:", message.payload.nodes);
|
||||
break;
|
||||
case "EntryAnnounce":
|
||||
console.log("New ledger entry announced:", message.payload);
|
||||
break;
|
||||
// Handle other message types...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### Socket.IO Events (Client to Server)
|
||||
|
||||
| Event | Description | Parameters |
|
||||
|-------|-------------|------------|
|
||||
| `add_ledger_entry` | Add a new entry to the ledger | JSON data to store |
|
||||
| `get_ledger` | Get all entries in the ledger | None |
|
||||
| `get_known_nodes` | Get all known nodes in the network | None |
|
||||
| `ping` | Simple ping to check connection | Any data |
|
||||
|
||||
### Socket.IO Events (Server to Client)
|
||||
|
||||
| Event | Description | Data |
|
||||
|-------|-------------|------|
|
||||
| `ledger_entry_added` | Notification of a new ledger entry | The added entry |
|
||||
| `ledger_entries` | Response with all ledger entries | Array of entries |
|
||||
| `known_nodes` | Response with all known nodes | Object with nodes array |
|
||||
| `pong` | Response to ping | Same data as ping |
|
||||
|
||||
### P2P Message Types
|
||||
|
||||
| Message Type | Description | Payload |
|
||||
|--------------|-------------|---------|
|
||||
| `NodeAnnounce` | Announce a new node | `{ node_id: string }` |
|
||||
| `NodeListRequest` | Request the list of known nodes | `{}` |
|
||||
| `NodeListResponse` | Response with the list of known nodes | `{ nodes: string[] }` |
|
||||
| `EntryAnnounce` | Announce a new ledger entry | Ledger entry object |
|
||||
| `EntryRequest` | Request a specific ledger entry | `{ entry_id: string }` |
|
||||
| `EntryResponse` | Response with a requested ledger entry | Ledger entry object |
|
||||
| `LedgerSyncRequest` | Request all ledger entries | `{}` |
|
||||
| `LedgerSyncResponse` | Response with all ledger entries | Array of ledger entries |
|
||||
|
||||
## Examples
|
||||
|
||||
The package includes example scripts:
|
||||
|
||||
- `node_listener.ts`: Demonstrates connecting to a gsio-node server
|
||||
- `ws_client.ts`: Demonstrates connecting to the gsio-relay server
|
||||
|
||||
To run these examples:
|
||||
|
||||
```bash
|
||||
# Run the Socket.IO client example
|
||||
bun src/listeners/node_listener.ts
|
||||
|
||||
# Run the WebSocket client example
|
||||
bun src/listeners/ws_client.ts
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
```bash
|
||||
# Run tests
|
||||
bun test
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
[Add license information here]
|
46
packages/gsio-node-client/bun.lock
Normal file
46
packages/gsio-node-client/bun.lock
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"lockfileVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "ts-sdk",
|
||||
"dependencies": {
|
||||
"socket.io-client": "^4.8.1",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest",
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="],
|
||||
|
||||
"@types/bun": ["@types/bun@1.2.16", "", { "dependencies": { "bun-types": "1.2.16" } }, "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ=="],
|
||||
|
||||
"@types/node": ["@types/node@24.0.1", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw=="],
|
||||
|
||||
"bun-types": ["bun-types@1.2.16", "", { "dependencies": { "@types/node": "*" } }, "sha512-ciXLrHV4PXax9vHvUrkvun9VPVGOVwbbbBF/Ev1cXz12lyEZMoJpIJABOfPcN9gDJRaiKF9MVbSygLg4NXu3/A=="],
|
||||
|
||||
"debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="],
|
||||
|
||||
"engine.io-client": ["engine.io-client@6.6.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w=="],
|
||||
|
||||
"engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="],
|
||||
|
||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
|
||||
"socket.io-client": ["socket.io-client@4.8.1", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ=="],
|
||||
|
||||
"socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="],
|
||||
|
||||
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
||||
|
||||
"undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="],
|
||||
|
||||
"ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="],
|
||||
|
||||
"xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="],
|
||||
}
|
||||
}
|
15
packages/gsio-node-client/package.json
Normal file
15
packages/gsio-node-client/package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "gsio-node-client",
|
||||
"module": "index.ts",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5"
|
||||
},
|
||||
"dependencies": {
|
||||
"socket.io-client": "^4.8.1"
|
||||
}
|
||||
}
|
86
packages/gsio-node-client/src/listeners/node_listener.ts
Executable file
86
packages/gsio-node-client/src/listeners/node_listener.ts
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bun
|
||||
|
||||
import { Manager as SocketIO } from "socket.io-client";
|
||||
|
||||
// Create a Socket.IO manager
|
||||
const socketIO = new SocketIO("http://localhost:3000");
|
||||
|
||||
// Connect to the root namespace
|
||||
const socket = socketIO.socket("/", {
|
||||
auth: {
|
||||
token: "abcd"
|
||||
}
|
||||
});
|
||||
|
||||
// Basic Socket.IO event handlers
|
||||
socket.on("connect", () => {
|
||||
console.log("Connected to GSIO-Net node");
|
||||
});
|
||||
|
||||
socket.on("disconnect", () => {
|
||||
console.log("Disconnected from GSIO-Net node");
|
||||
});
|
||||
|
||||
socket.on("error", (error) => {
|
||||
console.log("Socket error:", error);
|
||||
});
|
||||
|
||||
socket.on("reconnect", (attemptNumber) => {
|
||||
console.log("Reconnected after", attemptNumber, "attempts");
|
||||
});
|
||||
|
||||
socket.on("connect_error", (error) => {
|
||||
console.log("Connection error:", error);
|
||||
});
|
||||
|
||||
// Ledger-related event handlers
|
||||
socket.on("ledger_entry_added", (entry) => {
|
||||
console.log("New ledger entry added:");
|
||||
console.log(entry);
|
||||
});
|
||||
|
||||
socket.on("ledger_entries", (entries) => {
|
||||
console.log("Received ledger entries:");
|
||||
console.log(entries);
|
||||
});
|
||||
|
||||
socket.on("known_nodes", (data) => {
|
||||
console.log("Known nodes in the network:");
|
||||
console.log(data.nodes);
|
||||
});
|
||||
|
||||
// Send a ping message every 4 seconds
|
||||
setInterval(() => {
|
||||
socket.emit("ping", "ping message");
|
||||
console.log("Ping sent to server");
|
||||
}, 4000);
|
||||
|
||||
// Function to add a new entry to the ledger
|
||||
function addLedgerEntry(data: any) {
|
||||
socket.emit("add_ledger_entry", data);
|
||||
console.log("Adding ledger entry:", data);
|
||||
}
|
||||
|
||||
// Function to get all entries in the ledger
|
||||
function getLedgerEntries() {
|
||||
socket.emit("get_ledger");
|
||||
console.log("Requesting ledger entries");
|
||||
}
|
||||
|
||||
// Function to get all known nodes in the network
|
||||
function getKnownNodes() {
|
||||
socket.emit("get_known_nodes");
|
||||
console.log("Requesting known nodes");
|
||||
}
|
||||
|
||||
// Example usage
|
||||
setTimeout(() => {
|
||||
// Add a sample ledger entry after 2 seconds
|
||||
addLedgerEntry({ message: "Hello, distributed ledger!", timestamp: new Date().toISOString() });
|
||||
|
||||
// Get all ledger entries after 3 seconds
|
||||
setTimeout(getLedgerEntries, 1000);
|
||||
|
||||
// Get all known nodes after 4 seconds
|
||||
setTimeout(getKnownNodes, 2000);
|
||||
}, 2000);
|
116
packages/gsio-node-client/src/listeners/ws_client.ts
Normal file
116
packages/gsio-node-client/src/listeners/ws_client.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env bun
|
||||
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
// Generate a unique ID for this node
|
||||
const nodeId = uuidv4();
|
||||
console.log(`Starting p2p node with ID: ${nodeId}`);
|
||||
|
||||
// Connect to the relay server
|
||||
const websocket = new WebSocket(
|
||||
"wss://localhost:8787",
|
||||
);
|
||||
|
||||
// Set up event handlers
|
||||
websocket.addEventListener("open", () => {
|
||||
console.log("Connected to relay server");
|
||||
|
||||
// Announce this node to the network
|
||||
sendP2PMessage({
|
||||
message_type: "NodeAnnounce",
|
||||
sender_id: nodeId,
|
||||
recipient_id: "",
|
||||
payload: { node_id: nodeId }
|
||||
});
|
||||
|
||||
// Request the list of known nodes
|
||||
setTimeout(() => {
|
||||
sendP2PMessage({
|
||||
message_type: "NodeListRequest",
|
||||
sender_id: nodeId,
|
||||
recipient_id: "",
|
||||
payload: {}
|
||||
});
|
||||
}, 1000);
|
||||
});
|
||||
|
||||
websocket.addEventListener("message", (event) => {
|
||||
console.log("Message received from relay server");
|
||||
|
||||
try {
|
||||
const message = JSON.parse(event.data);
|
||||
handleP2PMessage(message);
|
||||
} catch (error) {
|
||||
console.error("Error parsing message:", error);
|
||||
console.log("Raw message:", event.data);
|
||||
}
|
||||
});
|
||||
|
||||
websocket.addEventListener("close", () => {
|
||||
console.log("Disconnected from relay server");
|
||||
});
|
||||
|
||||
websocket.addEventListener("error", (error) => {
|
||||
console.error("WebSocket error:", error);
|
||||
});
|
||||
|
||||
// Function to send a p2p message
|
||||
function sendP2PMessage(message: any) {
|
||||
// Add a unique message ID if not provided
|
||||
if (!message.message_id) {
|
||||
message.message_id = uuidv4();
|
||||
}
|
||||
|
||||
websocket.send(JSON.stringify(message));
|
||||
console.log("Sent p2p message:", message);
|
||||
}
|
||||
|
||||
// Function to handle incoming p2p messages
|
||||
function handleP2PMessage(message: any) {
|
||||
console.log("Handling p2p message:", message);
|
||||
|
||||
switch (message.message_type) {
|
||||
case "NodeAnnounce":
|
||||
console.log(`Node announced: ${message.payload.node_id}`);
|
||||
break;
|
||||
|
||||
case "NodeListResponse":
|
||||
console.log("Received node list:", message.payload.nodes);
|
||||
break;
|
||||
|
||||
case "EntryAnnounce":
|
||||
console.log("New ledger entry announced:", message.payload);
|
||||
break;
|
||||
|
||||
case "EntryResponse":
|
||||
console.log("Received ledger entry:", message.payload);
|
||||
break;
|
||||
|
||||
case "LedgerSyncResponse":
|
||||
console.log("Received ledger sync:", message.payload);
|
||||
break;
|
||||
|
||||
default:
|
||||
console.log("Unknown message type:", message.message_type);
|
||||
}
|
||||
}
|
||||
|
||||
// Example: Create and announce a ledger entry after 3 seconds
|
||||
setTimeout(() => {
|
||||
const entry = {
|
||||
id: `${nodeId}-${Date.now()}`,
|
||||
timestamp: new Date().toISOString(),
|
||||
data: { message: "Hello from p2p node!", timestamp: Date.now() },
|
||||
previous_hash: "0".repeat(64), // Genesis block has a hash of all zeros
|
||||
hash: "", // Will be calculated by the node
|
||||
creator_node_id: nodeId,
|
||||
signatures: {}
|
||||
};
|
||||
|
||||
sendP2PMessage({
|
||||
message_type: "EntryAnnounce",
|
||||
sender_id: nodeId,
|
||||
recipient_id: "",
|
||||
payload: entry
|
||||
});
|
||||
}, 3000);
|
68
packages/gsio-node-client/tests/socket_test.ts
Normal file
68
packages/gsio-node-client/tests/socket_test.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import { expect, test, describe, mock, spyOn } from "bun:test";
|
||||
import { Manager as SocketIO } from "socket.io-client";
|
||||
|
||||
// Mock the socket.io-client
|
||||
mock.module("socket.io-client", () => {
|
||||
const mockEmit = mock(() => {});
|
||||
const mockOn = mock((event, callback) => {
|
||||
// Simulate the "connect" event
|
||||
if (event === "connect") {
|
||||
callback();
|
||||
}
|
||||
return mockSocket;
|
||||
});
|
||||
|
||||
const mockSocket = {
|
||||
emit: mockEmit,
|
||||
on: mockOn,
|
||||
connected: true,
|
||||
id: "test-socket-id"
|
||||
};
|
||||
|
||||
const mockSocketIO = {
|
||||
socket: mock(() => mockSocket)
|
||||
};
|
||||
|
||||
return {
|
||||
Manager: mock(() => mockSocketIO)
|
||||
};
|
||||
});
|
||||
|
||||
describe("Socket.IO Client", () => {
|
||||
test("should connect to the server", () => {
|
||||
// Import the module that uses socket.io-client
|
||||
const socketIO = new SocketIO("http://localhost:3000");
|
||||
const socket = socketIO.socket("/");
|
||||
|
||||
// Verify the socket is connected
|
||||
expect(socket.connected).toBe(true);
|
||||
});
|
||||
|
||||
test("should emit events", () => {
|
||||
const socketIO = new SocketIO("http://localhost:3000");
|
||||
const socket = socketIO.socket("/");
|
||||
|
||||
// Spy on the emit method
|
||||
const emitSpy = spyOn(socket, "emit");
|
||||
|
||||
// Emit an event
|
||||
socket.emit("ping", "ping message");
|
||||
|
||||
// Verify the emit method was called with the correct arguments
|
||||
expect(emitSpy).toHaveBeenCalledWith("ping", "ping message");
|
||||
});
|
||||
|
||||
test("should handle events", () => {
|
||||
const socketIO = new SocketIO("http://localhost:3000");
|
||||
const socket = socketIO.socket("/");
|
||||
|
||||
// Create a mock callback
|
||||
const callback = mock(() => {});
|
||||
|
||||
// Register the callback for an event
|
||||
socket.on("message", callback);
|
||||
|
||||
// Verify the on method was called with the correct arguments
|
||||
expect(socket.on).toHaveBeenCalledWith("message", callback);
|
||||
});
|
||||
});
|
28
packages/gsio-node-client/tsconfig.json
Normal file
28
packages/gsio-node-client/tsconfig.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
// Environment setup & latest features
|
||||
"lib": ["ESNext"],
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"moduleDetection": "force",
|
||||
"jsx": "react-jsx",
|
||||
"allowJs": true,
|
||||
|
||||
// Bundler mode
|
||||
"moduleResolution": "bundler",
|
||||
"allowImportingTsExtensions": true,
|
||||
"verbatimModuleSyntax": true,
|
||||
"noEmit": true,
|
||||
|
||||
// Best practices
|
||||
"strict": true,
|
||||
"skipLibCheck": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noUncheckedIndexedAccess": true,
|
||||
|
||||
// Some stricter flags (disabled by default)
|
||||
"noUnusedLocals": false,
|
||||
"noUnusedParameters": false,
|
||||
"noPropertyAccessFromIndexSignature": false
|
||||
}
|
||||
}
|
20
packages/scripts/cleanup.sh
Executable file
20
packages/scripts/cleanup.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Clean up build artifacts and temporary directories
|
||||
echo "Cleaning up build artifacts and temporary directories..."
|
||||
|
||||
# Remove persisted data
|
||||
|
||||
# Remove node_modules directories
|
||||
find . -name "node_modules" -type d -prune -exec rm -rf {} \;
|
||||
|
||||
find . -name "target" -type d -prune -exec rm -rf {} \;
|
||||
|
||||
# Remove .wrangler directories
|
||||
find . -name ".wrangler" -type d -prune -exec rm -rf {} \;
|
||||
|
||||
# Remove build directories
|
||||
find . -name "dist" -type d -prune -exec rm -rf {} \;
|
||||
find . -name "build" -type d -prune -exec rm -rf {} \;
|
||||
|
||||
echo "Cleanup complete!"
|
Reference in New Issue
Block a user