@roj-ai/shared 0.1.8 → 0.1.10
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/dist/rpc/client.d.ts +24 -0
- package/dist/rpc/client.d.ts.map +1 -1
- package/dist/rpc/client.js +46 -5
- package/dist/rpc/client.js.map +1 -1
- package/package.json +2 -2
- package/src/rpc/client.ts +53 -6
package/dist/rpc/client.d.ts
CHANGED
|
@@ -51,6 +51,7 @@ type BatchResults<T extends readonly BatchEntry<unknown>[]> = {
|
|
|
51
51
|
export declare class RpcClient {
|
|
52
52
|
private baseUrl;
|
|
53
53
|
private projectId;
|
|
54
|
+
private authToken;
|
|
54
55
|
constructor(baseUrl?: string);
|
|
55
56
|
/**
|
|
56
57
|
* Get the base URL for non-RPC requests.
|
|
@@ -65,11 +66,34 @@ export declare class RpcClient {
|
|
|
65
66
|
* Get the currently configured project ID.
|
|
66
67
|
*/
|
|
67
68
|
getProjectId(): string | null;
|
|
69
|
+
/**
|
|
70
|
+
* Set the bearer token for authenticated RPC calls. Sent as
|
|
71
|
+
* `Authorization: Bearer <token>` so the platform doesn't have to fall
|
|
72
|
+
* back to cookie auth (which requires a separate `/exchange` round-trip
|
|
73
|
+
* and breaks under cross-origin third-party-cookie blocking).
|
|
74
|
+
*/
|
|
75
|
+
setAuthToken(token: string | null): void;
|
|
76
|
+
/**
|
|
77
|
+
* Get the currently configured bearer token.
|
|
78
|
+
*/
|
|
79
|
+
getAuthToken(): string | null;
|
|
68
80
|
private getRpcUrl;
|
|
81
|
+
private buildHeaders;
|
|
69
82
|
/**
|
|
70
83
|
* Call an RPC method with type-safe input and output.
|
|
71
84
|
*/
|
|
72
85
|
call<M extends RpcMethodName>(method: M, input: RpcInput<M>): Promise<Result<RpcOutput<M>, RpcErrorInfo>>;
|
|
86
|
+
/**
|
|
87
|
+
* Low-level RPC call that bypasses the typed method registry.
|
|
88
|
+
*
|
|
89
|
+
* Same transport, headers, and auth as `call`, but with `string` method
|
|
90
|
+
* names and `unknown` input/output. Intended for callers that operate
|
|
91
|
+
* against a different method registry than the agent runtime's
|
|
92
|
+
* `RpcMethods` (e.g. platform/instance methods defined in
|
|
93
|
+
* `@roj-ai/client/platform`). Build a typed wrapper on top — do not call
|
|
94
|
+
* directly from app code.
|
|
95
|
+
*/
|
|
96
|
+
callUntyped(method: string, input: unknown): Promise<Result<unknown, RpcErrorInfo>>;
|
|
73
97
|
/**
|
|
74
98
|
* Execute multiple RPC calls as a batch.
|
|
75
99
|
*/
|
package/dist/rpc/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAE1B,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,YAAY;gBADnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY;CAK3B;AAiBD;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,EAAE;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,YAAY;IACxB,GAAG,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAGrF;AAED;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC5D,CAAA;AAED;;GAEG;AACH,qBAAa,SAAS;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAE1B,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,YAAY;gBADnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY;CAK3B;AAiBD;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,EAAE;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,YAAY;IACxB,GAAG,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAGrF;AAED;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC5D,CAAA;AAED;;GAEG;AACH,qBAAa,SAAS;IAIT,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,SAAS,CAAsB;gBAEnB,OAAO,GAAE,MAAW;IAExC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI5C;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIxC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACG,IAAI,CAAC,CAAC,SAAS,aAAa,EACjC,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAChB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAI9C;;;;;;;;;OASG;IACG,WAAW,CAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IA8BzC;;OAEG;IACG,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,EACzD,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;CAuCjD"}
|
package/dist/rpc/client.js
CHANGED
|
@@ -36,6 +36,7 @@ export class BatchBuilder {
|
|
|
36
36
|
export class RpcClient {
|
|
37
37
|
baseUrl;
|
|
38
38
|
projectId = null;
|
|
39
|
+
authToken = null;
|
|
39
40
|
constructor(baseUrl = '') {
|
|
40
41
|
this.baseUrl = baseUrl;
|
|
41
42
|
}
|
|
@@ -58,6 +59,21 @@ export class RpcClient {
|
|
|
58
59
|
getProjectId() {
|
|
59
60
|
return this.projectId;
|
|
60
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Set the bearer token for authenticated RPC calls. Sent as
|
|
64
|
+
* `Authorization: Bearer <token>` so the platform doesn't have to fall
|
|
65
|
+
* back to cookie auth (which requires a separate `/exchange` round-trip
|
|
66
|
+
* and breaks under cross-origin third-party-cookie blocking).
|
|
67
|
+
*/
|
|
68
|
+
setAuthToken(token) {
|
|
69
|
+
this.authToken = token;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the currently configured bearer token.
|
|
73
|
+
*/
|
|
74
|
+
getAuthToken() {
|
|
75
|
+
return this.authToken;
|
|
76
|
+
}
|
|
61
77
|
getRpcUrl() {
|
|
62
78
|
let url = `${this.baseUrl}/rpc`;
|
|
63
79
|
if (this.projectId) {
|
|
@@ -65,20 +81,45 @@ export class RpcClient {
|
|
|
65
81
|
}
|
|
66
82
|
return url;
|
|
67
83
|
}
|
|
84
|
+
buildHeaders(extra) {
|
|
85
|
+
if (!this.authToken)
|
|
86
|
+
return extra;
|
|
87
|
+
return { ...extra, Authorization: `Bearer ${this.authToken}` };
|
|
88
|
+
}
|
|
68
89
|
/**
|
|
69
90
|
* Call an RPC method with type-safe input and output.
|
|
70
91
|
*/
|
|
71
92
|
async call(method, input) {
|
|
93
|
+
return this.callUntyped(method, input);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Low-level RPC call that bypasses the typed method registry.
|
|
97
|
+
*
|
|
98
|
+
* Same transport, headers, and auth as `call`, but with `string` method
|
|
99
|
+
* names and `unknown` input/output. Intended for callers that operate
|
|
100
|
+
* against a different method registry than the agent runtime's
|
|
101
|
+
* `RpcMethods` (e.g. platform/instance methods defined in
|
|
102
|
+
* `@roj-ai/client/platform`). Build a typed wrapper on top — do not call
|
|
103
|
+
* directly from app code.
|
|
104
|
+
*/
|
|
105
|
+
async callUntyped(method, input) {
|
|
72
106
|
const response = await fetch(this.getRpcUrl(), {
|
|
73
107
|
method: 'POST',
|
|
74
|
-
headers: { 'Content-Type': 'application/json' },
|
|
108
|
+
headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
|
|
75
109
|
body: JSON.stringify({ method, input }),
|
|
76
110
|
credentials: 'include',
|
|
77
111
|
});
|
|
78
|
-
const data = (await response.json());
|
|
79
|
-
// Transport error (non-200 for invalid JSON, missing method)
|
|
112
|
+
const data = (await response.json().catch(() => ({})));
|
|
113
|
+
// Transport error (non-200 for invalid JSON, missing method, auth failure, …).
|
|
114
|
+
// The instance-auth 401 body uses `{ error: { code, message } }` rather than
|
|
115
|
+
// `{ error: { type, message } }`; normalize it so callers always see a
|
|
116
|
+
// well-formed `RpcErrorInfo`.
|
|
80
117
|
if (!response.ok) {
|
|
81
|
-
|
|
118
|
+
const raw = data.error;
|
|
119
|
+
if (raw && (raw.type || raw.code) && raw.message) {
|
|
120
|
+
return Err({ type: raw.type ?? raw.code ?? 'transport_error', message: raw.message, details: raw.details });
|
|
121
|
+
}
|
|
122
|
+
return Err({ type: 'transport_error', message: `Request failed (HTTP ${response.status})` });
|
|
82
123
|
}
|
|
83
124
|
// Application result
|
|
84
125
|
if (data.ok) {
|
|
@@ -93,7 +134,7 @@ export class RpcClient {
|
|
|
93
134
|
const entries = buildCalls(new BatchBuilder());
|
|
94
135
|
const response = await fetch(this.getRpcUrl(), {
|
|
95
136
|
method: 'POST',
|
|
96
|
-
headers: { 'Content-Type': 'application/json' },
|
|
137
|
+
headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
|
|
97
138
|
body: JSON.stringify({
|
|
98
139
|
batch: entries.map(e => ({ method: e.method, input: e.input })),
|
|
99
140
|
}),
|
package/dist/rpc/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAW1C;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAE1B;IACA;IAFR,YACQ,MAAc,EACd,KAAmB;QAE1B,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAHb,WAAM,GAAN,MAAM,CAAQ;QACd,UAAK,GAAL,KAAK,CAAc;QAG1B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;IACvB,CAAC;CACD;AAyBD;;GAEG;AACH,MAAM,OAAO,YAAY;IACxB,GAAG,CAA0B,MAAS,EAAE,KAAkB;QACzD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;CACD;AASD;;GAEG;AACH,MAAM,OAAO,SAAS;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roj-ai/shared",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"zod": "^4.1.12"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@roj-ai/sdk": "^0.1.
|
|
41
|
+
"@roj-ai/sdk": "^0.1.10",
|
|
42
42
|
"typescript": "^5.7.2"
|
|
43
43
|
},
|
|
44
44
|
"types": "./dist/index.d.ts"
|
package/src/rpc/client.ts
CHANGED
|
@@ -79,6 +79,7 @@ type BatchResults<T extends readonly BatchEntry<unknown>[]> = {
|
|
|
79
79
|
*/
|
|
80
80
|
export class RpcClient {
|
|
81
81
|
private projectId: string | null = null
|
|
82
|
+
private authToken: string | null = null
|
|
82
83
|
|
|
83
84
|
constructor(private baseUrl: string = '') {}
|
|
84
85
|
|
|
@@ -104,6 +105,23 @@ export class RpcClient {
|
|
|
104
105
|
return this.projectId
|
|
105
106
|
}
|
|
106
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Set the bearer token for authenticated RPC calls. Sent as
|
|
110
|
+
* `Authorization: Bearer <token>` so the platform doesn't have to fall
|
|
111
|
+
* back to cookie auth (which requires a separate `/exchange` round-trip
|
|
112
|
+
* and breaks under cross-origin third-party-cookie blocking).
|
|
113
|
+
*/
|
|
114
|
+
setAuthToken(token: string | null): void {
|
|
115
|
+
this.authToken = token
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Get the currently configured bearer token.
|
|
120
|
+
*/
|
|
121
|
+
getAuthToken(): string | null {
|
|
122
|
+
return this.authToken
|
|
123
|
+
}
|
|
124
|
+
|
|
107
125
|
private getRpcUrl(): string {
|
|
108
126
|
let url = `${this.baseUrl}/rpc`
|
|
109
127
|
if (this.projectId) {
|
|
@@ -112,6 +130,11 @@ export class RpcClient {
|
|
|
112
130
|
return url
|
|
113
131
|
}
|
|
114
132
|
|
|
133
|
+
private buildHeaders(extra: Record<string, string>): Record<string, string> {
|
|
134
|
+
if (!this.authToken) return extra
|
|
135
|
+
return { ...extra, Authorization: `Bearer ${this.authToken}` }
|
|
136
|
+
}
|
|
137
|
+
|
|
115
138
|
/**
|
|
116
139
|
* Call an RPC method with type-safe input and output.
|
|
117
140
|
*/
|
|
@@ -119,23 +142,47 @@ export class RpcClient {
|
|
|
119
142
|
method: M,
|
|
120
143
|
input: RpcInput<M>,
|
|
121
144
|
): Promise<Result<RpcOutput<M>, RpcErrorInfo>> {
|
|
145
|
+
return this.callUntyped(method, input) as Promise<Result<RpcOutput<M>, RpcErrorInfo>>
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Low-level RPC call that bypasses the typed method registry.
|
|
150
|
+
*
|
|
151
|
+
* Same transport, headers, and auth as `call`, but with `string` method
|
|
152
|
+
* names and `unknown` input/output. Intended for callers that operate
|
|
153
|
+
* against a different method registry than the agent runtime's
|
|
154
|
+
* `RpcMethods` (e.g. platform/instance methods defined in
|
|
155
|
+
* `@roj-ai/client/platform`). Build a typed wrapper on top — do not call
|
|
156
|
+
* directly from app code.
|
|
157
|
+
*/
|
|
158
|
+
async callUntyped(
|
|
159
|
+
method: string,
|
|
160
|
+
input: unknown,
|
|
161
|
+
): Promise<Result<unknown, RpcErrorInfo>> {
|
|
122
162
|
const response = await fetch(this.getRpcUrl(), {
|
|
123
163
|
method: 'POST',
|
|
124
|
-
headers: { 'Content-Type': 'application/json' },
|
|
164
|
+
headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
|
|
125
165
|
body: JSON.stringify({ method, input }),
|
|
126
166
|
credentials: 'include',
|
|
127
167
|
})
|
|
128
168
|
|
|
129
|
-
const data = (await response.json()) as RpcResponse
|
|
169
|
+
const data = (await response.json().catch(() => ({}))) as RpcResponse
|
|
130
170
|
|
|
131
|
-
// Transport error (non-200 for invalid JSON, missing method)
|
|
171
|
+
// Transport error (non-200 for invalid JSON, missing method, auth failure, …).
|
|
172
|
+
// The instance-auth 401 body uses `{ error: { code, message } }` rather than
|
|
173
|
+
// `{ error: { type, message } }`; normalize it so callers always see a
|
|
174
|
+
// well-formed `RpcErrorInfo`.
|
|
132
175
|
if (!response.ok) {
|
|
133
|
-
|
|
176
|
+
const raw = data.error as { type?: string; code?: string; message?: string; details?: unknown } | undefined
|
|
177
|
+
if (raw && (raw.type || raw.code) && raw.message) {
|
|
178
|
+
return Err({ type: raw.type ?? raw.code ?? 'transport_error', message: raw.message, details: raw.details })
|
|
179
|
+
}
|
|
180
|
+
return Err({ type: 'transport_error', message: `Request failed (HTTP ${response.status})` })
|
|
134
181
|
}
|
|
135
182
|
|
|
136
183
|
// Application result
|
|
137
184
|
if (data.ok) {
|
|
138
|
-
return Ok(data.value
|
|
185
|
+
return Ok(data.value)
|
|
139
186
|
}
|
|
140
187
|
|
|
141
188
|
return Err(data.error ?? { type: 'unknown_error', message: 'Unknown error' })
|
|
@@ -151,7 +198,7 @@ export class RpcClient {
|
|
|
151
198
|
|
|
152
199
|
const response = await fetch(this.getRpcUrl(), {
|
|
153
200
|
method: 'POST',
|
|
154
|
-
headers: { 'Content-Type': 'application/json' },
|
|
201
|
+
headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
|
|
155
202
|
body: JSON.stringify({
|
|
156
203
|
batch: entries.map(e => ({ method: e.method, input: e.input })),
|
|
157
204
|
}),
|