@kya-os/mcp-i 0.1.0-alpha.2.9 → 0.1.0-alpha.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/dist/{crypto.js → cjs/crypto.js} +17 -2
- package/dist/esm/auto.d.ts +13 -0
- package/dist/esm/auto.d.ts.map +1 -0
- package/dist/esm/auto.js +30 -0
- package/dist/esm/auto.js.map +1 -0
- package/dist/esm/crypto.d.ts +51 -0
- package/dist/esm/crypto.d.ts.map +1 -0
- package/dist/esm/crypto.js +230 -0
- package/dist/esm/crypto.js.map +1 -0
- package/dist/esm/dev-helper.d.ts +15 -0
- package/dist/esm/dev-helper.d.ts.map +1 -0
- package/dist/esm/dev-helper.js +63 -0
- package/dist/esm/dev-helper.js.map +1 -0
- package/dist/esm/encrypted-storage.d.ts +19 -0
- package/dist/esm/encrypted-storage.d.ts.map +1 -0
- package/dist/esm/encrypted-storage.js +48 -0
- package/dist/esm/encrypted-storage.js.map +1 -0
- package/dist/esm/index.d.ts +128 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +671 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger.d.ts +46 -0
- package/dist/esm/logger.d.ts.map +1 -0
- package/dist/esm/logger.js +76 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/nextjs.d.ts +22 -0
- package/dist/esm/nextjs.d.ts.map +1 -0
- package/dist/esm/nextjs.js +82 -0
- package/dist/esm/nextjs.js.map +1 -0
- package/dist/esm/registry/index.d.ts +43 -0
- package/dist/esm/registry/index.d.ts.map +1 -0
- package/dist/esm/registry/index.js +89 -0
- package/dist/esm/registry/index.js.map +1 -0
- package/dist/esm/registry/knowthat.d.ts +30 -0
- package/dist/esm/registry/knowthat.d.ts.map +1 -0
- package/dist/esm/registry/knowthat.js +106 -0
- package/dist/esm/registry/knowthat.js.map +1 -0
- package/dist/esm/rotation.d.ts +57 -0
- package/dist/esm/rotation.d.ts.map +1 -0
- package/dist/esm/rotation.js +133 -0
- package/dist/esm/rotation.js.map +1 -0
- package/dist/esm/storage.d.ts +65 -0
- package/dist/esm/storage.d.ts.map +1 -0
- package/dist/esm/storage.js +160 -0
- package/dist/esm/storage.js.map +1 -0
- package/dist/esm/transport.d.ts +52 -0
- package/dist/esm/transport.d.ts.map +1 -0
- package/dist/esm/transport.js +209 -0
- package/dist/esm/transport.js.map +1 -0
- package/dist/esm/types.d.ts +188 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +5 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/vercel-adapter.d.ts +26 -0
- package/dist/esm/vercel-adapter.d.ts.map +1 -0
- package/dist/esm/vercel-adapter.js +80 -0
- package/dist/esm/vercel-adapter.js.map +1 -0
- package/package.json +23 -19
- /package/dist/{auto.d.ts → cjs/auto.d.ts} +0 -0
- /package/dist/{auto.js → cjs/auto.js} +0 -0
- /package/dist/{crypto.d.ts → cjs/crypto.d.ts} +0 -0
- /package/dist/{dev-helper.d.ts → cjs/dev-helper.d.ts} +0 -0
- /package/dist/{dev-helper.js → cjs/dev-helper.js} +0 -0
- /package/dist/{encrypted-storage.d.ts → cjs/encrypted-storage.d.ts} +0 -0
- /package/dist/{encrypted-storage.js → cjs/encrypted-storage.js} +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{index.js → cjs/index.js} +0 -0
- /package/dist/{logger.d.ts → cjs/logger.d.ts} +0 -0
- /package/dist/{logger.js → cjs/logger.js} +0 -0
- /package/dist/{nextjs.d.ts → cjs/nextjs.d.ts} +0 -0
- /package/dist/{nextjs.js → cjs/nextjs.js} +0 -0
- /package/dist/{registry → cjs/registry}/index.d.ts +0 -0
- /package/dist/{registry → cjs/registry}/index.js +0 -0
- /package/dist/{registry → cjs/registry}/knowthat.d.ts +0 -0
- /package/dist/{registry → cjs/registry}/knowthat.js +0 -0
- /package/dist/{rotation.d.ts → cjs/rotation.d.ts} +0 -0
- /package/dist/{rotation.js → cjs/rotation.js} +0 -0
- /package/dist/{storage.d.ts → cjs/storage.d.ts} +0 -0
- /package/dist/{storage.js → cjs/storage.js} +0 -0
- /package/dist/{transport.d.ts → cjs/transport.d.ts} +0 -0
- /package/dist/{transport.js → cjs/transport.js} +0 -0
- /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
- /package/dist/{types.js → cjs/types.js} +0 -0
- /package/dist/{vercel-adapter.d.ts → cjs/vercel-adapter.d.ts} +0 -0
- /package/dist/{vercel-adapter.js → cjs/vercel-adapter.js} +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key rotation support for MCP-I
|
|
3
|
+
*/
|
|
4
|
+
import { generateKeyPair, sign } from './crypto.js';
|
|
5
|
+
export class KeyRotationManager {
|
|
6
|
+
identity;
|
|
7
|
+
transport;
|
|
8
|
+
policy;
|
|
9
|
+
signatureCount = 0;
|
|
10
|
+
keyCreatedAt;
|
|
11
|
+
lastRotatedAt;
|
|
12
|
+
constructor(identity, transport, policy = {}) {
|
|
13
|
+
this.identity = identity;
|
|
14
|
+
this.transport = transport;
|
|
15
|
+
this.policy = policy;
|
|
16
|
+
this.keyCreatedAt = new Date(identity.registeredAt);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check key health and rotation needs
|
|
20
|
+
*/
|
|
21
|
+
checkKeyHealth() {
|
|
22
|
+
const now = new Date();
|
|
23
|
+
const age = now.getTime() - this.keyCreatedAt.getTime();
|
|
24
|
+
const maxAge = this.policy.maxAge || 90 * 24 * 60 * 60 * 1000; // 90 days default
|
|
25
|
+
const maxSignatures = this.policy.maxSignatures || 1000000; // 1M default
|
|
26
|
+
const shouldRotate = age > maxAge || this.signatureCount > maxSignatures;
|
|
27
|
+
return {
|
|
28
|
+
age,
|
|
29
|
+
signatureCount: this.signatureCount,
|
|
30
|
+
shouldRotate,
|
|
31
|
+
lastRotated: this.lastRotatedAt
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Increment signature count
|
|
36
|
+
*/
|
|
37
|
+
incrementSignatureCount() {
|
|
38
|
+
this.signatureCount++;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Rotate keys with the registry
|
|
42
|
+
*/
|
|
43
|
+
async rotateKeys(reason = 'scheduled') {
|
|
44
|
+
try {
|
|
45
|
+
// Generate new key pair
|
|
46
|
+
const newKeyPair = await generateKeyPair();
|
|
47
|
+
// Create rotation request
|
|
48
|
+
const timestamp = Date.now();
|
|
49
|
+
const message = `rotate-keys:${this.identity.did}:${timestamp}:${reason}`;
|
|
50
|
+
const signature = await sign(message, this.identity.privateKey);
|
|
51
|
+
// Prepare rotation payload
|
|
52
|
+
const rotationRequest = {
|
|
53
|
+
newPublicKey: {
|
|
54
|
+
type: 'Ed25519VerificationKey2020',
|
|
55
|
+
publicKeyBase64: newKeyPair.publicKey
|
|
56
|
+
},
|
|
57
|
+
rotationReason: reason,
|
|
58
|
+
signedStatement: signature,
|
|
59
|
+
timestamp
|
|
60
|
+
};
|
|
61
|
+
// Get the correct registry URL
|
|
62
|
+
const registryUrl = this.getRegistryUrl();
|
|
63
|
+
const agentId = this.extractAgentId();
|
|
64
|
+
// Submit rotation request
|
|
65
|
+
const response = await this.transport.post(`${registryUrl}/api/agents/${agentId}/rotate-key`, rotationRequest, {
|
|
66
|
+
headers: {
|
|
67
|
+
'Authorization': `DID-Auth ${signature}`,
|
|
68
|
+
'Content-Type': 'application/json'
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
if (response.data.success) {
|
|
72
|
+
// Update local identity with new keys
|
|
73
|
+
this.identity.publicKey = newKeyPair.publicKey;
|
|
74
|
+
this.identity.privateKey = newKeyPair.privateKey;
|
|
75
|
+
this.lastRotatedAt = new Date();
|
|
76
|
+
this.keyCreatedAt = new Date();
|
|
77
|
+
this.signatureCount = 0;
|
|
78
|
+
return {
|
|
79
|
+
success: true,
|
|
80
|
+
newKeyId: response.data.newKeyId,
|
|
81
|
+
oldKeyId: response.data.oldKeyId,
|
|
82
|
+
gracePeriodEnd: new Date(response.data.gracePeriodEnd)
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
error: response.data.error || 'Key rotation failed'
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
error: error.message || 'Key rotation error'
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Setup automatic rotation based on policy
|
|
101
|
+
*/
|
|
102
|
+
setupAutoRotation(callback) {
|
|
103
|
+
const checkInterval = 24 * 60 * 60 * 1000; // Check daily
|
|
104
|
+
return setInterval(async () => {
|
|
105
|
+
const health = this.checkKeyHealth();
|
|
106
|
+
if (health.shouldRotate) {
|
|
107
|
+
const result = await this.rotateKeys('auto-rotation');
|
|
108
|
+
if (callback) {
|
|
109
|
+
callback(result);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}, checkInterval);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get registry URL based on DID host
|
|
116
|
+
*/
|
|
117
|
+
getRegistryUrl() {
|
|
118
|
+
// Always use knowthat.ai as the registry
|
|
119
|
+
return 'https://knowthat.ai';
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Extract agent ID from DID or identity
|
|
123
|
+
*/
|
|
124
|
+
extractAgentId() {
|
|
125
|
+
if (this.identity.agentId) {
|
|
126
|
+
return this.identity.agentId;
|
|
127
|
+
}
|
|
128
|
+
// Extract from DID (e.g., did:web:knowthat.ai:agents:my-agent -> my-agent)
|
|
129
|
+
const parts = this.identity.did.split(':');
|
|
130
|
+
return parts[parts.length - 1];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=rotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotation.js","sourceRoot":"","sources":["../../src/rotation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage abstraction for MCP-I identity
|
|
3
|
+
* Supports both file-based and in-memory storage for different runtime environments
|
|
4
|
+
*/
|
|
5
|
+
import { PersistedIdentity } from './types';
|
|
6
|
+
export interface StorageProvider {
|
|
7
|
+
load(): Promise<PersistedIdentity | null>;
|
|
8
|
+
save(identity: PersistedIdentity): Promise<void>;
|
|
9
|
+
exists(): Promise<boolean>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* File-based storage for traditional Node.js environments
|
|
13
|
+
*/
|
|
14
|
+
export declare class FileStorage implements StorageProvider {
|
|
15
|
+
private filePath;
|
|
16
|
+
constructor(customPath?: string);
|
|
17
|
+
load(): Promise<PersistedIdentity | null>;
|
|
18
|
+
save(identity: PersistedIdentity): Promise<void>;
|
|
19
|
+
exists(): Promise<boolean>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* In-memory storage for Lambda/Edge runtime environments
|
|
23
|
+
*/
|
|
24
|
+
export declare class MemoryStorage implements StorageProvider {
|
|
25
|
+
private static instances;
|
|
26
|
+
private key;
|
|
27
|
+
constructor(key?: string);
|
|
28
|
+
load(): Promise<PersistedIdentity | null>;
|
|
29
|
+
save(identity: PersistedIdentity): Promise<void>;
|
|
30
|
+
exists(): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Clear all stored identities (useful for testing)
|
|
33
|
+
*/
|
|
34
|
+
static clear(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Environment variable storage loader
|
|
38
|
+
* This works with both file and memory storage as a fallback
|
|
39
|
+
*/
|
|
40
|
+
export declare class EnvironmentStorage {
|
|
41
|
+
static load(): PersistedIdentity | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Combined storage that tries multiple providers in order
|
|
45
|
+
*/
|
|
46
|
+
export declare class CombinedStorage implements StorageProvider {
|
|
47
|
+
private providers;
|
|
48
|
+
private primaryProvider;
|
|
49
|
+
constructor(providers: StorageProvider[]);
|
|
50
|
+
load(): Promise<PersistedIdentity | null>;
|
|
51
|
+
save(identity: PersistedIdentity): Promise<void>;
|
|
52
|
+
exists(): Promise<boolean>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Storage factory based on runtime detection
|
|
56
|
+
*/
|
|
57
|
+
export declare class StorageFactory {
|
|
58
|
+
static create(options?: {
|
|
59
|
+
storage?: 'file' | 'memory' | 'auto';
|
|
60
|
+
customPath?: string;
|
|
61
|
+
memoryKey?: string;
|
|
62
|
+
encryptionPassword?: string;
|
|
63
|
+
}): StorageProvider;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,OAAO,CAAC,QAAQ,CAAS;gBAEb,UAAU,CAAC,EAAE,MAAM;IAIzB,IAAI,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAYzC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAGjC;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,MAAM,CAAC,SAAS,CAAwC;IAChE,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,CAAC,EAAE,MAAM;IAKlB,IAAI,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAIzC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,IAAI,IAAI,iBAAiB,GAAG,IAAI;CAaxC;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,eAAe,CAAkB;gBAE7B,SAAS,EAAE,eAAe,EAAE;IAQlC,IAAI,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAiBzC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CASjC;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACtB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;QACrC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,GAAG,eAAe;CAiCpB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage abstraction for MCP-I identity
|
|
3
|
+
* Supports both file-based and in-memory storage for different runtime environments
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* File-based storage for traditional Node.js environments
|
|
9
|
+
*/
|
|
10
|
+
export class FileStorage {
|
|
11
|
+
filePath;
|
|
12
|
+
constructor(customPath) {
|
|
13
|
+
this.filePath = customPath || path.join(process.cwd(), '.mcp-identity.json');
|
|
14
|
+
}
|
|
15
|
+
async load() {
|
|
16
|
+
try {
|
|
17
|
+
if (fs.existsSync(this.filePath)) {
|
|
18
|
+
const content = fs.readFileSync(this.filePath, 'utf-8');
|
|
19
|
+
return JSON.parse(content);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Ignore errors
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
async save(identity) {
|
|
28
|
+
fs.writeFileSync(this.filePath, JSON.stringify(identity, null, 2));
|
|
29
|
+
}
|
|
30
|
+
async exists() {
|
|
31
|
+
return fs.existsSync(this.filePath);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* In-memory storage for Lambda/Edge runtime environments
|
|
36
|
+
*/
|
|
37
|
+
export class MemoryStorage {
|
|
38
|
+
static instances = new Map();
|
|
39
|
+
key;
|
|
40
|
+
constructor(key) {
|
|
41
|
+
// Use a unique key for this instance (e.g., based on agent name)
|
|
42
|
+
this.key = key || 'default';
|
|
43
|
+
}
|
|
44
|
+
async load() {
|
|
45
|
+
return MemoryStorage.instances.get(this.key) || null;
|
|
46
|
+
}
|
|
47
|
+
async save(identity) {
|
|
48
|
+
MemoryStorage.instances.set(this.key, identity);
|
|
49
|
+
}
|
|
50
|
+
async exists() {
|
|
51
|
+
return MemoryStorage.instances.has(this.key);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Clear all stored identities (useful for testing)
|
|
55
|
+
*/
|
|
56
|
+
static clear() {
|
|
57
|
+
MemoryStorage.instances.clear();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Environment variable storage loader
|
|
62
|
+
* This works with both file and memory storage as a fallback
|
|
63
|
+
*/
|
|
64
|
+
export class EnvironmentStorage {
|
|
65
|
+
static load() {
|
|
66
|
+
if (process.env.AGENT_DID && process.env.AGENT_PUBLIC_KEY && process.env.AGENT_PRIVATE_KEY) {
|
|
67
|
+
return {
|
|
68
|
+
did: process.env.AGENT_DID,
|
|
69
|
+
publicKey: process.env.AGENT_PUBLIC_KEY,
|
|
70
|
+
privateKey: process.env.AGENT_PRIVATE_KEY,
|
|
71
|
+
agentId: process.env.AGENT_ID || '',
|
|
72
|
+
agentSlug: process.env.AGENT_SLUG || '',
|
|
73
|
+
registeredAt: process.env.AGENT_REGISTERED_AT || new Date().toISOString()
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Combined storage that tries multiple providers in order
|
|
81
|
+
*/
|
|
82
|
+
export class CombinedStorage {
|
|
83
|
+
providers;
|
|
84
|
+
primaryProvider;
|
|
85
|
+
constructor(providers) {
|
|
86
|
+
if (providers.length === 0) {
|
|
87
|
+
throw new Error('At least one storage provider is required');
|
|
88
|
+
}
|
|
89
|
+
this.providers = providers;
|
|
90
|
+
this.primaryProvider = providers[0];
|
|
91
|
+
}
|
|
92
|
+
async load() {
|
|
93
|
+
// Try environment variables first
|
|
94
|
+
const envIdentity = EnvironmentStorage.load();
|
|
95
|
+
if (envIdentity) {
|
|
96
|
+
return envIdentity;
|
|
97
|
+
}
|
|
98
|
+
// Try each provider in order
|
|
99
|
+
for (const provider of this.providers) {
|
|
100
|
+
const identity = await provider.load();
|
|
101
|
+
if (identity) {
|
|
102
|
+
return identity;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
async save(identity) {
|
|
108
|
+
// Save to primary provider only
|
|
109
|
+
await this.primaryProvider.save(identity);
|
|
110
|
+
}
|
|
111
|
+
async exists() {
|
|
112
|
+
// Check if identity exists in any provider
|
|
113
|
+
for (const provider of this.providers) {
|
|
114
|
+
if (await provider.exists()) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Storage factory based on runtime detection
|
|
123
|
+
*/
|
|
124
|
+
export class StorageFactory {
|
|
125
|
+
static create(options) {
|
|
126
|
+
const storageType = options?.storage || 'auto';
|
|
127
|
+
let baseStorage;
|
|
128
|
+
if (storageType === 'memory') {
|
|
129
|
+
baseStorage = new MemoryStorage(options?.memoryKey);
|
|
130
|
+
}
|
|
131
|
+
else if (storageType === 'file') {
|
|
132
|
+
baseStorage = new FileStorage(options?.customPath);
|
|
133
|
+
}
|
|
134
|
+
else if (storageType === 'auto') {
|
|
135
|
+
// Auto-detect based on runtime
|
|
136
|
+
// Check if we're in a Lambda/Edge environment
|
|
137
|
+
if (process.env.AWS_LAMBDA_FUNCTION_NAME ||
|
|
138
|
+
process.env.VERCEL ||
|
|
139
|
+
process.env.NETLIFY ||
|
|
140
|
+
!fs.existsSync ||
|
|
141
|
+
typeof fs.writeFileSync !== 'function') {
|
|
142
|
+
baseStorage = new MemoryStorage(options?.memoryKey);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Default to file storage for Node.js
|
|
146
|
+
baseStorage = new FileStorage(options?.customPath);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
throw new Error(`Unknown storage type: ${storageType}`);
|
|
151
|
+
}
|
|
152
|
+
// Wrap with encryption if password provided
|
|
153
|
+
if (options?.encryptionPassword) {
|
|
154
|
+
const { createEncryptedStorage } = require('./encrypted-storage');
|
|
155
|
+
return createEncryptedStorage(baseStorage, options.encryptionPassword);
|
|
156
|
+
}
|
|
157
|
+
return baseStorage;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport abstraction for HTTP requests
|
|
3
|
+
* Supports both axios and native fetch with runtime detection
|
|
4
|
+
*/
|
|
5
|
+
export interface TransportOptions {
|
|
6
|
+
timeout?: number;
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface TransportResponse<T = any> {
|
|
10
|
+
data: T;
|
|
11
|
+
status: number;
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export interface Transport {
|
|
15
|
+
post<T = any>(url: string, data: any, options?: TransportOptions): Promise<TransportResponse<T>>;
|
|
16
|
+
get<T = any>(url: string, options?: TransportOptions): Promise<TransportResponse<T>>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Native fetch-based transport (preferred for Edge runtimes)
|
|
20
|
+
*/
|
|
21
|
+
export declare class FetchTransport implements Transport {
|
|
22
|
+
post<T = any>(url: string, data: any, options?: TransportOptions): Promise<TransportResponse<T>>;
|
|
23
|
+
get<T = any>(url: string, options?: TransportOptions): Promise<TransportResponse<T>>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Axios-based transport (for Node.js environments)
|
|
27
|
+
*/
|
|
28
|
+
export declare class AxiosTransport implements Transport {
|
|
29
|
+
private axiosInstance;
|
|
30
|
+
post<T = any>(url: string, data: any, options?: TransportOptions): Promise<TransportResponse<T>>;
|
|
31
|
+
get<T = any>(url: string, options?: TransportOptions): Promise<TransportResponse<T>>;
|
|
32
|
+
private getAxios;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Runtime detection for optimal transport selection
|
|
36
|
+
*/
|
|
37
|
+
export declare class RuntimeDetector {
|
|
38
|
+
static isEdgeRuntime(): boolean;
|
|
39
|
+
static isNodeRuntime(): boolean;
|
|
40
|
+
static isNextJs(): boolean;
|
|
41
|
+
static hasFetch(): boolean;
|
|
42
|
+
static isLambda(): boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Transport factory with runtime detection
|
|
46
|
+
*/
|
|
47
|
+
export declare class TransportFactory {
|
|
48
|
+
static create(options?: {
|
|
49
|
+
transport?: 'axios' | 'fetch' | 'auto';
|
|
50
|
+
}): Transport;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,GAAG;IACxC,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;CACtF;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,SAAS;IACxC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAwChG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAmC3F;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,aAAa,CAAM;IAErB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IA0BhG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAuB5E,QAAQ;CAgBvB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,MAAM,CAAC,aAAa,IAAI,OAAO;IAU/B,MAAM,CAAC,aAAa,IAAI,OAAO;IAQ/B,MAAM,CAAC,QAAQ,IAAI,OAAO;IAQ1B,MAAM,CAAC,QAAQ,IAAI,OAAO;IAI1B,MAAM,CAAC,QAAQ,IAAI,OAAO;CAO3B;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACtB,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;KACxC,GAAG,SAAS;CA+Cd"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport abstraction for HTTP requests
|
|
3
|
+
* Supports both axios and native fetch with runtime detection
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Native fetch-based transport (preferred for Edge runtimes)
|
|
7
|
+
*/
|
|
8
|
+
export class FetchTransport {
|
|
9
|
+
async post(url, data, options) {
|
|
10
|
+
const controller = new AbortController();
|
|
11
|
+
const timeout = options?.timeout || 30000;
|
|
12
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
headers: {
|
|
17
|
+
'Content-Type': 'application/json',
|
|
18
|
+
...options?.headers
|
|
19
|
+
},
|
|
20
|
+
body: JSON.stringify(data),
|
|
21
|
+
signal: controller.signal
|
|
22
|
+
});
|
|
23
|
+
clearTimeout(timeoutId);
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const error = await response.text();
|
|
26
|
+
throw new Error(`HTTP ${response.status}: ${error}`);
|
|
27
|
+
}
|
|
28
|
+
const responseData = await response.json();
|
|
29
|
+
return {
|
|
30
|
+
data: responseData,
|
|
31
|
+
status: response.status,
|
|
32
|
+
headers: Object.fromEntries(response.headers.entries())
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
clearTimeout(timeoutId);
|
|
37
|
+
if (error.name === 'AbortError') {
|
|
38
|
+
throw new Error('Request timeout');
|
|
39
|
+
}
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async get(url, options) {
|
|
44
|
+
const controller = new AbortController();
|
|
45
|
+
const timeout = options?.timeout || 30000;
|
|
46
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
47
|
+
try {
|
|
48
|
+
const response = await fetch(url, {
|
|
49
|
+
method: 'GET',
|
|
50
|
+
headers: options?.headers,
|
|
51
|
+
signal: controller.signal
|
|
52
|
+
});
|
|
53
|
+
clearTimeout(timeoutId);
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
const error = await response.text();
|
|
56
|
+
throw new Error(`HTTP ${response.status}: ${error}`);
|
|
57
|
+
}
|
|
58
|
+
const responseData = await response.json();
|
|
59
|
+
return {
|
|
60
|
+
data: responseData,
|
|
61
|
+
status: response.status,
|
|
62
|
+
headers: Object.fromEntries(response.headers.entries())
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
clearTimeout(timeoutId);
|
|
67
|
+
if (error.name === 'AbortError') {
|
|
68
|
+
throw new Error('Request timeout');
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Axios-based transport (for Node.js environments)
|
|
76
|
+
*/
|
|
77
|
+
export class AxiosTransport {
|
|
78
|
+
axiosInstance;
|
|
79
|
+
async post(url, data, options) {
|
|
80
|
+
const axios = await this.getAxios();
|
|
81
|
+
try {
|
|
82
|
+
const response = await axios.post(url, data, {
|
|
83
|
+
timeout: options?.timeout || 30000,
|
|
84
|
+
headers: options?.headers
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
data: response.data,
|
|
88
|
+
status: response.status,
|
|
89
|
+
headers: response.headers
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (error.response?.status === 429) {
|
|
94
|
+
throw new Error('Rate limit exceeded. Please try again later.');
|
|
95
|
+
}
|
|
96
|
+
throw new Error(error.response?.data?.message ||
|
|
97
|
+
error.message ||
|
|
98
|
+
'Request failed');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async get(url, options) {
|
|
102
|
+
const axios = await this.getAxios();
|
|
103
|
+
try {
|
|
104
|
+
const response = await axios.get(url, {
|
|
105
|
+
timeout: options?.timeout || 30000,
|
|
106
|
+
headers: options?.headers
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
data: response.data,
|
|
110
|
+
status: response.status,
|
|
111
|
+
headers: response.headers
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw new Error(error.response?.data?.message ||
|
|
116
|
+
error.message ||
|
|
117
|
+
'Request failed');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async getAxios() {
|
|
121
|
+
if (!this.axiosInstance) {
|
|
122
|
+
try {
|
|
123
|
+
// Try to require axios - if it fails, we'll throw a helpful error
|
|
124
|
+
// @ts-ignore - dynamic require for optional dependency
|
|
125
|
+
const axios = require('axios');
|
|
126
|
+
this.axiosInstance = axios.default || axios;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw new Error('axios is not installed. Please install it with: npm install axios\n' +
|
|
130
|
+
'Or use the fetch transport instead by setting transport: "fetch" in options');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return this.axiosInstance;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Runtime detection for optimal transport selection
|
|
138
|
+
*/
|
|
139
|
+
export class RuntimeDetector {
|
|
140
|
+
static isEdgeRuntime() {
|
|
141
|
+
return !!(globalThis.EdgeRuntime ||
|
|
142
|
+
process.env.NEXT_RUNTIME === 'edge' ||
|
|
143
|
+
process.env.VERCEL_EDGE ||
|
|
144
|
+
globalThis.Deno ||
|
|
145
|
+
globalThis.Bun);
|
|
146
|
+
}
|
|
147
|
+
static isNodeRuntime() {
|
|
148
|
+
return !!(process.versions?.node &&
|
|
149
|
+
!this.isEdgeRuntime() &&
|
|
150
|
+
!this.isNextJs());
|
|
151
|
+
}
|
|
152
|
+
static isNextJs() {
|
|
153
|
+
return !!(process.env.NEXT_RUNTIME ||
|
|
154
|
+
globalThis.__NEXT_DATA__ ||
|
|
155
|
+
process.env.NEXT_PUBLIC_VERCEL_ENV);
|
|
156
|
+
}
|
|
157
|
+
static hasFetch() {
|
|
158
|
+
return typeof globalThis.fetch === 'function';
|
|
159
|
+
}
|
|
160
|
+
static isLambda() {
|
|
161
|
+
return !!(process.env.AWS_LAMBDA_FUNCTION_NAME ||
|
|
162
|
+
process.env.LAMBDA_TASK_ROOT ||
|
|
163
|
+
process.env._HANDLER);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Transport factory with runtime detection
|
|
168
|
+
*/
|
|
169
|
+
export class TransportFactory {
|
|
170
|
+
static create(options) {
|
|
171
|
+
const transportType = options?.transport || 'auto';
|
|
172
|
+
if (transportType === 'fetch') {
|
|
173
|
+
if (!RuntimeDetector.hasFetch()) {
|
|
174
|
+
throw new Error('Fetch is not available in this runtime');
|
|
175
|
+
}
|
|
176
|
+
return new FetchTransport();
|
|
177
|
+
}
|
|
178
|
+
if (transportType === 'axios') {
|
|
179
|
+
return new AxiosTransport();
|
|
180
|
+
}
|
|
181
|
+
// Auto-detect based on runtime
|
|
182
|
+
if (transportType === 'auto') {
|
|
183
|
+
// Prefer fetch for edge runtimes
|
|
184
|
+
if (RuntimeDetector.isEdgeRuntime() && RuntimeDetector.hasFetch()) {
|
|
185
|
+
return new FetchTransport();
|
|
186
|
+
}
|
|
187
|
+
// Use fetch for Next.js to avoid bundling issues
|
|
188
|
+
if (RuntimeDetector.isNextJs() && RuntimeDetector.hasFetch()) {
|
|
189
|
+
return new FetchTransport();
|
|
190
|
+
}
|
|
191
|
+
// Use fetch if available and we're in a Lambda (lighter weight)
|
|
192
|
+
if (RuntimeDetector.isLambda() && RuntimeDetector.hasFetch()) {
|
|
193
|
+
return new FetchTransport();
|
|
194
|
+
}
|
|
195
|
+
// Default to axios for Node.js
|
|
196
|
+
if (RuntimeDetector.isNodeRuntime()) {
|
|
197
|
+
return new AxiosTransport();
|
|
198
|
+
}
|
|
199
|
+
// Fallback to fetch if available
|
|
200
|
+
if (RuntimeDetector.hasFetch()) {
|
|
201
|
+
return new FetchTransport();
|
|
202
|
+
}
|
|
203
|
+
// Last resort: axios
|
|
204
|
+
return new AxiosTransport();
|
|
205
|
+
}
|
|
206
|
+
throw new Error(`Unknown transport type: ${transportType}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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"}
|