1.0.5 • Published 5 years ago

def-codes v1.0.5

Weekly downloads
3
License
MIT
Repository
github
Last release
5 years ago

Description

Library allows to extract formatted phone numbers from text, convert them to universal format (only digits with country code) from any other format, define country, city and provider.

It defines country by country codes file you can create yourself, i.e. by parsing Wikipedia. It defines provider using offline DEF-base grabed from https://www.rossvyaz.ru/opendata/ and offline MNP base from http://www.zniis.ru/bdpn/check (you can get it from server only if you have authorised access).

Installation

npm install def-codes

Usage

'use strict';
const def = require('def-codes');

const test = async () => {
    // DB to store information about phone codes.
    await def.init({
        socketPath: '/run/mysqld/mysqld.sock',
        user      : 'xinit',
        password  : 'password',
        database  : 'xinit'
    });

    // international number
    await def.info(def.normalize('+7 920 065-46-89'));
    /*
    result:
    {
        "country_codes": {
            "code": "7",
            "country": "Russia / Kazakhstan"
        },
        "def": [
            {
                "code": "920",
                "begin": "0000000",
                "end": "0799999",
                "provider": "ПАО \"МегаФон\"",
                "region": "Нижегородская обл."
            }
        ],
        "mnp": [
            {
                "owner": "\"ВымпелКом\" ПАО",
                "mnc": "99",
                "region": "Нижегородская область",
                "portdate": "2015-12-22T22:12:04.000Z",
                "donor": "\"МегаФон\" ПАО",
                "oldmnc": ""
            }
        ]
    }
    */

    // russian number without country code
    await def.info(def.normalize('920 065-46-89', true));
    /*
    result:
    {
        "country_codes": {
            "code": "7",
            "country": "Russia / Kazakhstan"
        },
        "def": [
            {
                "code": "920",
                "begin": "0000000",
                "end": "0799999",
                "provider": "ПАО \"МегаФон\"",
                "region": "Нижегородская обл."
            }
        ],
        "mnp": [
            {
                "owner": "\"ВымпелКом\" ПАО",
                "mnc": "99",
                "region": "Нижегородская область",
                "portdate": "2015-12-22T22:12:04.000Z",
                "donor": "\"МегаФон\" ПАО",
                "oldmnc": ""
            }
        ]
    }
    */

    // compare result without knowledle that number belongs to Russia
    await def.info(def.normalize('920 065-46-89'));
    /*
    result:
    {
        "country_codes": {
            "code": "92",
            "country": "Pakistan"
        }
    }
    */
}

test();

Documentation

init(options)

Initialize library with database connection credentials. You can use info() only after initializing library.

Parameters

options \ Object. Database connection config as it described in mysql module docs.

Return

Promise with no parameters in then().

update(config)

Update DB. \ Note that you need regions.dump and codes.dump in var directory of your module root path to update MySQL database.

regions.dump contains russian regions numbers from MNP DB in the following format (without title):

77,Москва

Note that this region number does not coresponds to automobile region codes, so you strongly need to grab them from MNP provider server (I can't publish it as I don't have permissions to).

codes.dump contains country codes in the following format (without title):

7; Russia / Kazakhstan
71; Kazakhstan

You can take this codes from any source you want, i.e. parse Wikipedia website.

If you run your script for the first time then you need to update database using this function. After that you can update DB from time to time to keep DEF, ABC and MNP data up-to-date.

Parameters

config \ Object to connect to SFTP-server with MNP data. Should contain following fields:

{
    host,
    port,
    user,
    password
}

Return

Promise with no parameters in then().

normalize(number, russian = false)

Get number in every format and return number with country code as the first digit (only for russian mobile and POTS numbers) without any additional symbols or delimiters.

Parameters

number \ string. Phone number in every format.

russian \ boolean. Assume number without explicit country code (+ or 00) as possibly russian (replace intercity code 8 by country code 7 or prepend numbers without country or intercity code by 7). Parameter will only affect numbers what may be russian according russian numbering plan, so feel free to use even if you are not sure about input. \ Default false.

Return

string. Phone number consisting from digits only.

Example

Numbers converted in the following way:

numberrussianreturn
007-495-1234567true74951234567
+7 (123) 456-78-90true71234567890
+71234567890true71234567890
8-499-123-45-67true74991234567
8-800-123-45-67true78001234567
8-903-123-45-67true79031234567
8 495 123-45-67true74951234567
8 (495) 123-45-67true74951234567
8(495)123-45-67true74951234567
(495)1234567true74951234567
7104951234567false7104951234567
+7-495-1234567true74951234567
(81235)5-6789true78123556789
+1.495-123 4567false14951234567
903-123-45-67true79031234567
9031234567true79031234567
79031234567true79031234567
(903)123-45-67true79031234567
8(903)1234567true79031234567
+7(903)123 4567true79031234567
+7(903)true7903
8(903)true7903
+8(903)true8903
008(903)true8903
903true7903
+903true903
00903true903
+7(903)false7903
8(903)false8903
903false903

extrt(str, options = {})

Extract all phone numbers from string str in array. \ Phone numbers will be handled with normalize function automatically so you don't need to do it manually after extract.

Parameters

str \ string. Text to extract phone numbers from. Function is fast and nonblocking so string can be quite long and contain tens of thousands numbers.

options \ Object. Can contain following fields:

{
    russian   : false,
    min_length: 3
}

russian tells whether function need assume numbers as russian (see normalize docs). Default false.

min_length is minimal length of digit sequense to assume it as phone number. Default 3.

Return

Promise with then(numbers) where numbers is array with extracted phone numbers.

info(number)

Get all possible information about number. \ Information about DEF and MNP awailable only for russian numbers.

Parameters

number \ string. Phone number with country code prevoiusly formatted with normalize function.

Return

Object with information about number. Countains following fields:

{
    country_codes: {code, country},
    def: [{code, begin, end, provider, region}],
    mnp: [{owner, mnc, region, portdate, donor, oldmnc}]
}

@license MIT \ @version 1.0.5 \ @author Alexander Russkiy developer@xinit.ru