-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathsync-error.js
138 lines (126 loc) · 3.3 KB
/
sync-error.js
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
function supported (versions) {
return versions.map(function (i) {
return i + '.x'
}).join(', ')
}
/**
* Unknown error received from other Logux client.
*
* @param {BaseSync} sync The sync client object.
* @param {string} type The error type.
* @param {any} options The error options.
* @param {boolean} received Was error received from other node.
*
* @example
* if (error.name === 'SyncError') {
* console.log('Server throws: ' + error.description)
* }
*
* @extends Error
* @class
*/
function SyncError (sync, type, options, received) {
Error.call(this, type)
/**
* Always equal to `SyncError`. The best way to check error type.
* @type {string}
*
* @example
* if (error.name === 'SyncError') { }
*/
this.name = 'SyncError'
/**
* Error type name.
* @type {string}
*
* @example
* if (error.type === 'timeout') {
* fixNetwork()
* }
*/
this.type = type
/**
* Error extra data depends on error type.
* @type {any}
*
* @example
* if (error.type === 'timeout') {
* console.error('A timeout was reached (' + error.options + ' ms)')
* }
*/
this.options = options
/**
* Origin error description from other client.
* @type {string}
*
* @example
* console.log('Server throws: ' + error.description)
*/
this.description = SyncError.describe(type, options)
/**
* Sync client received a error message.
* @type {BaseSync}
*
* @example
* error.sync.connection.connected
*/
this.sync = sync
/**
* Error was received from other client.
* @type {boolean}
*/
this.received = !!received
this.message = ''
if (received) {
if (this.sync.otherNodeId) {
this.message += this.sync.otherNodeId + ' sent '
} else {
this.message += 'Logux received '
}
this.message += this.type + ' error'
if (this.description !== this.type) {
this.message += ' (' + this.description + ')'
}
} else {
this.message = this.description
}
if (Error.captureStackTrace) {
Error.captureStackTrace(this, SyncError)
}
}
/**
* Return a error description by it code.
*
* @param {string} type The error code.
* @param {any} options The errors options depends on error code.
*
* @return {string} Human-readable error description.
*
* @example
* errorMessage(msg) {
* console.log(SyncError.describe(msg[1], msg[2]))
* }
*/
SyncError.describe = function describe (type, options) {
if (type === 'timeout') {
return 'A timeout was reached (' + options + 'ms)'
} else if (type === 'wrong-format') {
return 'Wrong message format in ' + options
} else if (type === 'unknown-message') {
return 'Unknown message `' + options + '` type'
} else if (type === 'missed-auth') {
return 'Start authentication before sending message ' + options
} else if (type === 'wrong-protocol') {
return 'Only ' + supported(options.supported) + ' Logux protocols ' +
'are supported, but you use ' + options.used.join('.')
} else if (type === 'wrong-subprotocol') {
return 'Only ' + options.supported + ' application subprotocols are ' +
'supported, but you use ' + options.used
} else if (type === 'wrong-credentials') {
return 'Wrong credentials'
} else {
return type
}
}
SyncError.prototype = Error.prototype
module.exports = SyncError