@propxchain/core-client 0.1.0-canary.3

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.
Files changed (85) hide show
  1. package/README.md +115 -0
  2. package/dist/canisters/document_storage/document_storage.did.d.ts +7 -0
  3. package/dist/canisters/document_storage/document_storage.did.d.ts.map +1 -0
  4. package/dist/canisters/document_storage/document_storage.did.js +82 -0
  5. package/dist/canisters/document_storage/document_storage.did.js.map +1 -0
  6. package/dist/canisters/document_storage/index.d.ts +4 -0
  7. package/dist/canisters/document_storage/index.d.ts.map +1 -0
  8. package/dist/canisters/document_storage/index.js +2 -0
  9. package/dist/canisters/document_storage/index.js.map +1 -0
  10. package/dist/canisters/ledger_manager/index.d.ts +4 -0
  11. package/dist/canisters/ledger_manager/index.d.ts.map +1 -0
  12. package/dist/canisters/ledger_manager/index.js +2 -0
  13. package/dist/canisters/ledger_manager/index.js.map +1 -0
  14. package/dist/canisters/ledger_manager/ledger_manager.did.d.ts +7 -0
  15. package/dist/canisters/ledger_manager/ledger_manager.did.d.ts.map +1 -0
  16. package/dist/canisters/ledger_manager/ledger_manager.did.js +138 -0
  17. package/dist/canisters/ledger_manager/ledger_manager.did.js.map +1 -0
  18. package/dist/canisters/transaction_manager/index.d.ts +4 -0
  19. package/dist/canisters/transaction_manager/index.d.ts.map +1 -0
  20. package/dist/canisters/transaction_manager/index.js +2 -0
  21. package/dist/canisters/transaction_manager/index.js.map +1 -0
  22. package/dist/canisters/transaction_manager/transaction_manager.did.d.ts +7 -0
  23. package/dist/canisters/transaction_manager/transaction_manager.did.d.ts.map +1 -0
  24. package/dist/canisters/transaction_manager/transaction_manager.did.js +515 -0
  25. package/dist/canisters/transaction_manager/transaction_manager.did.js.map +1 -0
  26. package/dist/canisters/user_management/index.d.ts +4 -0
  27. package/dist/canisters/user_management/index.d.ts.map +1 -0
  28. package/dist/canisters/user_management/index.js +2 -0
  29. package/dist/canisters/user_management/index.js.map +1 -0
  30. package/dist/canisters/user_management/user_management.did.d.ts +7 -0
  31. package/dist/canisters/user_management/user_management.did.d.ts.map +1 -0
  32. package/dist/canisters/user_management/user_management.did.js +137 -0
  33. package/dist/canisters/user_management/user_management.did.js.map +1 -0
  34. package/dist/client.d.ts +13 -0
  35. package/dist/client.d.ts.map +1 -0
  36. package/dist/client.js +41 -0
  37. package/dist/client.js.map +1 -0
  38. package/dist/errors.d.ts +8 -0
  39. package/dist/errors.d.ts.map +1 -0
  40. package/dist/errors.js +22 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/index.d.ts +7 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +7 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/mock.d.ts +22 -0
  47. package/dist/mock.d.ts.map +1 -0
  48. package/dist/mock.js +94 -0
  49. package/dist/mock.js.map +1 -0
  50. package/dist/retry.d.ts +11 -0
  51. package/dist/retry.d.ts.map +1 -0
  52. package/dist/retry.js +22 -0
  53. package/dist/retry.js.map +1 -0
  54. package/dist/stubs.d.ts +34 -0
  55. package/dist/stubs.d.ts.map +1 -0
  56. package/dist/stubs.js +17 -0
  57. package/dist/stubs.js.map +1 -0
  58. package/dist/types.d.ts +30 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +7 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +58 -0
  63. package/src/canisters/document_storage/document_storage.did +89 -0
  64. package/src/canisters/document_storage/document_storage.did.d.ts +82 -0
  65. package/src/canisters/document_storage/document_storage.did.js +121 -0
  66. package/src/canisters/document_storage/index.ts +5 -0
  67. package/src/canisters/ledger_manager/index.ts +5 -0
  68. package/src/canisters/ledger_manager/ledger_manager.did +154 -0
  69. package/src/canisters/ledger_manager/ledger_manager.did.d.ts +139 -0
  70. package/src/canisters/ledger_manager/ledger_manager.did.js +181 -0
  71. package/src/canisters/transaction_manager/index.ts +5 -0
  72. package/src/canisters/transaction_manager/transaction_manager.did +599 -0
  73. package/src/canisters/transaction_manager/transaction_manager.did.d.ts +517 -0
  74. package/src/canisters/transaction_manager/transaction_manager.did.js +638 -0
  75. package/src/canisters/user_management/index.ts +5 -0
  76. package/src/canisters/user_management/user_management.did +147 -0
  77. package/src/canisters/user_management/user_management.did.d.ts +148 -0
  78. package/src/canisters/user_management/user_management.did.js +192 -0
  79. package/src/client.ts +77 -0
  80. package/src/errors.ts +31 -0
  81. package/src/index.ts +30 -0
  82. package/src/mock.ts +120 -0
  83. package/src/retry.ts +44 -0
  84. package/src/stubs.ts +60 -0
  85. package/src/types.ts +44 -0
package/src/mock.ts ADDED
@@ -0,0 +1,120 @@
1
+ import { Principal } from "@dfinity/principal";
2
+ import type {
3
+ IPropXchainClient,
4
+ TransactionManagerService,
5
+ DocumentStorageService,
6
+ UserManagementService,
7
+ LedgerManagerService,
8
+ } from "./types.js";
9
+ import {
10
+ createAuditTrailStub,
11
+ createAgentHarnessStub,
12
+ type AuditTrailStub,
13
+ type AgentHarnessStub,
14
+ } from "./stubs.js";
15
+
16
+ export const MOCK_ENV_FLAG = "NEXT_PUBLIC_USE_MOCK";
17
+
18
+ const MOCK_PRINCIPAL = Principal.fromText("2vxsx-fae");
19
+ const NOW = 1_735_689_600_000_000_000n; // 2026-01-01 as ns bigint for determinism
20
+
21
+ type AnyFn = (...args: unknown[]) => unknown;
22
+
23
+ /**
24
+ * Build a Proxy that returns a deterministic mock for any method call.
25
+ * Specific methods listed in `overrides` take precedence. Anything else
26
+ * returns a harmless default matching typical Candid shapes.
27
+ */
28
+ function mockService<T extends object>(
29
+ overrides: Partial<Record<keyof T, AnyFn>>,
30
+ ): T {
31
+ return new Proxy({} as T, {
32
+ get(_target, prop: string | symbol) {
33
+ const override = (overrides as Record<string | symbol, AnyFn>)[prop];
34
+ if (typeof override === "function") return override;
35
+ return async () => ({ ok: null });
36
+ },
37
+ });
38
+ }
39
+
40
+ export function createMockTransactionManager(): TransactionManagerService {
41
+ return mockService<TransactionManagerService>({
42
+ getMyTransactions: async () => [],
43
+ getAllTransactions: async () => [],
44
+ getCycles: async () => 1_000_000_000_000n,
45
+ getTransaction: async (id: unknown) =>
46
+ typeof id === "string" && id === "mock-tx-001"
47
+ ? [{
48
+ id: "mock-tx-001",
49
+ propertyAddress: "1 Mock Street, Sandy, SG19 0AA",
50
+ buyer: MOCK_PRINCIPAL,
51
+ seller: MOCK_PRINCIPAL,
52
+ price: 350_000n,
53
+ status: { pending: null },
54
+ createdAt: NOW,
55
+ }] as never
56
+ : [],
57
+ doesTransactionExist: async (id: unknown) =>
58
+ id === "mock-tx-001",
59
+ getUnreadNotificationCount: async () => 0n,
60
+ getMyNotifications: async () => [],
61
+ });
62
+ }
63
+
64
+ export function createMockDocumentStorage(): DocumentStorageService {
65
+ return mockService<DocumentStorageService>({
66
+ getCycles: async () => 500_000_000_000n,
67
+ getStorageStats: async () => ({
68
+ averageFileSizeBytes: 0n,
69
+ totalSizeBytes: 0n,
70
+ verifiedDocuments: 0n,
71
+ totalDocuments: 0n,
72
+ }),
73
+ getTransactionDocuments: async () => [],
74
+ getAuditLogs: async () => [],
75
+ });
76
+ }
77
+
78
+ export function createMockUserManagement(): UserManagementService {
79
+ return mockService<UserManagementService>({
80
+ getCycles: async () => 400_000_000_000n,
81
+ });
82
+ }
83
+
84
+ export function createMockLedgerManager(): LedgerManagerService {
85
+ return mockService<LedgerManagerService>({
86
+ getCycles: async () => 600_000_000_000n,
87
+ });
88
+ }
89
+
90
+ export class MockPropXchainClient implements IPropXchainClient {
91
+ readonly transactionManager: TransactionManagerService;
92
+ readonly documentStorage: DocumentStorageService;
93
+ readonly userManagement: UserManagementService;
94
+ readonly ledgerManager: LedgerManagerService;
95
+ readonly auditTrail: AuditTrailStub;
96
+ readonly agentHarness: AgentHarnessStub;
97
+
98
+ constructor() {
99
+ this.transactionManager = createMockTransactionManager();
100
+ this.documentStorage = createMockDocumentStorage();
101
+ this.userManagement = createMockUserManagement();
102
+ this.ledgerManager = createMockLedgerManager();
103
+ this.auditTrail = createAuditTrailStub();
104
+ this.agentHarness = createAgentHarnessStub();
105
+ }
106
+ }
107
+
108
+ /**
109
+ * True when NEXT_PUBLIC_USE_MOCK is set to "true" (case-insensitive).
110
+ * Consumers decide at construction time which client to use.
111
+ */
112
+ export function isMockEnabled(env: Record<string, string | undefined> = readEnv()): boolean {
113
+ const raw = env[MOCK_ENV_FLAG];
114
+ return typeof raw === "string" && raw.toLowerCase() === "true";
115
+ }
116
+
117
+ function readEnv(): Record<string, string | undefined> {
118
+ if (typeof process !== "undefined" && process.env) return process.env;
119
+ return {};
120
+ }
package/src/retry.ts ADDED
@@ -0,0 +1,44 @@
1
+ import { CoreClientError, wrapAgentError } from "./errors.js";
2
+
3
+ export interface RetryOptions {
4
+ retries?: number;
5
+ initialDelayMs?: number;
6
+ maxDelayMs?: number;
7
+ factor?: number;
8
+ shouldRetry?: (err: CoreClientError, attempt: number) => boolean;
9
+ sleep?: (ms: number) => Promise<void>;
10
+ }
11
+
12
+ const defaultShouldRetry = (err: CoreClientError) =>
13
+ err.code === "NETWORK" || err.code === "TIMEOUT";
14
+
15
+ const defaultSleep = (ms: number) =>
16
+ new Promise<void>((resolve) => setTimeout(resolve, ms));
17
+
18
+ export async function withRetry<T>(
19
+ fn: () => Promise<T>,
20
+ options: RetryOptions = {},
21
+ ): Promise<T> {
22
+ const {
23
+ retries = 3,
24
+ initialDelayMs = 200,
25
+ maxDelayMs = 2000,
26
+ factor = 2,
27
+ shouldRetry = defaultShouldRetry,
28
+ sleep = defaultSleep,
29
+ } = options;
30
+
31
+ let attempt = 0;
32
+ let delay = initialDelayMs;
33
+ while (true) {
34
+ try {
35
+ return await fn();
36
+ } catch (raw) {
37
+ const err = wrapAgentError(raw);
38
+ if (attempt >= retries || !shouldRetry(err, attempt)) throw err;
39
+ await sleep(delay);
40
+ delay = Math.min(delay * factor, maxDelayMs);
41
+ attempt += 1;
42
+ }
43
+ }
44
+ }
package/src/stubs.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { CoreClientError } from "./errors.js";
2
+
3
+ /**
4
+ * Audit trail canister is not yet deployed. This stub exists so consumers can
5
+ * depend on a stable surface area now; real methods land when the canister ships.
6
+ */
7
+ export interface AuditTrailStub {
8
+ readonly __stub: true;
9
+ append(event: AuditEvent): Promise<never>;
10
+ query(filter: AuditFilter): Promise<never>;
11
+ }
12
+
13
+ export interface AuditEvent {
14
+ transactionId: string;
15
+ actor: string;
16
+ action: string;
17
+ timestamp: bigint;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+
21
+ export interface AuditFilter {
22
+ transactionId?: string;
23
+ actor?: string;
24
+ since?: bigint;
25
+ until?: bigint;
26
+ }
27
+
28
+ /**
29
+ * Agent harness is a sandboxed interface for AI agents. Stubbed per A2 scope;
30
+ * the real harness lands in Phase 5+.
31
+ */
32
+ export interface AgentHarnessStub {
33
+ readonly __stub: true;
34
+ listCapabilities(): Promise<never>;
35
+ invoke(capability: string, payload: unknown): Promise<never>;
36
+ }
37
+
38
+ const notImplemented = (name: string): Promise<never> =>
39
+ Promise.reject(
40
+ new CoreClientError(
41
+ "UNKNOWN",
42
+ `${name} is stubbed in @propxchain/core-client v0.1.0 — canister not yet deployed`,
43
+ ),
44
+ );
45
+
46
+ export function createAuditTrailStub(): AuditTrailStub {
47
+ return {
48
+ __stub: true,
49
+ append: () => notImplemented("AuditTrail.append"),
50
+ query: () => notImplemented("AuditTrail.query"),
51
+ };
52
+ }
53
+
54
+ export function createAgentHarnessStub(): AgentHarnessStub {
55
+ return {
56
+ __stub: true,
57
+ listCapabilities: () => notImplemented("AgentHarness.listCapabilities"),
58
+ invoke: () => notImplemented("AgentHarness.invoke"),
59
+ };
60
+ }
package/src/types.ts ADDED
@@ -0,0 +1,44 @@
1
+ import type { HttpAgent, Identity } from "@dfinity/agent";
2
+ import type { TransactionManagerService } from "./canisters/transaction_manager/index.js";
3
+ import type { DocumentStorageService } from "./canisters/document_storage/index.js";
4
+ import type { UserManagementService } from "./canisters/user_management/index.js";
5
+ import type { LedgerManagerService } from "./canisters/ledger_manager/index.js";
6
+ import type { AuditTrailStub, AgentHarnessStub } from "./stubs.js";
7
+
8
+ export interface CanisterIds {
9
+ transactionManager: string;
10
+ documentStorage: string;
11
+ userManagement: string;
12
+ ledgerManager: string;
13
+ }
14
+
15
+ export const MAINNET_CANISTER_IDS: CanisterIds = {
16
+ transactionManager: "llj73-cqaaa-aaaaa-qcwwa-cai",
17
+ documentStorage: "646az-pqaaa-aaaaa-qczja-cai",
18
+ userManagement: "lmizp-piaaa-aaaaa-qcwwq-cai",
19
+ ledgerManager: "hty74-maaaa-aaaaa-qcxza-cai",
20
+ };
21
+
22
+ export interface PropXchainClientOptions {
23
+ canisterIds?: Partial<CanisterIds>;
24
+ host?: string;
25
+ agent?: HttpAgent;
26
+ identity?: Identity;
27
+ fetchRootKey?: boolean;
28
+ }
29
+
30
+ export interface IPropXchainClient {
31
+ readonly transactionManager: TransactionManagerService;
32
+ readonly documentStorage: DocumentStorageService;
33
+ readonly userManagement: UserManagementService;
34
+ readonly ledgerManager: LedgerManagerService;
35
+ readonly auditTrail: AuditTrailStub;
36
+ readonly agentHarness: AgentHarnessStub;
37
+ }
38
+
39
+ export type {
40
+ TransactionManagerService,
41
+ DocumentStorageService,
42
+ UserManagementService,
43
+ LedgerManagerService,
44
+ };