Comparison of TypeScript client API with the reference Java client implementation.
| Method | Java | TypeScript | Status |
|---|---|---|---|
transact() |
✅ | ✅ | ✅ Consistent |
query() |
✅ | ✅ | ✅ Consistent |
query(query, address) |
✅ | ✅ | ✅ Consistent |
getAddress() |
✅ | ✅ (via accountInfo.address) |
✅ Consistent |
getKeyPair() |
✅ | ✅ | ✅ Consistent |
Java:
// Anonymous connection (queries only)
Convex.connect(hostAddress)
// With account
Convex.connect(hostAddress, address, keyPair)TypeScript:
// Connection (queries only)
new Convex('https://peer.convex.live')
// With account
convex.useAccount('#1678', keyPair)✅ Status: Consistent pattern, different implementation style (Java: static factory, TS: instance method)
Java:
convex.transfer(targetAddress, amount)Current TypeScript workaround:
convex.transact({ to: '#456', amount: 1_000_000 })Recommendation: Add transfer() method for consistency:
async transfer(to: string, amount: number): Promise<TransactionResult> {
return this.transact({ to, amount });
}Java:
convex.setTimeout(30000)TypeScript: Timeout is set in constructor only
Recommendation: Add setter:
setTimeout(timeout: number): void {
this.http.defaults.timeout = timeout;
}Java:
long seq = convex.getSequence()TypeScript: Sequence accessed via accountInfo.sequence
Recommendation: Add convenience method:
async getSequence(): Promise<number> {
const info = await this.getAccountInfo();
return info.sequence;
}Java:
convex.setAddress(address)
convex.setAddress(address, keyPair)TypeScript: Only useAccount(address, keyPair)
Recommendation: Keep useAccount() as primary API (more explicit), optionally add setAddress() as alias
Java:
- Uses
Addressobjects - Created with
Address.create(1678)
TypeScript:
- Uses strings:
"#1678" - More user-friendly
✅ Status: Acceptable difference - JavaScript/TypeScript convention
Java:
Result r = convex.transactSync(code); // Blocking
Future<Result> f = convex.transact(code); // AsyncTypeScript:
const result = await convex.transact(code); // Promise-based (async)✅ Status: Consistent with platform conventions (Java: Future, TS: Promise)
Java:
// Multiple overloads
CompletableFuture<Result> transact(ATransaction transaction)
CompletableFuture<Result> transact(String code)
CompletableFuture<Result> transact(ACell code)
Result transactSync(String code)TypeScript:
async transact(tx: Transaction): Promise<TransactionResult>Recommendation: Add code execution overload:
async transact(tx: Transaction | string): Promise<TransactionResult> {
if (typeof tx === 'string') {
return this.transact({ data: { code: tx } });
}
// existing implementation
}Java:
CompletableFuture<Result> query(String query)
CompletableFuture<Result> query(ACell query, Address address)
Result querySync(String query)TypeScript:
async query(query: Query): Promise<Result>
interface Query {
address?: string;
source?: any;
}✅ Status: Consistent, TypeScript uses object parameter (more flexible)
- ✅ Add
transfer()method - Common operation, should be easy - ✅ Add
transact(code: string)overload - Execute code strings directly ⚠️ AddgetSequence()method - Useful for transaction management
⚠️ AddsetTimeout()method - Runtime timeout adjustment⚠️ ConsidersetAddress()alias - For Java developers
⚠️ Document equivalent patterns - Help Java developers migrate
Convex convex = Convex.connect("peer.convex.live", address, keyPair);
Result r = convex.transferSync(target, 1_000_000);const convex = new Convex('https://peer.convex.live');
convex.useAccount('#1678', keyPair);
const result = await convex.transact({ to: '#456', amount: 1_000_000 });const convex = new Convex('https://peer.convex.live');
convex.useAccount('#1678', keyPair);
const result = await convex.transfer('#456', 1_000_000);The TypeScript API is largely consistent with the Java API, with minor differences due to:
- JavaScript/TypeScript conventions (Promises vs Futures)
- Platform idioms (strings vs objects)
Key improvements needed:
- Add
transfer()method - Support
transact(code)with string - Add
getSequence()helper
These changes would make the TypeScript API nearly identical to the Java API in functionality.