FRE-600: Fix code review blockers

- Consolidated duplicate UndoManagers to single instance
- Fixed connection promise to only resolve on 'connected' status
- Fixed WebSocketProvider import (WebsocketProvider)
- Added proper doc.destroy() cleanup
- Renamed isPresenceInitialized property to avoid conflict

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-25 00:08:01 -04:00
parent 65b552bb08
commit 7c684a42cc
48450 changed files with 5679671 additions and 383 deletions

View File

@@ -0,0 +1,26 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCommitment = getCommitment;
/**
* TODO: docs
*/
function getCommitment(commitment) {
switch (commitment) {
case 'processed':
case 'confirmed':
case 'finalized':
case undefined:
return commitment;
case 'recent':
return 'processed';
case 'single':
case 'singleGossip':
return 'confirmed';
case 'max':
case 'root':
return 'finalized';
default:
return undefined;
}
}
//# sourceMappingURL=commitment.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"commitment.js","sourceRoot":"","sources":["../../src/commitment.ts"],"names":[],"mappings":";;AAQA,sCAkBC;AArBD;;GAEG;AACH,SAAgB,aAAa,CAAC,UAAuB;IACjD,QAAQ,UAAU,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS;YACV,OAAO,UAAU,CAAC;QACtB,KAAK,QAAQ;YACT,OAAO,WAAW,CAAC;QACvB,KAAK,QAAQ,CAAC;QACd,KAAK,cAAc;YACf,OAAO,WAAW,CAAC;QACvB,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACP,OAAO,WAAW,CAAC;QACvB;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC"}

View File

@@ -0,0 +1,45 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LOCALNET_ENDPOINT = exports.TESTNET_ENDPOINT = exports.DEVNET_ENDPOINT = exports.MAINNET_ENDPOINT = void 0;
exports.getChainForEndpoint = getChainForEndpoint;
exports.getEndpointForChain = getEndpointForChain;
const wallet_standard_chains_1 = require("@solana/wallet-standard-chains");
/** TODO: docs */
exports.MAINNET_ENDPOINT = 'https://api.mainnet-beta.solana.com';
/** TODO: docs */
exports.DEVNET_ENDPOINT = 'https://api.devnet.solana.com';
/** TODO: docs */
exports.TESTNET_ENDPOINT = 'https://api.testnet.solana.com';
/** TODO: docs */
exports.LOCALNET_ENDPOINT = 'http://localhost:8899';
/**
* TODO: docs
*/
function getChainForEndpoint(endpoint) {
if (endpoint.includes(exports.MAINNET_ENDPOINT))
return wallet_standard_chains_1.SOLANA_MAINNET_CHAIN;
if (/\bdevnet\b/i.test(endpoint))
return wallet_standard_chains_1.SOLANA_DEVNET_CHAIN;
if (/\btestnet\b/i.test(endpoint))
return wallet_standard_chains_1.SOLANA_TESTNET_CHAIN;
if (/\blocalhost\b/i.test(endpoint) || /\b127\.0\.0\.1\b/.test(endpoint))
return wallet_standard_chains_1.SOLANA_LOCALNET_CHAIN;
return wallet_standard_chains_1.SOLANA_MAINNET_CHAIN;
}
/**
* TODO: docs
*/
function getEndpointForChain(chain, endpoint) {
if (endpoint)
return endpoint;
if (chain === wallet_standard_chains_1.SOLANA_MAINNET_CHAIN)
return exports.MAINNET_ENDPOINT;
if (chain === wallet_standard_chains_1.SOLANA_DEVNET_CHAIN)
return exports.DEVNET_ENDPOINT;
if (chain === wallet_standard_chains_1.SOLANA_TESTNET_CHAIN)
return exports.TESTNET_ENDPOINT;
if (chain === wallet_standard_chains_1.SOLANA_LOCALNET_CHAIN)
return exports.LOCALNET_ENDPOINT;
return exports.MAINNET_ENDPOINT;
}
//# sourceMappingURL=endpoint.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/endpoint.ts"],"names":[],"mappings":";;;AAoBA,kDAMC;AAKD,kDAOC;AArCD,2EAKwC;AAExC,iBAAiB;AACJ,QAAA,gBAAgB,GAAG,qCAAqC,CAAC;AACtE,iBAAiB;AACJ,QAAA,eAAe,GAAG,+BAA+B,CAAC;AAC/D,iBAAiB;AACJ,QAAA,gBAAgB,GAAG,gCAAgC,CAAC;AACjE,iBAAiB;AACJ,QAAA,iBAAiB,GAAG,uBAAuB,CAAC;AAEzD;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAAgB;IAChD,IAAI,QAAQ,CAAC,QAAQ,CAAC,wBAAgB,CAAC;QAAE,OAAO,6CAAoB,CAAC;IACrE,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,4CAAmB,CAAC;IAC7D,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,6CAAoB,CAAC;IAC/D,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,8CAAqB,CAAC;IACvG,OAAO,6CAAoB,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,KAAkB,EAAE,QAAiB;IACrE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,KAAK,KAAK,6CAAoB;QAAE,OAAO,wBAAgB,CAAC;IAC5D,IAAI,KAAK,KAAK,4CAAmB;QAAE,OAAO,uBAAe,CAAC;IAC1D,IAAI,KAAK,KAAK,6CAAoB;QAAE,OAAO,wBAAgB,CAAC;IAC5D,IAAI,KAAK,KAAK,8CAAqB;QAAE,OAAO,yBAAiB,CAAC;IAC9D,OAAO,wBAAgB,CAAC;AAC5B,CAAC"}

View File

@@ -0,0 +1,21 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./commitment.js"), exports);
__exportStar(require("./endpoint.js"), exports);
__exportStar(require("./signIn.js"), exports);
__exportStar(require("./signMessage.js"), exports);
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,gDAA8B;AAC9B,8CAA4B;AAC5B,mDAAiC"}

View File

@@ -0,0 +1 @@
{ "type": "commonjs" }

View File

@@ -0,0 +1,186 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.verifySignIn = verifySignIn;
exports.deriveSignInMessage = deriveSignInMessage;
exports.deriveSignInMessageText = deriveSignInMessageText;
exports.parseSignInMessage = parseSignInMessage;
exports.parseSignInMessageText = parseSignInMessageText;
exports.createSignInMessage = createSignInMessage;
exports.createSignInMessageText = createSignInMessageText;
const signMessage_js_1 = require("./signMessage.js");
const util_js_1 = require("./util.js");
/**
* TODO: docs
*/
function verifySignIn(input, output) {
const { signedMessage, signature, account: { publicKey }, } = output;
const message = deriveSignInMessage(input, output);
return (!!message && (0, signMessage_js_1.verifyMessageSignature)({ message, signedMessage, signature, publicKey: publicKey }));
}
/**
* TODO: docs
*/
function deriveSignInMessage(input, output) {
const text = deriveSignInMessageText(input, output);
if (!text)
return null;
return new TextEncoder().encode(text);
}
/**
* TODO: docs
*/
function deriveSignInMessageText(input, output) {
const parsed = parseSignInMessage(output.signedMessage);
if (!parsed)
return null;
if (input.domain && input.domain !== parsed.domain)
return null;
if (input.address && input.address !== parsed.address)
return null;
if (input.statement !== parsed.statement)
return null;
if (input.uri !== parsed.uri)
return null;
if (input.version !== parsed.version)
return null;
if (input.chainId !== parsed.chainId)
return null;
if (input.nonce !== parsed.nonce)
return null;
if (input.issuedAt !== parsed.issuedAt)
return null;
if (input.expirationTime !== parsed.expirationTime)
return null;
if (input.notBefore !== parsed.notBefore)
return null;
if (input.requestId !== parsed.requestId)
return null;
if (input.resources) {
if (!parsed.resources)
return null;
if (!(0, util_js_1.arraysEqual)(input.resources, parsed.resources))
return null;
}
else if (parsed.resources)
return null;
return createSignInMessageText(parsed);
}
/**
* TODO: docs
*/
function parseSignInMessage(message) {
const text = new TextDecoder().decode(message);
return parseSignInMessageText(text);
}
// TODO: implement https://github.com/solana-labs/solana/blob/master/docs/src/proposals/off-chain-message-signing.md
const DOMAIN = '(?<domain>[^\\n]+?) wants you to sign in with your Solana account:\\n';
const ADDRESS = '(?<address>[^\\n]+)(?:\\n|$)';
const STATEMENT = '(?:\\n(?<statement>[\\S\\s]*?)(?:\\n|$))??';
const URI = '(?:\\nURI: (?<uri>[^\\n]+))?';
const VERSION = '(?:\\nVersion: (?<version>[^\\n]+))?';
const CHAIN_ID = '(?:\\nChain ID: (?<chainId>[^\\n]+))?';
const NONCE = '(?:\\nNonce: (?<nonce>[^\\n]+))?';
const ISSUED_AT = '(?:\\nIssued At: (?<issuedAt>[^\\n]+))?';
const EXPIRATION_TIME = '(?:\\nExpiration Time: (?<expirationTime>[^\\n]+))?';
const NOT_BEFORE = '(?:\\nNot Before: (?<notBefore>[^\\n]+))?';
const REQUEST_ID = '(?:\\nRequest ID: (?<requestId>[^\\n]+))?';
const RESOURCES = '(?:\\nResources:(?<resources>(?:\\n- [^\\n]+)*))?';
const FIELDS = `${URI}${VERSION}${CHAIN_ID}${NONCE}${ISSUED_AT}${EXPIRATION_TIME}${NOT_BEFORE}${REQUEST_ID}${RESOURCES}`;
const MESSAGE = new RegExp(`^${DOMAIN}${ADDRESS}${STATEMENT}${FIELDS}\\n*$`);
/**
* TODO: docs
*/
function parseSignInMessageText(text) {
var _a;
const match = MESSAGE.exec(text);
if (!match)
return null;
const groups = match.groups;
if (!groups)
return null;
return {
domain: groups.domain,
address: groups.address,
statement: groups.statement,
uri: groups.uri,
version: groups.version,
nonce: groups.nonce,
chainId: groups.chainId,
issuedAt: groups.issuedAt,
expirationTime: groups.expirationTime,
notBefore: groups.notBefore,
requestId: groups.requestId,
resources: (_a = groups.resources) === null || _a === void 0 ? void 0 : _a.split('\n- ').slice(1),
};
}
/**
* TODO: docs
*/
function createSignInMessage(input) {
const text = createSignInMessageText(input);
return new TextEncoder().encode(text);
}
/**
* TODO: docs
*/
function createSignInMessageText(input) {
// ${domain} wants you to sign in with your Solana account:
// ${address}
//
// ${statement}
//
// URI: ${uri}
// Version: ${version}
// Chain ID: ${chain}
// Nonce: ${nonce}
// Issued At: ${issued-at}
// Expiration Time: ${expiration-time}
// Not Before: ${not-before}
// Request ID: ${request-id}
// Resources:
// - ${resources[0]}
// - ${resources[1]}
// ...
// - ${resources[n]}
let message = `${input.domain} wants you to sign in with your Solana account:\n`;
message += `${input.address}`;
if (input.statement) {
message += `\n\n${input.statement}`;
}
const fields = [];
if (input.uri) {
fields.push(`URI: ${input.uri}`);
}
if (input.version) {
fields.push(`Version: ${input.version}`);
}
if (input.chainId) {
fields.push(`Chain ID: ${input.chainId}`);
}
if (input.nonce) {
fields.push(`Nonce: ${input.nonce}`);
}
if (input.issuedAt) {
fields.push(`Issued At: ${input.issuedAt}`);
}
if (input.expirationTime) {
fields.push(`Expiration Time: ${input.expirationTime}`);
}
if (input.notBefore) {
fields.push(`Not Before: ${input.notBefore}`);
}
if (input.requestId) {
fields.push(`Request ID: ${input.requestId}`);
}
if (input.resources) {
fields.push(`Resources:`);
for (const resource of input.resources) {
fields.push(`- ${resource}`);
}
}
if (fields.length) {
message += `\n\n${fields.join('\n')}`;
}
return message;
}
//# sourceMappingURL=signIn.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,22 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.verifyMessageSignature = verifyMessageSignature;
exports.verifySignMessage = verifySignMessage;
const ed25519_1 = require("@noble/curves/ed25519");
const util_js_1 = require("./util.js");
/**
* TODO: docs
*/
function verifyMessageSignature({ message, signedMessage, signature, publicKey, }) {
// TODO: implement https://github.com/solana-labs/solana/blob/master/docs/src/proposals/off-chain-message-signing.md
return (0, util_js_1.bytesEqual)(message, signedMessage) && ed25519_1.ed25519.verify(signature, signedMessage, publicKey);
}
/**
* TODO: docs
*/
function verifySignMessage(input, output) {
const { message, account: { publicKey }, } = input;
const { signedMessage, signature } = output;
return verifyMessageSignature({ message, signedMessage, signature, publicKey: publicKey });
}
//# sourceMappingURL=signMessage.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../src/signMessage.ts"],"names":[],"mappings":";;AAOA,wDAaC;AAKD,8CAOC;AAhCD,mDAAgD;AAEhD,uCAAuC;AAEvC;;GAEG;AACH,SAAgB,sBAAsB,CAAC,EACnC,OAAO,EACP,aAAa,EACb,SAAS,EACT,SAAS,GAMZ;IACG,oHAAoH;IACpH,OAAO,IAAA,oBAAU,EAAC,OAAO,EAAE,aAAa,CAAC,IAAI,iBAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AACrG,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAA6B,EAAE,MAA+B;IAC5F,MAAM,EACF,OAAO,EACP,OAAO,EAAE,EAAE,SAAS,EAAE,GACzB,GAAG,KAAK,CAAC;IACV,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC5C,OAAO,sBAAsB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,SAAuB,EAAE,CAAC,CAAC;AAC7G,CAAC"}

View File

@@ -0,0 +1 @@
{"root":["../../src/commitment.ts","../../src/endpoint.ts","../../src/index.ts","../../src/signIn.ts","../../src/signMessage.ts","../../src/util.ts"],"version":"5.7.3"}

View File

@@ -0,0 +1,44 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.arraysEqual = arraysEqual;
exports.bytesEqual = bytesEqual;
/**
* @internal
*
* Efficiently compare {@link Indexed} arrays (e.g. `Array` and `Uint8Array`).
*
* @param a An array.
* @param b Another array.
*
* @return `true` if the arrays have the same length and elements, `false` otherwise.
*
* @group Internal
*/
function arraysEqual(a, b) {
if (a === b)
return true;
const length = a.length;
if (length !== b.length)
return false;
for (let i = 0; i < length; i++) {
if (a[i] !== b[i])
return false;
}
return true;
}
/**
* @internal
*
* Efficiently compare byte arrays, using {@link arraysEqual}.
*
* @param a A byte array.
* @param b Another byte array.
*
* @return `true` if the byte arrays have the same length and bytes, `false` otherwise.
*
* @group Internal
*/
function bytesEqual(a, b) {
return arraysEqual(a, b);
}
//# sourceMappingURL=util.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":";;AA0BA,kCAWC;AAcD,gCAEC;AAvCD;;;;;;;;;;;GAWG;AACH,SAAgB,WAAW,CAAI,CAAa,EAAE,CAAa;IACvD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACxB,IAAI,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,UAAU,CAAC,CAAa,EAAE,CAAa;IACnD,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC"}