oceanbus 0.2.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -1
- package/dist/agent/identity.d.ts.map +1 -1
- package/dist/agent/identity.js +13 -1
- package/dist/agent/identity.js.map +1 -1
- package/dist/client/errors.d.ts +4 -2
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +8 -3
- package/dist/client/errors.js.map +1 -1
- package/dist/client/http-client.d.ts.map +1 -1
- package/dist/client/http-client.js +9 -3
- package/dist/client/http-client.js.map +1 -1
- package/dist/crypto/pow.d.ts +12 -4
- package/dist/crypto/pow.d.ts.map +1 -1
- package/dist/crypto/pow.js +57 -9
- package/dist/crypto/pow.js.map +1 -1
- package/dist/messaging/send.js +1 -1
- package/dist/messaging/send.js.map +1 -1
- package/dist/types/api.d.ts +2 -1
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/api.js +3 -1
- package/dist/types/api.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,6 +9,39 @@
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
```mermaid
|
|
13
|
+
graph TB
|
|
14
|
+
subgraph CLIENTS["<b>Client Layer</b>"]
|
|
15
|
+
direction LR
|
|
16
|
+
LANG["LangChain / CrewAI"]
|
|
17
|
+
MCP_["MCP Client<br/>Claude Desktop · Cursor"]
|
|
18
|
+
CLI_["CLI<br/>oceanbus send/listen"]
|
|
19
|
+
SKILL["OpenClaw Skills<br/>Ocean Chat · Ocean Agent<br/>Captain Lobster · Guess AI"]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
subgraph SDK["<b>🌊 OceanBus SDK</b> <i>npm install oceanbus</i>"]
|
|
23
|
+
direction LR
|
|
24
|
+
ID["Identity<br/>Ed25519 Keys"]
|
|
25
|
+
ENC["E2E Encryption<br/>XChaCha20-Poly1305"]
|
|
26
|
+
POLL["Mailbox<br/>HTTP Poll Engine"]
|
|
27
|
+
L1C["L1 Client<br/>YP · Reputation · CA"]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
subgraph NET["<b>OceanBus Network</b>"]
|
|
31
|
+
L0["<b>L0 Core</b><br/>Encrypted Message Routing<br/>Global OpenID Addressing"]
|
|
32
|
+
L1["<b>L1 Services</b><br/>Yellow Pages · Reputation<br/>Certificate Authority"]
|
|
33
|
+
L0 --> L1
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
OTHER["<b>Other Agents</b><br/>Anywhere in the World"]
|
|
37
|
+
|
|
38
|
+
CLIENTS --> SDK
|
|
39
|
+
SDK <-->|"HTTP/2 · 2s Poll · E2EE"| NET
|
|
40
|
+
NET <-->|P2P Messages| OTHER
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
12
45
|
You built an AI Agent. It works perfectly on localhost. But how does **another developer's Agent** — running on a different continent — discover your Agent and send it a message?
|
|
13
46
|
|
|
14
47
|
Without OceanBus: buy a domain, configure DNS, provision SSL certificates, set up a load balancer, open firewall ports, write a WebSocket reconnect loop, build authentication middleware.
|
|
@@ -83,7 +116,7 @@ Organized by what you need — not by module structure.
|
|
|
83
116
|
| You want to... | Use this | Details |
|
|
84
117
|
|---------------|----------|---------|
|
|
85
118
|
| **Get a global identity** | `ob.register()` → `ob.getOpenId()` | Permanent address on the OceanBus network. No domain needed. |
|
|
86
|
-
| **Send messages** | `ob.send(openid, text)` |
|
|
119
|
+
| **Send messages** | `ob.send(openid, text)` | 128k-char limit. End-to-end encrypted (XChaCha20-Poly1305). |
|
|
87
120
|
| **Receive messages in real-time** | `ob.startListening(callback)` | Messages arrive within seconds. No refresh needed. |
|
|
88
121
|
| **Publish yourself** | `ob.publish({ tags, description })` | One line. Appears in Yellow Pages. Auto-heartbeat. |
|
|
89
122
|
| **Find services** | `ob.l1.yellowPages.discover(tags)` | Discover agents by tag. "Which agents do food delivery?" |
|
|
@@ -146,6 +179,26 @@ ob.startListening((msg) => {
|
|
|
146
179
|
});
|
|
147
180
|
```
|
|
148
181
|
|
|
182
|
+
### How Real-Time Delivery Works
|
|
183
|
+
|
|
184
|
+
OceanBus uses **HTTP polling** (not WebSocket or SSE). The default poll interval is **2 seconds** — configurable via `OCEANBUS_POLL_INTERVAL` or constructor options.
|
|
185
|
+
|
|
186
|
+
| Mechanism | OceanBus choice | Why |
|
|
187
|
+
|-----------|----------------|-----|
|
|
188
|
+
| **Transport** | HTTP/2 long-poll | Works behind every proxy, firewall, and NAT. No persistent connections to manage. |
|
|
189
|
+
| **Default interval** | 2000ms | Balances responsiveness with server load. Messages typically arrive within 2s of being sent. |
|
|
190
|
+
| **Per-poll cost** | ~1 KB | A `GET /messages/sync?since_seq=N` call with a lightweight JSON response. Negligible bandwidth. |
|
|
191
|
+
| **CPU overhead** | Near zero | Each poll is a single HTTP request. The SDK sleeps between polls — no spin loop, no busy-wait. |
|
|
192
|
+
| **Configurable** | `OCEANBUS_POLL_INTERVAL` | Reduce to 500ms for latency-sensitive use cases; increase to 10s for low-priority background agents. |
|
|
193
|
+
|
|
194
|
+
**Why not WebSocket?** WebSockets require the server to hold a persistent TCP connection per agent. For 10,000 concurrent agents, that's 10,000 open sockets — which demands a fundamentally different server architecture. Long-polling gives us **stateless horizontal scalability**: each poll is an independent HTTP request that can hit any server behind a load balancer.
|
|
195
|
+
|
|
196
|
+
**Why not SSE?** Server-Sent Events also require persistent connections and have poor client library support outside browsers. HTTP polling works identically in Node.js, Python, curl, and any HTTP client — no special protocol support needed.
|
|
197
|
+
|
|
198
|
+
**L1 request/response** uses the same unified poll engine with a separate 1000ms interval for request polling and 5-minute heartbeats — all sharing one timer to minimize resource usage.
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
149
202
|
---
|
|
150
203
|
|
|
151
204
|
## Configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAQ/E,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,WAAW,CAAuB;gBAE9B,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAM/D,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAMlD,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAwBrC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAO7B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAM5B,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC;IAQ7C,OAAO,IAAI,UAAU;IAWrB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOlC,aAAa,CAAC,GAAG,EAAE,OAAO,gBAAgB,EAAE,UAAU,GAAG,IAAI;IAI7D,OAAO,CAAC,UAAU;CAKnB"}
|
package/dist/agent/identity.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AgentIdentityManager = void 0;
|
|
4
4
|
const errors_1 = require("../client/errors");
|
|
5
|
+
const pow_1 = require("../crypto/pow");
|
|
5
6
|
class AgentIdentityManager {
|
|
6
7
|
http;
|
|
7
8
|
apiKey;
|
|
@@ -29,8 +30,19 @@ class AgentIdentityManager {
|
|
|
29
30
|
this.openidCache = null; // invalidate openid cache
|
|
30
31
|
}
|
|
31
32
|
async register() {
|
|
32
|
-
|
|
33
|
+
// First attempt: server may respond with 401 + POW challenge
|
|
34
|
+
let res = await this.http.post('/agents/register', {});
|
|
35
|
+
// POW challenge: HTTP 401 with data.challenge.nonce
|
|
36
|
+
const challengeData = res.data?.challenge;
|
|
37
|
+
if (challengeData?.nonce) {
|
|
38
|
+
const { nonce } = challengeData;
|
|
39
|
+
const { solution } = (0, pow_1.computeHashcash)(nonce);
|
|
40
|
+
res = await this.http.post('/agents/register', { challenge: nonce, solution });
|
|
41
|
+
}
|
|
33
42
|
const data = res.data;
|
|
43
|
+
if (!data.agent_id || !data.api_key) {
|
|
44
|
+
throw new errors_1.OceanBusError('Registration failed: no agent_id or api_key in response');
|
|
45
|
+
}
|
|
34
46
|
this.agentId = data.agent_id;
|
|
35
47
|
this.apiKey = data.api_key;
|
|
36
48
|
this.openidCache = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":";;;AAEA,6CAAiD;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/client/errors.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export declare class ApiError extends Error {
|
|
2
2
|
code: number;
|
|
3
3
|
httpStatus: number;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
retryAfterSeconds: number | null;
|
|
5
|
+
constructor(code: number, msg: string, httpStatus?: number, retryAfterSeconds?: number | null);
|
|
6
|
+
static fromResponse(code: number, msg: string, httpStatus?: number, retryAfterSeconds?: number | null): ApiError;
|
|
6
7
|
isAuthError(): boolean;
|
|
8
|
+
isRateLimited(): boolean;
|
|
7
9
|
isBusinessError(): boolean;
|
|
8
10
|
}
|
|
9
11
|
export declare class NetworkError extends Error {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,EAAE,iBAAiB,GAAE,MAAM,GAAG,IAAW;IAQxG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,EAAE,iBAAiB,GAAE,MAAM,GAAG,IAAW,GAAG,QAAQ;IAK3H,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,eAAe,IAAI,OAAO;CAG3B;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,aAAa,EAAE,KAAK,CAAC;gBAET,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK;CAKlD;AAED,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/client/errors.js
CHANGED
|
@@ -5,19 +5,24 @@ const api_1 = require("../types/api");
|
|
|
5
5
|
class ApiError extends Error {
|
|
6
6
|
code;
|
|
7
7
|
httpStatus;
|
|
8
|
-
|
|
8
|
+
retryAfterSeconds;
|
|
9
|
+
constructor(code, msg, httpStatus = 200, retryAfterSeconds = null) {
|
|
9
10
|
super(msg);
|
|
10
11
|
this.name = 'ApiError';
|
|
11
12
|
this.code = code;
|
|
12
13
|
this.httpStatus = httpStatus;
|
|
14
|
+
this.retryAfterSeconds = retryAfterSeconds;
|
|
13
15
|
}
|
|
14
|
-
static fromResponse(code, msg, httpStatus = 200) {
|
|
16
|
+
static fromResponse(code, msg, httpStatus = 200, retryAfterSeconds = null) {
|
|
15
17
|
const message = api_1.ErrorMessages[code] || msg || 'unknown error';
|
|
16
|
-
return new ApiError(code, message, httpStatus);
|
|
18
|
+
return new ApiError(code, message, httpStatus, retryAfterSeconds);
|
|
17
19
|
}
|
|
18
20
|
isAuthError() {
|
|
19
21
|
return this.httpStatus === 401;
|
|
20
22
|
}
|
|
23
|
+
isRateLimited() {
|
|
24
|
+
return this.code === 1007;
|
|
25
|
+
}
|
|
21
26
|
isBusinessError() {
|
|
22
27
|
return this.httpStatus === 200 && this.code !== api_1.ErrorCode.SUCCESS;
|
|
23
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":";;;AAAA,sCAAwD;AAExD,MAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,CAAS;IACb,UAAU,CAAS;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":";;;AAAA,sCAAwD;AAExD,MAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,CAAS;IACb,UAAU,CAAS;IACnB,iBAAiB,CAAgB;IAEjC,YAAY,IAAY,EAAE,GAAW,EAAE,aAAqB,GAAG,EAAE,oBAAmC,IAAI;QACtG,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAY,EAAE,GAAW,EAAE,aAAqB,GAAG,EAAE,oBAAmC,IAAI;QAC9G,MAAM,OAAO,GAAG,mBAAa,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,CAAC;QAC9D,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACpE,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC;IACjC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAC5B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,UAAU,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,eAAS,CAAC,OAAO,CAAC;IACpE,CAAC;CACF;AA7BD,4BA6BC;AAED,MAAa,YAAa,SAAQ,KAAK;IACrC,aAAa,CAAQ;IAErB,YAAY,OAAe,EAAE,aAAoB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AARD,oCAQC;AAED,MAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/client/http-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,KAAK,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;CACrD;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,WAAW,EAAE,WAAW,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAM/C,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,GAAG;IA2BL,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/client/http-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,KAAK,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;CACrD;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,WAAW,EAAE,WAAW,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAM/C,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,GAAG;IA2BL,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA4CpB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAIlF,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAInG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAIlG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAGzF"}
|
|
@@ -96,9 +96,14 @@ class HttpClient {
|
|
|
96
96
|
const e = err;
|
|
97
97
|
throw new errors_1.NetworkError(`HTTP request failed: ${e.message}`, e);
|
|
98
98
|
}
|
|
99
|
-
// HTTP 401 =
|
|
99
|
+
// HTTP 401 with challenge data = POW required (registration flow)
|
|
100
|
+
// Return raw response so caller can extract nonce and compute solution
|
|
100
101
|
if (res.status === 401) {
|
|
101
|
-
|
|
102
|
+
const bodyData = res.body;
|
|
103
|
+
if (bodyData?.data?.challenge) {
|
|
104
|
+
return bodyData;
|
|
105
|
+
}
|
|
106
|
+
throw errors_1.ApiError.fromResponse(bodyData?.code ?? -1, bodyData?.msg ?? 'unauthorized', 401);
|
|
102
107
|
}
|
|
103
108
|
// Parse body as ApiResponse envelope
|
|
104
109
|
const bodyData = res.body;
|
|
@@ -107,7 +112,8 @@ class HttpClient {
|
|
|
107
112
|
}
|
|
108
113
|
// Business error (non-zero code)
|
|
109
114
|
if (bodyData.code !== 0) {
|
|
110
|
-
|
|
115
|
+
const retryAfter = res.status === 429 ? parseInt(res.headers['retry-after'], 10) || null : null;
|
|
116
|
+
throw errors_1.ApiError.fromResponse(bodyData.code, bodyData.msg, res.status, retryAfter);
|
|
111
117
|
}
|
|
112
118
|
return bodyData;
|
|
113
119
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/client/http-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/client/http-client.ts"],"names":[],"mappings":"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"}
|
package/dist/crypto/pow.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Compute Hashcash-style Proof of Work.
|
|
3
|
+
* Finds a solution such that SHA256(challenge + solution) starts with `difficulty` zeros.
|
|
4
|
+
*/
|
|
5
|
+
export declare function computeHashcash(challenge: string, difficulty?: number): {
|
|
6
|
+
solution: string;
|
|
7
|
+
hash: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Verify a Hashcash solution.
|
|
11
|
+
*/
|
|
12
|
+
export declare function verifyHashcash(challenge: string, solution: string, difficulty?: number): boolean;
|
|
5
13
|
//# sourceMappingURL=pow.d.ts.map
|
package/dist/crypto/pow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pow.d.ts","sourceRoot":"","sources":["../../src/crypto/pow.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"pow.d.ts","sourceRoot":"","sources":["../../src/crypto/pow.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAA2B,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAU9H;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,MAA2B,GAAG,OAAO,CAIpH"}
|
package/dist/crypto/pow.js
CHANGED
|
@@ -1,16 +1,64 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
5
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
36
|
exports.computeHashcash = computeHashcash;
|
|
7
37
|
exports.verifyHashcash = verifyHashcash;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
const DEFAULT_DIFFICULTY = 5; // 5 leading zeros: '00000...'
|
|
40
|
+
/**
|
|
41
|
+
* Compute Hashcash-style Proof of Work.
|
|
42
|
+
* Finds a solution such that SHA256(challenge + solution) starts with `difficulty` zeros.
|
|
43
|
+
*/
|
|
44
|
+
function computeHashcash(challenge, difficulty = DEFAULT_DIFFICULTY) {
|
|
45
|
+
const prefix = '0'.repeat(difficulty);
|
|
46
|
+
let solution = 0;
|
|
47
|
+
let hash = '';
|
|
48
|
+
while (true) {
|
|
49
|
+
hash = crypto.createHash('sha256').update(challenge + solution).digest('hex');
|
|
50
|
+
if (hash.startsWith(prefix))
|
|
51
|
+
break;
|
|
52
|
+
solution++;
|
|
53
|
+
}
|
|
54
|
+
return { solution: String(solution), hash };
|
|
11
55
|
}
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Verify a Hashcash solution.
|
|
58
|
+
*/
|
|
59
|
+
function verifyHashcash(challenge, solution, difficulty = DEFAULT_DIFFICULTY) {
|
|
60
|
+
const prefix = '0'.repeat(difficulty);
|
|
61
|
+
const hash = crypto.createHash('sha256').update(challenge + solution).digest('hex');
|
|
62
|
+
return hash.startsWith(prefix);
|
|
15
63
|
}
|
|
16
64
|
//# sourceMappingURL=pow.js.map
|
package/dist/crypto/pow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pow.js","sourceRoot":"","sources":["../../src/crypto/pow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pow.js","sourceRoot":"","sources":["../../src/crypto/pow.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,0CAUC;AAKD,wCAIC;AA3BD,+CAAiC;AAEjC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC,8BAA8B;AAE5D;;;GAGG;AACH,SAAgB,eAAe,CAAC,SAAiB,EAAE,aAAqB,kBAAkB;IACxF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,MAAM;QACnC,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,SAAiB,EAAE,QAAgB,EAAE,aAAqB,kBAAkB;IACzG,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/messaging/send.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.MessagingService = void 0;
|
|
|
4
4
|
const api_1 = require("../types/api");
|
|
5
5
|
const errors_1 = require("../client/errors");
|
|
6
6
|
const idgen_1 = require("./idgen");
|
|
7
|
-
const MAX_CONTENT_LENGTH =
|
|
7
|
+
const MAX_CONTENT_LENGTH = 128000;
|
|
8
8
|
class MessagingService {
|
|
9
9
|
http;
|
|
10
10
|
getApiKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/messaging/send.ts"],"names":[],"mappings":";;;AAEA,sCAAyC;AACzC,6CAA2D;AAC3D,mCAA8C;AAE9C,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/messaging/send.ts"],"names":[],"mappings":";;;AAEA,sCAAyC;AACzC,6CAA2D;AAC3D,mCAA8C;AAE9C,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAa,gBAAgB;IACnB,IAAI,CAAa;IACjB,SAAS,CAAsB;IAEvC,YAAY,IAAgB,EAAE,SAA8B;QAC1D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,OAAe,EAAE,WAAoB;QAChE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,sBAAa,CAAC,4BAA4B,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,sBAAa,CAAC,mBAAmB,CAAC,CAAC;QAE1D,0BAA0B;QAC1B,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACxC,MAAM,IAAI,sBAAa,CAAC,mBAAmB,kBAAkB,qBAAqB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,OAAO,GAAgB;YAC3B,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,WAAW,IAAI,IAAA,2BAAmB,GAAE;YACnD,OAAO;SACR,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,iBAAQ,EAAE,CAAC;gBAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,eAAS,CAAC,iBAAiB,EAAE,CAAC;oBAC7C,MAAM,IAAI,sBAAa,CAAC,oDAAoD,CAAC,CAAC;gBAChF,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAS,CAAC,cAAc,EAAE,CAAC;oBAC1C,MAAM,IAAI,sBAAa,CAAC,0BAA0B,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAS,CAAC,gBAAgB,EAAE,CAAC;oBAC5C,MAAM,IAAI,sBAAa,CAAC,yBAAyB,kBAAkB,SAAS,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,IAAY,EAAE,WAAoB;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;CACF;AAlDD,4CAkDC"}
|
package/dist/types/api.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ export declare enum ErrorCode {
|
|
|
11
11
|
CONTENT_TOO_LONG = 1004,
|
|
12
12
|
INSUFFICIENT_PERMISSION = 1005,
|
|
13
13
|
INVALID_OPENID_REVERSE = 1006,
|
|
14
|
-
BLOCKED_RECIPIENT = 2001
|
|
14
|
+
BLOCKED_RECIPIENT = 2001,
|
|
15
|
+
RATE_LIMITED = 1007
|
|
15
16
|
}
|
|
16
17
|
export declare const ErrorMessages: Record<number, string>;
|
|
17
18
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/types/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,CAAC;CACT;AAED,oBAAY,SAAS;IACnB,OAAO,IAAI;IACX,aAAa,OAAO;IACpB,cAAc,OAAO;IACrB,qBAAqB,OAAO;IAC5B,gBAAgB,OAAO;IACvB,uBAAuB,OAAO;IAC9B,sBAAsB,OAAO;IAC7B,iBAAiB,OAAO;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,CAAC;CACT;AAED,oBAAY,SAAS;IACnB,OAAO,IAAI;IACX,aAAa,OAAO;IACpB,cAAc,OAAO;IACrB,qBAAqB,OAAO;IAC5B,gBAAgB,OAAO;IACvB,uBAAuB,OAAO;IAC9B,sBAAsB,OAAO;IAC7B,iBAAiB,OAAO;IACxB,YAAY,OAAO;CACpB;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUhD,CAAC"}
|
package/dist/types/api.js
CHANGED
|
@@ -13,15 +13,17 @@ var ErrorCode;
|
|
|
13
13
|
ErrorCode[ErrorCode["INSUFFICIENT_PERMISSION"] = 1005] = "INSUFFICIENT_PERMISSION";
|
|
14
14
|
ErrorCode[ErrorCode["INVALID_OPENID_REVERSE"] = 1006] = "INVALID_OPENID_REVERSE";
|
|
15
15
|
ErrorCode[ErrorCode["BLOCKED_RECIPIENT"] = 2001] = "BLOCKED_RECIPIENT";
|
|
16
|
+
ErrorCode[ErrorCode["RATE_LIMITED"] = 1007] = "RATE_LIMITED";
|
|
16
17
|
})(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
|
|
17
18
|
exports.ErrorMessages = {
|
|
18
19
|
[ErrorCode.SUCCESS]: 'success',
|
|
19
20
|
[ErrorCode.MISSING_FIELD]: 'missing required field',
|
|
20
21
|
[ErrorCode.INVALID_OPENID]: 'invalid to_openid',
|
|
21
22
|
[ErrorCode.INVALID_CLIENT_MSG_ID]: 'invalid client_msg_id format',
|
|
22
|
-
[ErrorCode.CONTENT_TOO_LONG]: 'content exceeds
|
|
23
|
+
[ErrorCode.CONTENT_TOO_LONG]: 'content exceeds 128k character limit',
|
|
23
24
|
[ErrorCode.INSUFFICIENT_PERMISSION]: 'insufficient permission',
|
|
24
25
|
[ErrorCode.INVALID_OPENID_REVERSE]: 'invalid openid for reverse lookup',
|
|
25
26
|
[ErrorCode.BLOCKED_RECIPIENT]: 'target blocked, message intercepted',
|
|
27
|
+
[ErrorCode.RATE_LIMITED]: 'rate limited, check Retry-After header',
|
|
26
28
|
};
|
|
27
29
|
//# sourceMappingURL=api.js.map
|
package/dist/types/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC,kEAAkE;;;AAQlE,IAAY,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC,kEAAkE;;;AAQlE,IAAY,SAUX;AAVD,WAAY,SAAS;IACnB,+CAAW,CAAA;IACX,8DAAoB,CAAA;IACpB,gEAAqB,CAAA;IACrB,8EAA4B,CAAA;IAC5B,oEAAuB,CAAA;IACvB,kFAA8B,CAAA;IAC9B,gFAA6B,CAAA;IAC7B,sEAAwB,CAAA;IACxB,4DAAmB,CAAA;AACrB,CAAC,EAVW,SAAS,yBAAT,SAAS,QAUpB;AAEY,QAAA,aAAa,GAA2B;IACnD,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS;IAC9B,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,wBAAwB;IACnD,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,mBAAmB;IAC/C,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,8BAA8B;IACjE,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,sCAAsC;IACpE,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAE,yBAAyB;IAC9D,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,mCAAmC;IACvE,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,qCAAqC;IACpE,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,wCAAwC;CACnE,CAAC"}
|