@sigma-auth/better-auth-plugin 0.0.49 → 0.0.50
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/client/sync.d.ts +34 -0
- package/dist/client/sync.d.ts.map +1 -0
- package/dist/client/sync.js +115 -0
- package/dist/client/sync.js.map +1 -0
- package/package.json +10 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Client for local signers → Sigma-Auth backup synchronization
|
|
3
|
+
*
|
|
4
|
+
* Uses bitcoin-auth tokens signed by BAP member key for authentication.
|
|
5
|
+
* Pushes/pulls encrypted BapMasterBackup format to cloud storage.
|
|
6
|
+
*/
|
|
7
|
+
import type { BAP } from "bsv-bap";
|
|
8
|
+
export interface SyncConfig {
|
|
9
|
+
/** Sigma-auth server URL (e.g., "https://sigmaidentity.com") */
|
|
10
|
+
serverUrl: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SyncResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
error?: string;
|
|
15
|
+
encryptedBackup?: string;
|
|
16
|
+
lastUpdated?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Push encrypted backup to sigma-auth cloud storage
|
|
20
|
+
*/
|
|
21
|
+
export declare function pushBackup(bap: BAP, bapId: string, encryptedBackup: string, config: SyncConfig): Promise<SyncResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Pull encrypted backup from sigma-auth cloud storage
|
|
24
|
+
*/
|
|
25
|
+
export declare function pullBackup(bap: BAP, bapId: string, config: SyncConfig): Promise<SyncResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if cloud backup exists and get its timestamp
|
|
28
|
+
*/
|
|
29
|
+
export declare function checkBackupStatus(bap: BAP, bapId: string, config: SyncConfig): Promise<{
|
|
30
|
+
exists: boolean;
|
|
31
|
+
lastUpdated?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/client/sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAInC,MAAM,WAAW,UAAU;IAC1B,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAkCD;;GAEG;AACH,wBAAsB,UAAU,CAC/B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,UAAU,GAChB,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC/B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,GAChB,OAAO,CAAC,UAAU,CAAC,CAoCrB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBpE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Client for local signers → Sigma-Auth backup synchronization
|
|
3
|
+
*
|
|
4
|
+
* Uses bitcoin-auth tokens signed by BAP member key for authentication.
|
|
5
|
+
* Pushes/pulls encrypted BapMasterBackup format to cloud storage.
|
|
6
|
+
*/
|
|
7
|
+
import { getAuthToken } from "bitcoin-auth";
|
|
8
|
+
const SYNC_ENDPOINT = "/api/backup/sync";
|
|
9
|
+
/**
|
|
10
|
+
* Get the WIF (private key) for the primary BAP identity's member key
|
|
11
|
+
*/
|
|
12
|
+
function getMemberWif(bap, bapId) {
|
|
13
|
+
const identity = bap.getId(bapId);
|
|
14
|
+
if (!identity) {
|
|
15
|
+
throw new Error(`Identity ${bapId} not found in BAP`);
|
|
16
|
+
}
|
|
17
|
+
const memberData = identity.exportMember();
|
|
18
|
+
if (!memberData?.wif) {
|
|
19
|
+
throw new Error("Failed to export member WIF");
|
|
20
|
+
}
|
|
21
|
+
return memberData.wif;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a bitcoin-auth token for sync authentication
|
|
25
|
+
*/
|
|
26
|
+
function createSyncAuthToken(wif, requestPath, body) {
|
|
27
|
+
return getAuthToken({
|
|
28
|
+
privateKeyWif: wif,
|
|
29
|
+
requestPath,
|
|
30
|
+
body,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Push encrypted backup to sigma-auth cloud storage
|
|
35
|
+
*/
|
|
36
|
+
export async function pushBackup(bap, bapId, encryptedBackup, config) {
|
|
37
|
+
try {
|
|
38
|
+
const wif = getMemberWif(bap, bapId);
|
|
39
|
+
const body = JSON.stringify({ bapId, encryptedBackup });
|
|
40
|
+
const authToken = createSyncAuthToken(wif, SYNC_ENDPOINT, body);
|
|
41
|
+
const response = await fetch(`${config.serverUrl}${SYNC_ENDPOINT}`, {
|
|
42
|
+
method: "POST",
|
|
43
|
+
headers: {
|
|
44
|
+
"Content-Type": "application/json",
|
|
45
|
+
Authorization: `Bitcoin-Auth ${authToken}`,
|
|
46
|
+
},
|
|
47
|
+
body,
|
|
48
|
+
});
|
|
49
|
+
const data = await response.json();
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: data.message || data.error || `HTTP ${response.status}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { success: true };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Pull encrypted backup from sigma-auth cloud storage
|
|
67
|
+
*/
|
|
68
|
+
export async function pullBackup(bap, bapId, config) {
|
|
69
|
+
try {
|
|
70
|
+
const wif = getMemberWif(bap, bapId);
|
|
71
|
+
const authToken = createSyncAuthToken(wif, SYNC_ENDPOINT);
|
|
72
|
+
const response = await fetch(`${config.serverUrl}${SYNC_ENDPOINT}?bapId=${encodeURIComponent(bapId)}`, {
|
|
73
|
+
method: "GET",
|
|
74
|
+
headers: {
|
|
75
|
+
Authorization: `Bitcoin-Auth ${authToken}`,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const data = await response.json();
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
error: data.message || data.error || `HTTP ${response.status}`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
success: true,
|
|
87
|
+
encryptedBackup: data.encryptedBackup,
|
|
88
|
+
lastUpdated: data.lastUpdated,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if cloud backup exists and get its timestamp
|
|
100
|
+
*/
|
|
101
|
+
export async function checkBackupStatus(bap, bapId, config) {
|
|
102
|
+
const result = await pullBackup(bap, bapId, config);
|
|
103
|
+
if (result.success) {
|
|
104
|
+
return {
|
|
105
|
+
exists: true,
|
|
106
|
+
lastUpdated: result.lastUpdated,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// 404 means no backup exists (not an error)
|
|
110
|
+
if (result.error?.includes("404") || result.error?.includes("not_found")) {
|
|
111
|
+
return { exists: false };
|
|
112
|
+
}
|
|
113
|
+
return { exists: false, error: result.error };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/client/sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sigma-auth/better-auth-plugin",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.50",
|
|
4
4
|
"description": "Better Auth plugins for Sigma Identity - client, server, and provider integrations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/types/index.js",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
"types": "./dist/client/local-signer.d.ts",
|
|
19
19
|
"import": "./dist/client/local-signer.js"
|
|
20
20
|
},
|
|
21
|
+
"./client/sync": {
|
|
22
|
+
"types": "./dist/client/sync.d.ts",
|
|
23
|
+
"import": "./dist/client/sync.js"
|
|
24
|
+
},
|
|
21
25
|
"./server": {
|
|
22
26
|
"types": "./dist/server/index.d.ts",
|
|
23
27
|
"import": "./dist/server/index.js"
|
|
@@ -74,6 +78,7 @@
|
|
|
74
78
|
"better-auth": "^1.4.5",
|
|
75
79
|
"@bsv/sdk": "^1.9.9",
|
|
76
80
|
"@neondatabase/serverless": "^1.0.2",
|
|
81
|
+
"bsv-bap": "^0.1.16",
|
|
77
82
|
"payload-auth": "^0.6.0",
|
|
78
83
|
"zod": "^4.1.12"
|
|
79
84
|
},
|
|
@@ -84,6 +89,9 @@
|
|
|
84
89
|
"@neondatabase/serverless": {
|
|
85
90
|
"optional": true
|
|
86
91
|
},
|
|
92
|
+
"bsv-bap": {
|
|
93
|
+
"optional": true
|
|
94
|
+
},
|
|
87
95
|
"payload-auth": {
|
|
88
96
|
"optional": true
|
|
89
97
|
},
|
|
@@ -102,6 +110,7 @@
|
|
|
102
110
|
"@neondatabase/serverless": "^1.0.2",
|
|
103
111
|
"@types/node": "^24.10.7",
|
|
104
112
|
"better-auth": "^1.4.10",
|
|
113
|
+
"bsv-bap": "^0.1.16",
|
|
105
114
|
"typescript": "^5.9.3",
|
|
106
115
|
"zod": "^4.3.5"
|
|
107
116
|
}
|