Skip to content

sindilevich/connection-string-parser

Repository files navigation

Connection String Parser

This project aims to provide a connection string parser/formatter for node.js and browser.

The Need

Mostly, connecting to a database requires to provide some sort of a connection string: a URI that points to one or more database hosts, supplies connection credentials, and allows to further configure the connection via database-specific options.

As an example, here is a MongoDB connection string: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]. It nicely combines a large set of database connection information and configuration data into a compact implementation. Let's look at the connection string components:

  • Scheme: mongodb://
  • Credentials: username:password
  • List of hosts: host1[:port1][,host2[:port2],...[,hostN[:portN]]]
  • Database name: database
  • Connection-specific options: options

Here is another example, a MySQL connection string this time: mysql://user:password@host:port/db?debug=true&charset=BIG5_CHINESE_CI&timezone=-0700. It features the same components as the MongoDB connection string, and closely resembles all other possible connection strings, expressed as a URI.

Yet the most intriguing part, is that a project creator can invent his own URI-based connection string and use it to convey his project-specific configurations and options as long as they fit a URI concept and format.

Say, developing a project that needs to connect to a Hazelcast cluster. Why not require the project consumer to supply the needed connection information: credentials, host(s), options, etc. as a URI-based connection string? Such as the one below: hazelcast://[user:[password@]]host1[:port1][,host2:[port2],...[,hostN:[portN]]][[/]?options].

So, it seems like connection strings are good means to represent connection information and configuration in a compact form. An added value in a connection string is the simplicity with which it can be passed to the consumer: an environmental variable, a command line parameter, a one-liner in a configuration file of some sort.

The Problem

The problem with a URI-based connection string that immediately arises - is that not every connection provider: database, in-memory cluster, etc. supports connecting to it with a connection string. Many of such tools work with connection objects only. A connection object conveys the represents the same connection information as a connection string, though in JSON format.

Thus, a question emerge: How to convert a convenient URI-based connection string to a JSON-based connection object?

The Solution

Here a generic connection string parser comes to rescue. One that take in a URI-based connection string and parse it into a JSON object. Or take in a JSON-based connection object and format it as a connection string.

And this is the ultimate aim of this project: A generic connection string parser/formatter.

Say No More and How to Use It

The project is written in Typescript. Below usage examples for Typescript-based projects.

Add to the project

Simply run npm install connection-string-parser in your project's folder.

Parse

With a connection string as the input, let's convert it to a connection object for further use.

Each component of a connection string has to be URI-encoded with the encodeURIComponent method or its analogues.

The result connection object will have each component automatically decoded with the decodeURIComponent method.

import { ConnectionStringParser } from "connection-string-parser";

const connectionStringParser = new ConnectionStringParser({
	scheme: "mongodb",
	hosts: []
});

const connectionObject = connectionStringParser.parse("mongodb://s%23perus%24r:unbr%23k%40bl%24@ho%24t:1234/%24my-db?replicaSet=%24super%40");

The code above should yield a connection object with the following information:

{
	"scheme": "mongodb",
	"hosts": [{
		"host": "ho$t",
		"port": 1234
	}],
	"username": "s#perus$r",
	"password": "unbr#k@bl$",
	"endpoint": "$my-db",
	"options": {
		"replicaSet": "$super@"
	}
}

Format

With a connection object as the input, let's convert it to a connection string for further use.

The result connection string will have each of its component automatically encoded with the encodeURIComponent method.

import { ConnectionStringParser } from "connection-string-parser";

const connectionStringParser = new ConnectionStringParser({
	scheme: "mongodb",
	hosts: []
});

const connectionString = connectionStringParser.format({
	"scheme": "mongodb",
	"hosts": [{
		"host": "ho$t",
		"port": 1234
	}],
	"username": "s#perus$r",
	"password": "unbr#k@bl$",
	"endpoint": "$my-db",
	"options": {
		"replicaSet": "$super@"
	}
});

The code above should yield a connection string with the following information:

"mongodb://s%23perus%24r:unbr%23k%40bl%24@ho%24t:1234/%24my-db?replicaSet=%24super%40"

Acknowledgments

The mongodb-uri project.

Releases

No releases published

Packages

No packages published