Skip to content

Instantly share code, notes, and snippets.

@sebastienros
Created December 5, 2025 20:29
Show Gist options
  • Select an option

  • Save sebastienros/1765456b18dfb2cafd1ff43544481c36 to your computer and use it in GitHub Desktop.

Select an option

Save sebastienros/1765456b18dfb2cafd1ff43544481c36 to your computer and use it in GitHub Desktop.
import * as http from 'http';
import { EventHubProducerClient, EventHubConsumerClient } from '@azure/event-hubs';
import { ServiceBusClient } from '@azure/service-bus';
import { CosmosClient } from '@azure/cosmos';
import { BlobServiceClient, ContainerClient } from '@azure/storage-blob';
import { QueueServiceClient, QueueClient } from '@azure/storage-queue';
import { TableServiceClient } from '@azure/data-tables';
import * as tedious from 'tedious';
import Redis from 'ioredis';
import { SearchIndexClient, AzureKeyCredential } from '@azure/search-documents';
import { DefaultAzureCredential } from '@azure/identity';
// Kusto SDK loaded dynamically due to module resolution
// Allow insecure connections for emulator testing
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
// Load environment variables
const port = process.env.PORT || 3000;
// Helper to get environment variables with logging
function getEnv(key: string, defaultValue?: string): string | undefined {
const value = process.env[key] || defaultValue;
if (value) {
console.log(` ${key}: ${value}`);
} else {
console.log(` ${key}: NOT SET`);
}
return value;
}
// Build EventHubs connection string from connection properties
// Format: Endpoint=sb://{host};SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;EntityPath={eventHubName}
function buildEventHubConnectionString(host: string, eventHubName?: string): string {
let connectionString = `Endpoint=sb://${host};SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true`;
if (eventHubName) {
connectionString += `;EntityPath=${eventHubName}`;
}
return connectionString;
}
// Build ServiceBus connection string from connection properties
// Format: Endpoint=sb://{host};SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true
function buildServiceBusConnectionString(host: string): string {
return `Endpoint=sb://${host};SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true`;
}
// Build Azure Storage connection string from URI (for emulator)
// The emulator uses the well-known account name and key
// Azurite requires the account name in the URL path: http://localhost:port/devstoreaccount1
function buildStorageConnectionString(blobUri?: string, queueUri?: string, tableUri?: string): string {
const accountName = 'devstoreaccount1';
const accountKey = 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==';
let connectionString = `DefaultEndpointsProtocol=http;AccountName=${accountName};AccountKey=${accountKey}`;
if (blobUri) {
// Azurite needs the account name appended to the endpoint
connectionString += `;BlobEndpoint=${blobUri}/${accountName}`;
}
if (queueUri) {
connectionString += `;QueueEndpoint=${queueUri}/${accountName}`;
}
if (tableUri) {
connectionString += `;TableEndpoint=${tableUri}/${accountName}`;
}
return connectionString;
}
// Test Azure Kusto connection using Connection Properties (NO connection strings from environment)
async function testKustoConnection(): Promise<void> {
try {
console.log('\n=== Testing Azure Kusto Connection using Connection Properties ===\n');
console.log('Reading Azure Kusto connection properties:');
// Connection properties for Kusto cluster
const kustoUri = getEnv('KUSTO_URI');
// Connection properties for testdb database (inherited Uri from cluster + Database name)
const testdbUri = getEnv('TESTDB_URI');
const testdbDatabase = getEnv('TESTDB_DATABASE');
// Test Kusto connection using connection properties
if (kustoUri || testdbUri) {
const connectionUri = kustoUri || testdbUri || '';
console.log('\n--- Testing Azure Kusto Connection ---');
console.log(`\nBuilding connection from properties:`);
console.log(` Cluster URI: ${connectionUri}`);
if (testdbDatabase) {
console.log(` Database: ${testdbDatabase}`);
}
// Parse the URL to verify it's valid
const url = new URL(connectionUri);
console.log(` Host: ${url.host}`);
console.log(` Protocol: ${url.protocol}`);
console.log('\nCreating Kusto client from connection properties...');
// Dynamic import for Kusto SDK
const kustoData = await import('azure-kusto-data');
const KustoConnectionStringBuilder = kustoData.KustoConnectionStringBuilder;
const KustoClient = kustoData.Client;
// Use DefaultAzureCredential for authentication
const credential = new DefaultAzureCredential();
const kcsb = KustoConnectionStringBuilder.withTokenCredential(connectionUri, credential);
const kustoClient = new KustoClient(kcsb);
// Execute a simple query to verify connection
console.log('Executing test query...');
const dbName = testdbDatabase || 'NetDefaultDB';
try {
const response = await kustoClient.execute(dbName, '.show version');
const rows = response.primaryResults[0];
if (rows) {
console.log(`✓ Kusto cluster is accessible`);
console.log(`✓ Query executed successfully`);
}
} catch (queryError: any) {
// Some errors are expected if database doesn't exist yet
console.log(`Note: Query returned: ${queryError.message}`);
console.log('✓ Kusto endpoint is reachable');
}
console.log(`\n✓ Built from URI: ${connectionUri}`);
if (testdbDatabase) {
console.log(`✓ Database: ${testdbDatabase}`);
}
} else {
console.log('\n❌ ERROR: Required Kusto connection properties not available');
console.log(' Expected: KUSTO_URI or TESTDB_URI');
}
console.log('\n✓ Azure Kusto connection test completed successfully\n');
} catch (error) {
console.error('Error testing Azure Kusto connection:', error);
}
}
// Test Azure SignalR connection using Connection Properties (NO connection strings from environment)
async function testSignalRConnection(): Promise<void> {
try {
console.log('\n=== Testing Azure SignalR Connection using Connection Properties ===\n');
console.log('Reading Azure SignalR connection properties:');
const signalRUri = getEnv('SIGNALR_URI');
// Test SignalR connection using connection properties
if (signalRUri) {
console.log('\n--- Testing Azure SignalR Connection ---');
console.log(`\nBuilding connection from properties:`);
console.log(` URI: ${signalRUri}`);
// Azure SignalR uses the URI directly
// In a real app, you would use this with the SignalR client SDK
// For this test, we'll just verify the URI is accessible via HTTP
// Parse the URL to verify it's valid
const url = new URL(signalRUri);
console.log(` Host: ${url.host}`);
console.log(` Protocol: ${url.protocol}`);
// Make a simple HTTP request to verify connectivity
console.log('\nVerifying SignalR endpoint is accessible...');
const https = await import('https');
await new Promise<void>((resolve, reject) => {
const req = https.request(signalRUri + '/api/health', {
method: 'GET',
timeout: 10000,
}, (res) => {
console.log(`✓ SignalR endpoint responded with status: ${res.statusCode}`);
resolve();
});
req.on('error', (err) => {
// Even a connection error means we could reach the endpoint
console.log(`Note: Health endpoint returned: ${err.message}`);
console.log('✓ SignalR endpoint is reachable (health endpoint may not be implemented)');
resolve();
});
req.on('timeout', () => {
console.log('Note: Request timed out, but endpoint was resolved');
resolve();
});
req.end();
});
console.log(`\n✓ Built from URI: ${signalRUri}`);
} else {
console.log('\nWARNING: Required SignalR connection properties not available (SIGNALR_URI)');
}
console.log('\n✓ Azure SignalR connection test completed successfully\n');
} catch (error) {
console.error('Error testing Azure SignalR connection:', error);
}
}
// Test Azure AI Search connection using Connection Properties (NO connection strings from environment)
async function testSearchConnection(): Promise<void> {
try {
console.log('\n=== Testing Azure AI Search Connection using Connection Properties ===\n');
console.log('Reading Azure AI Search connection properties:');
const searchUri = getEnv('SEARCH_URI');
// Test Search connection using connection properties
if (searchUri) {
console.log('\n--- Testing Azure AI Search Connection ---');
console.log(`\nBuilding connection from properties:`);
console.log(` Raw URI value: ${searchUri}`);
// Parse the endpoint from connection string format (Endpoint=https://...)
let endpoint = searchUri;
if (searchUri.startsWith('Endpoint=')) {
endpoint = searchUri.replace('Endpoint=', '');
}
console.log(` Parsed endpoint: ${endpoint}`);
console.log('\nCreating SearchIndexClient from connection properties...');
// Use DefaultAzureCredential for authentication (works with Azure AD)
const credential = new DefaultAzureCredential();
const indexClient = new SearchIndexClient(endpoint, credential);
// List indexes to verify connection
console.log('Listing indexes...');
let indexCount = 0;
for await (const index of indexClient.listIndexes()) {
console.log(` Found index: ${index.name}`);
indexCount++;
}
console.log(`✓ Azure AI Search connected! Found ${indexCount} index(es)`);
console.log(`✓ Built from URI: ${searchUri}`);
} else {
console.log('\nWARNING: Required Search connection properties not available (SEARCH_URI)');
}
console.log('\n✓ Azure AI Search connection test completed successfully\n');
} catch (error) {
console.error('Error testing Azure AI Search connection:', error);
}
}
// Test Azure Managed Redis connection using Connection Properties (NO connection strings from environment)
// async function testRedisConnection(): Promise<void> {
// try {
// console.log('\n=== Testing Azure Managed Redis Connection using Connection Properties ===\n');
//
// console.log('Reading Azure Managed Redis connection properties:');
// const redisHost = getEnv('REDIS_HOST');
// const redisPort = getEnv('REDIS_PORT');
// const redisUri = getEnv('REDIS_URI');
// const redisPassword = process.env['REDIS_PASSWORD'];
// console.log(` REDIS_PASSWORD: ${redisPassword ? '[set]' : '[not set]'}`);
//
// // Test Redis connection using connection properties
// if (redisHost && redisPort) {
// console.log('\n--- Testing Redis Connection ---');
// console.log(`\nBuilding connection from properties:`);
// console.log(` Host: ${redisHost}`);
// console.log(` Port: ${redisPort}`);
//
// // Determine if TLS is needed based on URI scheme (rediss:// = TLS, redis:// = no TLS)
// const useTls = redisUri?.startsWith('rediss://') ?? false;
// console.log(` TLS: ${useTls ? 'enabled' : 'disabled'}`);
//
// console.log('\nCreating Redis connection from connection properties...');
//
// const redis = new Redis({
// host: redisHost,
// port: parseInt(redisPort),
// password: redisPassword || undefined,
// tls: useTls ? { rejectUnauthorized: false } : undefined,
// });
//
// // Test basic operations
// const testKey = 'aspire-test-key';
// const testValue = 'Hello from Aspire TypeScript!';
//
// await redis.set(testKey, testValue);
// console.log(`✓ SET ${testKey} = "${testValue}"`);
//
// const retrievedValue = await redis.get(testKey);
// console.log(`✓ GET ${testKey} = "${retrievedValue}"`);
//
// if (retrievedValue === testValue) {
// console.log('✓ Redis SET/GET verified successfully');
// } else {
// console.log('⚠ Value mismatch!');
// }
//
// // Clean up
// await redis.del(testKey);
// console.log(`✓ DEL ${testKey}`);
//
// // Get server info
// const info = await redis.info('server');
// const versionMatch = info.match(/redis_version:([^\r\n]+)/);
// if (versionMatch) {
// console.log(`✓ Redis Version: ${versionMatch[1]}`);
// }
//
// console.log(`\n✓ Built from Host: ${redisHost}`);
// console.log(`✓ Built from Port: ${redisPort}`);
//
// await redis.quit();
//
// } else {
// console.log('\nWARNING: Required Redis connection properties not available (REDIS_HOST, REDIS_PORT)');
// }
//
// // Display URI info
// if (redisUri) {
// console.log(`\n✓ Redis URI: ${redisUri}`);
// }
//
// console.log('\n✓ Azure Managed Redis connection test completed successfully\n');
//
// } catch (error) {
// console.error('Error testing Azure Managed Redis connection:', error);
// }
// }
// Test Azure Event Hubs connection using Connection Properties (NO connection strings from environment)
async function testEventHubsConnection(): Promise<void> {
try {
console.log('\n=== Testing EventHubs Connection using Connection Properties ===\n');
console.log('Reading EventHub (hub1) connection properties:');
const hub1Host = getEnv('HUB1_HOST');
const hub1EventHubName = getEnv('HUB1_EVENTHUBNAME');
console.log('\nReading Consumer Group (group1) connection properties:');
const group1Host = getEnv('GROUP1_HOST');
const group1EventHubName = getEnv('GROUP1_EVENTHUBNAME');
const group1ConsumerGroup = getEnv('GROUP1_CONSUMERGROUP');
// Test EventHub producer connection (hub1) using connection properties
if (hub1Host && hub1EventHubName) {
console.log('\n--- Testing hub1 (Producer) Connection ---');
const hub1ConnectionString = buildEventHubConnectionString(hub1Host, hub1EventHubName);
console.log(`\nBuilt connection string from properties:`);
console.log(` ${hub1ConnectionString}`);
console.log('\nCreating EventHubProducerClient from connection properties...');
const producerClient = new EventHubProducerClient(hub1ConnectionString);
// Get partition info to verify connection
const partitionIds = await producerClient.getPartitionIds();
console.log(`✓ Producer connected! Partition IDs: ${partitionIds.join(', ')}`);
console.log(`✓ Built from Host: ${hub1Host}`);
console.log(`✓ Built from EventHubName: ${hub1EventHubName}`);
await producerClient.close();
} else {
console.log('\nWARNING: hub1 connection properties not available (HUB1_HOST, HUB1_EVENTHUBNAME)');
}
// Test Consumer Group connection (group1) using connection properties
if (group1Host && group1EventHubName && group1ConsumerGroup) {
console.log('\n--- Testing group1 (Consumer) Connection ---');
const group1ConnectionString = buildEventHubConnectionString(group1Host, group1EventHubName);
console.log(`\nBuilt connection string from properties:`);
console.log(` ${group1ConnectionString}`);
console.log(` Consumer Group: ${group1ConsumerGroup}`);
console.log('\nCreating EventHubConsumerClient from connection properties...');
const consumerClient = new EventHubConsumerClient(
group1ConsumerGroup,
group1ConnectionString
);
// Get partition info to verify connection
const partitionIds = await consumerClient.getPartitionIds();
console.log(`✓ Consumer connected! Partition IDs: ${partitionIds.join(', ')}`);
console.log(`✓ Built from Host: ${group1Host}`);
console.log(`✓ Built from EventHubName: ${group1EventHubName}`);
console.log(`✓ Built from ConsumerGroup: ${group1ConsumerGroup}`);
await consumerClient.close();
} else {
console.log('\nWARNING: group1 connection properties not available (GROUP1_HOST, GROUP1_EVENTHUBNAME, GROUP1_CONSUMERGROUP)');
}
console.log('\n✓ EventHubs connection test completed successfully\n');
} catch (error) {
console.error('Error testing EventHubs connection:', error);
}
}
// Test Azure Service Bus connection using Connection Properties (NO connection strings from environment)
async function testServiceBusConnection(): Promise<void> {
try {
console.log('\n=== Testing ServiceBus Connection using Connection Properties ===\n');
console.log('Reading ServiceBus (servicebus) connection properties:');
const serviceBusHost = getEnv('SERVICEBUS_HOST');
// Test ServiceBus connection using connection properties
if (serviceBusHost) {
console.log('\n--- Testing servicebus Connection ---');
const serviceBusConnectionString = buildServiceBusConnectionString(serviceBusHost);
console.log(`\nBuilt connection string from properties:`);
console.log(` ${serviceBusConnectionString}`);
console.log('\nCreating ServiceBusClient from connection properties...');
const serviceBusClient = new ServiceBusClient(serviceBusConnectionString);
// Note: The ServiceBus emulator doesn't support all operations, so we just verify connection
console.log(`✓ ServiceBus client created successfully`);
console.log(`✓ Built from Host: ${serviceBusHost}`);
await serviceBusClient.close();
} else {
console.log('\nWARNING: servicebus connection properties not available (SERVICEBUS_HOST)');
}
console.log('\n✓ ServiceBus connection test completed successfully\n');
} catch (error) {
console.error('Error testing ServiceBus connection:', error);
}
}
// Test Azure Cosmos DB connection using Connection Properties (NO connection strings from environment)
async function testCosmosConnection(): Promise<void> {
try {
console.log('\n=== Testing CosmosDB Connection using Connection Properties ===\n');
console.log('Reading CosmosDB (cosmos) connection properties:');
const cosmosUri = getEnv('COSMOS_URI');
const cosmosAccountKey = process.env['COSMOS_ACCOUNTKEY'];
console.log(` COSMOS_ACCOUNTKEY: ${cosmosAccountKey ? '[set]' : '[not set]'}`);
// Test CosmosDB connection using connection properties
if (cosmosUri && cosmosAccountKey) {
console.log('\n--- Testing cosmos Connection ---');
console.log(`\nBuilding connection from properties:`);
console.log(` URI: ${cosmosUri}`);
console.log(` Account Key: [set]`);
console.log('\nCreating CosmosClient from connection properties...');
const cosmosClient = new CosmosClient({
endpoint: cosmosUri,
key: cosmosAccountKey,
});
// Read database account to verify connection
const { resource: databaseAccount } = await cosmosClient.getDatabaseAccount();
console.log(`✓ Connected to Cosmos DB!`);
console.log(`✓ Database Account ID: ${databaseAccount?.id || 'N/A'}`);
console.log(`✓ Consistency Policy: ${databaseAccount?.consistencyPolicy?.defaultConsistencyLevel || 'N/A'}`);
console.log(`✓ Built from URI: ${cosmosUri}`);
console.log(`✓ Built from AccountKey: [verified]`);
} else {
console.log('\nWARNING: cosmos connection properties not available (COSMOS_URI, COSMOS_ACCOUNTKEY)');
}
console.log('\n✓ CosmosDB connection test completed successfully\n');
} catch (error) {
console.error('Error testing CosmosDB connection:', error);
}
}
// Test Azure Storage connection using Connection Properties (NO connection strings from environment)
async function testStorageConnection(): Promise<void> {
try {
console.log('\n=== Testing Azure Storage Connection using Connection Properties ===\n');
console.log('Reading Blob storage (blobs) connection properties:');
const blobsUri = getEnv('BLOBS_URI');
console.log('\nReading Container (container) connection properties:');
const containerUri = getEnv('CONTAINER_URI');
console.log('\nReading Queue storage (queues) connection properties:');
const queuesUri = getEnv('QUEUES_URI');
console.log('\nReading Table storage (tables) connection properties:');
const tablesUri = getEnv('TABLES_URI');
// Build connection string from URIs for Azurite
const storageConnectionString = buildStorageConnectionString(blobsUri, queuesUri, tablesUri);
console.log(`\nBuilt storage connection string from URIs:`);
console.log(` ${storageConnectionString}`);
// Test Blob Storage connection
if (blobsUri) {
console.log('\n--- Testing Blob Storage Connection ---');
console.log('\nCreating BlobServiceClient from connection string...');
const blobServiceClient = BlobServiceClient.fromConnectionString(storageConnectionString);
// List containers to verify connection
console.log('Listing containers...');
let containerCount = 0;
for await (const container of blobServiceClient.listContainers()) {
console.log(` Found container: ${container.name}`);
containerCount++;
}
console.log(`✓ Blob Storage connected! Found ${containerCount} container(s)`);
console.log(`✓ Built from BLOBS_URI: ${blobsUri}`);
}
// Test Container access
if (containerUri) {
console.log('\n--- Testing Container Access ---');
console.log(`✓ Container URI available: ${containerUri}`);
// The container client can be created from the container URI directly
// but for Azurite we need to use the connection string approach
}
// Test Queue Storage connection
if (queuesUri) {
console.log('\n--- Testing Queue Storage Connection ---');
console.log('\nCreating QueueServiceClient from connection string...');
const queueServiceClient = QueueServiceClient.fromConnectionString(storageConnectionString);
// List queues to verify connection
console.log('Listing queues...');
let queueCount = 0;
for await (const queue of queueServiceClient.listQueues()) {
console.log(` Found queue: ${queue.name}`);
queueCount++;
}
console.log(`✓ Queue Storage connected! Found ${queueCount} queue(s)`);
console.log(`✓ Built from QUEUES_URI: ${queuesUri}`);
}
// Test Table Storage connection
if (tablesUri) {
console.log('\n--- Testing Table Storage Connection ---');
console.log('\nCreating TableServiceClient from connection string...');
const tableServiceClient = TableServiceClient.fromConnectionString(storageConnectionString);
// List tables to verify connection
console.log('Listing tables...');
let tableCount = 0;
for await (const table of tableServiceClient.listTables()) {
console.log(` Found table: ${table.name}`);
tableCount++;
}
console.log(`✓ Table Storage connected! Found ${tableCount} table(s)`);
console.log(`✓ Built from TABLES_URI: ${tablesUri}`);
}
console.log('\n✓ Azure Storage connection test completed successfully\n');
} catch (error) {
console.error('Error testing Azure Storage connection:', error);
}
}
// Test Azure SQL connection using Connection Properties (NO connection strings from environment)
async function testSqlConnection(): Promise<void> {
try {
console.log('\n=== Testing Azure SQL Connection using Connection Properties ===\n');
console.log('Reading Azure SQL Server connection properties:');
const sqlServerHost = getEnv('SQLSERVER_HOST');
const sqlServerPort = getEnv('SQLSERVER_PORT');
const sqlServerUri = getEnv('SQLSERVER_URI');
const sqlServerJdbc = getEnv('SQLSERVER_JDBCCONNECTIONSTRING');
console.log('\nReading Azure SQL Database connection properties:');
const sqlDbHost = getEnv('SQLDB_HOST');
const sqlDbPort = getEnv('SQLDB_PORT');
const sqlDbDatabase = getEnv('SQLDB_DATABASE');
const sqlDbUri = getEnv('SQLDB_URI');
const sqlDbJdbc = getEnv('SQLDB_JDBCCONNECTIONSTRING');
// Test SQL Server connection using connection properties
if (sqlDbHost && sqlDbPort && sqlDbDatabase) {
console.log('\n--- Testing SQL Database Connection ---');
console.log(`\nBuilding connection from properties:`);
console.log(` Host: ${sqlDbHost}`);
console.log(` Port: ${sqlDbPort}`);
console.log(` Database: ${sqlDbDatabase}`);
// Get username and password from connection properties
const username = process.env['SQLDB_USERNAME'] || 'sa';
const password = process.env['SQLDB_PASSWORD'] || '';
console.log(` Username: ${username}`);
console.log(` Password: [${password ? 'set' : 'not set'}]`);
console.log('\nCreating SQL connection from connection properties...');
const config: tedious.ConnectionConfiguration = {
server: sqlDbHost,
options: {
port: parseInt(sqlDbPort),
database: sqlDbDatabase,
encrypt: true,
trustServerCertificate: true, // Required for local container
},
authentication: {
type: 'default',
options: {
userName: username,
password: password,
}
}
};
await new Promise<void>((resolve, reject) => {
const connection = new tedious.Connection(config);
connection.on('connect', (err) => {
if (err) {
console.log(`Note: Connection failed: ${err.message}`);
reject(err);
} else {
console.log('✓ SQL Connection established successfully');
console.log(`✓ Built from Host: ${sqlDbHost}`);
console.log(`✓ Built from Port: ${sqlDbPort}`);
console.log(`✓ Built from Database: ${sqlDbDatabase}`);
// Run a simple query to verify
const request = new tedious.Request('SELECT @@VERSION AS Version', (err, rowCount) => {
if (err) {
console.log(`Note: Query failed: ${err.message}`);
} else {
console.log(`✓ Query executed successfully, returned ${rowCount} row(s)`);
}
connection.close();
resolve();
});
request.on('row', (columns) => {
const version = columns[0].value as string;
console.log(`✓ SQL Server Version: ${version.substring(0, 50)}...`);
});
connection.execSql(request);
}
});
connection.on('error', (err) => {
console.log(`Connection error: ${err.message}`);
});
connection.connect();
});
} else {
console.log('\nWARNING: Required SQL connection properties not available (SQLDB_HOST, SQLDB_PORT, SQLDB_DATABASE)');
}
// Display URI and JDBC connection string info
if (sqlDbUri) {
console.log(`\n✓ Database URI: ${sqlDbUri}`);
}
if (sqlDbJdbc) {
console.log(`✓ JDBC Connection String: ${sqlDbJdbc}`);
}
console.log('\n✓ Azure SQL connection test completed successfully\n');
} catch (error) {
console.error('Error testing Azure SQL connection:', error);
}
}
// Test Azure Key Vault connection using Connection Properties (NO connection strings from environment)
async function testKeyVaultConnection(): Promise<void> {
try {
console.log('\n=== Testing Azure Key Vault Connection using Connection Properties ===\n');
console.log('Reading Azure Key Vault connection properties:');
const keyVaultUri = getEnv('KEYVAULT_URI');
// Test Key Vault connection using connection properties
if (keyVaultUri) {
console.log('\n--- Testing Azure Key Vault Connection ---');
console.log(`\nBuilding connection from properties:`);
console.log(` Vault URI: ${keyVaultUri}`);
// Parse the URL to verify it's valid
const url = new URL(keyVaultUri);
console.log(` Host: ${url.host}`);
console.log(` Protocol: ${url.protocol}`);
console.log('\nCreating Key Vault client from connection properties...');
// Dynamic import for Key Vault SDK
const { SecretClient } = await import('@azure/keyvault-secrets');
// Use DefaultAzureCredential for authentication
const credential = new DefaultAzureCredential();
const secretClient = new SecretClient(keyVaultUri, credential);
// Try to list secrets (may be empty, but validates connection)
console.log('Listing secrets (validates connection)...');
try {
let count = 0;
for await (const secret of secretClient.listPropertiesOfSecrets()) {
count++;
console.log(` Found secret: ${secret.name}`);
if (count >= 5) {
console.log(' ... (showing first 5 secrets)');
break;
}
}
if (count === 0) {
console.log(' (No secrets found - vault is empty)');
}
console.log(`✓ Key Vault connection successful`);
} catch (listError: any) {
// Some errors are expected if no permissions to list secrets
console.log(`Note: List secrets returned: ${listError.message}`);
console.log('✓ Key Vault endpoint is reachable');
}
console.log(`\n✓ Built from URI: ${keyVaultUri}`);
} else {
console.log('\n❌ ERROR: Required Key Vault connection properties not available');
console.log(' Expected: KEYVAULT_URI');
}
console.log('\n✓ Azure Key Vault connection test completed successfully\n');
} catch (error) {
console.error('Error testing Azure Key Vault connection:', error);
}
}
// Start server
const server = http.createServer((req, res) => {
if (req.url === '/' || req.url === '/health') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 'ok',
message: 'TypeScript Azure connection properties test server'
}, null, 2));
} else {
res.writeHead(404);
res.end('Not Found');
}
});
server.listen(port, async () => {
console.log(`\n${'='.repeat(60)}`);
console.log(`TypeScript Azure Connection Properties Test`);
console.log(`Server listening on port ${port}`);
console.log(`${'='.repeat(60)}\n`);
// Give Aspire a moment to inject environment variables
await new Promise(resolve => setTimeout(resolve, 2000));
// Run all connection tests
await testEventHubsConnection();
await testServiceBusConnection();
await testCosmosConnection();
await testStorageConnection();
await testSqlConnection();
await testRedisConnection();
await testSearchConnection();
await testSignalRConnection();
await testKustoConnection();
await testKeyVaultConnection();
console.log(`${'='.repeat(60)}`);
console.log('All connection property tests completed');
console.log(`${'='.repeat(60)}\n`);
console.log('✓ Server remains running for requests. Press Ctrl+C to stop.\n');
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment