15815213711
2024-08-26 67b8b6731811983447e053d4396b3708c14dfe3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import isViablePhoneNumber from './isViablePhoneNumber.js'
 
// https://www.ietf.org/rfc/rfc3966.txt
 
/**
 * @param  {string} text - Phone URI (RFC 3966).
 * @return {object} `{ ?number, ?ext }`.
 */
export function parseRFC3966(text) {
    let number
    let ext
 
    // Replace "tel:" with "tel=" for parsing convenience.
    text = text.replace(/^tel:/, 'tel=')
 
    for (const part of text.split(';')) {
        const [name, value] = part.split('=')
        switch (name) {
            case 'tel':
                number = value
                break
            case 'ext':
                ext = value
                break
            case 'phone-context':
                // Only "country contexts" are supported.
                // "Domain contexts" are ignored.
                if (value[0] === '+') {
                    number = value + number
                }
                break
        }
    }
 
    // If the phone number is not viable, then abort.
    if (!isViablePhoneNumber(number)) {
        return {}
    }
 
    const result = { number }
    if (ext) {
        result.ext = ext
    }
    return result
}
 
/**
 * @param  {object} - `{ ?number, ?extension }`.
 * @return {string} Phone URI (RFC 3966).
 */
export function formatRFC3966({ number, ext }) {
    if (!number) {
        return ''
    }
    if (number[0] !== '+') {
        throw new Error(`"formatRFC3966()" expects "number" to be in E.164 format.`)
    }
    return `tel:${number}${ext ? ';ext=' + ext : ''}`
}