@zhangxuejing123./sip-phone-sdk 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +24 -0
  2. package/babel.config.js +5 -0
  3. package/dist/demo.html +21 -0
  4. package/dist/media/outgoing-call2.b8558579.mp3 +0 -0
  5. package/dist/sip-phone-sdk.common.js +42439 -0
  6. package/dist/sip-phone-sdk.css +5 -0
  7. package/dist/sip-phone-sdk.umd.js +42449 -0
  8. package/dist/sip-phone-sdk.umd.min.js +14 -0
  9. package/jsconfig.json +19 -0
  10. package/package-lock.json +15671 -0
  11. package/package.json +99 -0
  12. package/public/SIP_MIX_WEB.js +50 -0
  13. package/public/en.js +24 -0
  14. package/public/favicon.ico +0 -0
  15. package/public/index.html +32 -0
  16. package/public/index.test.html +31 -0
  17. package/public/zh.js +24 -0
  18. package/src/.DS_Store +0 -0
  19. package/src/App.vue +136 -0
  20. package/src/assets/.DS_Store +0 -0
  21. package/src/assets/adudio-open.png +0 -0
  22. package/src/assets/audio-close.png +0 -0
  23. package/src/assets/call-down.png +0 -0
  24. package/src/assets/camera-close.png +0 -0
  25. package/src/assets/camera-open.png +0 -0
  26. package/src/assets/icon_Recording_Fill_Red_Active.svg +15 -0
  27. package/src/assets/icon_Recording_Fill_Red_Inactive.svg +15 -0
  28. package/src/assets/img_Avatar_User.png +0 -0
  29. package/src/assets/normal-logo.png +0 -0
  30. package/src/assets/outgoing-call2.mp3 +0 -0
  31. package/src/components/DialPanelMini.vue +179 -0
  32. package/src/components/MobilePhone copy 2.vue +1173 -0
  33. package/src/components/MobilePhone copy.vue +1046 -0
  34. package/src/components/MobilePhone.vue +1157 -0
  35. package/src/components/index.js +36 -0
  36. package/src/components/vuetify.css +29663 -0
  37. package/src/index.js +100 -0
  38. package/src/lang/en.js +24 -0
  39. package/src/lang/zh.js +24 -0
  40. package/src/libs/SIP_MIX_WEB.js +50 -0
  41. package/src/libs/en.js +24 -0
  42. package/src/libs/tool.js +312 -0
  43. package/src/libs/zh.js +24 -0
  44. package/src/main.js +24 -0
  45. package/src/plugins/vuetify.js +11 -0
  46. package/src/utils/rem.js +22 -0
  47. package/vue.config copy 2.js +39 -0
  48. package/vue.config copy.js +11 -0
  49. package/vue.config.js +39 -0
package/src/libs/en.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Created by Wade (weida1985@163.com) on 2023/8/1.
3
+ */
4
+ const en={
5
+ serverConnecting: 'Server connecting',
6
+ serverConnected: 'Server connected',
7
+ connectionClosed: 'Connection closed',
8
+ clickButtonToMakeCall: 'Click button to make call',
9
+ gotCameraStreamFailed: 'Got camera stream failed',
10
+ calling: 'Calling',
11
+ pleaseBePatient: 'Please be patient',
12
+ cameraOrMicUnsupported: 'Camera or mic unsupported',
13
+ WebRTCUnsupported: 'WebRTC unsupported',
14
+ connectionFailedPleaseCheckYourNetwork: 'Connection failed. Please check your network',
15
+ registered: 'Registered',
16
+ unregistered: 'Unregistered',
17
+ registerFailed: 'Register failed',
18
+ cancelled: 'Cancelled',
19
+ hangedUp: 'hangedUp',
20
+ remoteRinging: 'Remote ringing',
21
+ remoteAccept: 'Remote accept'
22
+ }
23
+
24
+ export default en
@@ -0,0 +1,312 @@
1
+ import { v4 as uuidv4 } from 'uuid'
2
+
3
+ /**
4
+ * @param {Array} arr1
5
+ * @param {Array} arr2
6
+ * @description 得到两个数组的交集, 两个数组的元素为数值或字符串
7
+ */
8
+ export const getIntersection = (arr1, arr2) => {
9
+ let len = Math.min(arr1.length, arr2.length)
10
+ let i = -1
11
+ let res = []
12
+ while (++i < len) {
13
+ const item = arr2[i]
14
+ if (arr1.indexOf(item) > -1) res.push(item)
15
+ }
16
+ return res
17
+ }
18
+
19
+ /**
20
+ * @param {Array} arr1
21
+ * @param {Array} arr2
22
+ * @description 得到两个数组的并集, 两个数组的元素为数值或字符串
23
+ */
24
+ export const getUnion = (arr1, arr2) => {
25
+ return Array.from(new Set([...arr1, ...arr2]))
26
+ }
27
+
28
+ /**
29
+ * @param {Array} targetArr 目标数组
30
+ * @param {Array} arr 需要查询的数组
31
+ * @description 判断要查询的数组是否至少有一个元素包含在目标数组中
32
+ */
33
+ export const hasOneOf = (targetArr, arr) => {
34
+ return targetArr.some(_ => arr.indexOf(_) > -1)
35
+ }
36
+
37
+ /**
38
+ * @param {String|Number} value 要验证的字符串或数值
39
+ * @param {*} validList 用来验证的列表
40
+ */
41
+ export function oneOf (value, validList) {
42
+ for (let i = 0; i < validList.length; i++) {
43
+ if (value === validList[i]) {
44
+ return true
45
+ }
46
+ }
47
+ return false
48
+ }
49
+
50
+ /**
51
+ * @param {Number} timeStamp 判断时间戳格式是否是毫秒
52
+ * @returns {Boolean}
53
+ */
54
+ const isMillisecond = timeStamp => {
55
+ const timeStr = String(timeStamp)
56
+ return timeStr.length > 10
57
+ }
58
+
59
+ /**
60
+ * @param {Number} timeStamp 传入的时间戳
61
+ * @param {Number} currentTime 当前时间时间戳
62
+ * @returns {Boolean} 传入的时间戳是否早于当前时间戳
63
+ */
64
+ const isEarly = (timeStamp, currentTime) => {
65
+ return timeStamp < currentTime
66
+ }
67
+
68
+ /**
69
+ * @param {Number} num 数值
70
+ * @returns {String} 处理后的字符串
71
+ * @description 如果传入的数值小于10,即位数只有1位,则在前面补充0
72
+ */
73
+ const getHandledValue = num => {
74
+ return num < 10 ? '0' + num : num
75
+ }
76
+
77
+ /**
78
+ * @param {Number} timeStamp 传入的时间戳
79
+ * @param {Number|String} startType 要返回的时间字符串的格式类型,传入'year'则返回年开头的完整时间
80
+ */
81
+ const getDate = (timeStamp, startType) => {
82
+ const d = new Date(timeStamp * 1000)
83
+ const year = d.getFullYear()
84
+ const month = getHandledValue(d.getMonth() + 1)
85
+ const date = getHandledValue(d.getDate())
86
+ const hours = getHandledValue(d.getHours())
87
+ const minutes = getHandledValue(d.getMinutes())
88
+ const second = getHandledValue(d.getSeconds())
89
+ return startType === 'year' ? (year + '-' + month + '-' + date + ' ' + hours + ':' + minutes + ':' + second) : (month + '-' + date + ' ' + hours + ':' + minutes)
90
+ }
91
+
92
+ /**
93
+ * @param {String|Number} timeStamp 时间戳
94
+ * @returns {String} 相对时间字符串
95
+ */
96
+ export const getRelativeTime = timeStamp => {
97
+ // 判断当前传入的时间戳是秒格式还是毫秒
98
+ const IS_MILLISECOND = isMillisecond(timeStamp)
99
+ // 如果是毫秒格式则转为秒格式
100
+ if (IS_MILLISECOND) Math.floor(timeStamp /= 1000)
101
+ // 传入的时间戳可以是数值或字符串类型,这里统一转为数值类型
102
+ timeStamp = Number(timeStamp)
103
+ // 获取当前时间时间戳
104
+ const currentTime = Math.floor(Date.parse(new Date()) / 1000)
105
+ // 判断传入时间戳是否早于当前时间戳
106
+ const IS_EARLY = isEarly(timeStamp, currentTime)
107
+ // 获取两个时间戳差值
108
+ let diff = currentTime - timeStamp
109
+ // 如果IS_EARLY为false则差值取反
110
+ if (!IS_EARLY) diff = -diff
111
+ let resStr
112
+ const dirStr = IS_EARLY ? '前' : '后'
113
+ // 少于等于59秒
114
+ if (diff <= 59) resStr = diff + '秒' + dirStr
115
+ // 多于59秒,少于等于59分钟59秒
116
+ else if (diff > 59 && diff <= 3599) resStr = Math.floor(diff / 60) + '分钟' + dirStr
117
+ // 多于59分钟59秒,少于等于23小时59分钟59秒
118
+ else if (diff > 3599 && diff <= 86399) resStr = Math.floor(diff / 3600) + '小时' + dirStr
119
+ // 多于23小时59分钟59秒,少于等于29天59分钟59秒
120
+ else if (diff > 86399 && diff <= 2623859) resStr = Math.floor(diff / 86400) + '天' + dirStr
121
+ // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前
122
+ else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) resStr = getDate(timeStamp)
123
+ else resStr = getDate(timeStamp, 'year')
124
+ return resStr
125
+ }
126
+
127
+ /**
128
+ * @returns {String} 当前浏览器名称
129
+ */
130
+ /*
131
+ export const getExplorer = () => {
132
+ const ua = window.navigator.userAgent
133
+ const isExplorer = (exp) => {
134
+ return ua.indexOf(exp) > -1
135
+ }
136
+ if (isExplorer('MSIE')) return 'IE'
137
+ else if (isExplorer('Firefox')) return 'Firefox'
138
+ else if (isExplorer('Chrome')) return 'Chrome'
139
+ else if (isExplorer('Opera')) return 'Opera'
140
+ else if (isExplorer('Safari')) return 'Safari'
141
+ }
142
+ */
143
+
144
+
145
+ /**
146
+ * 判断一个对象是否存在key,如果传入第二个参数key,则是判断这个obj对象是否存在key这个属性
147
+ * 如果没有传入key这个参数,则判断obj对象是否有键值对
148
+ */
149
+ export const hasKey = (obj, key) => {
150
+ if (key) return key in obj
151
+ else {
152
+ let keysArr = Object.keys(obj)
153
+ return keysArr.length
154
+ }
155
+ }
156
+
157
+ /**
158
+ * @param {*} obj1 对象
159
+ * @param {*} obj2 对象
160
+ * @description 判断两个对象是否相等,这两个对象的值只能是数字或字符串
161
+ */
162
+ export const objEqual = (obj1, obj2) => {
163
+ const keysArr1 = Object.keys(obj1)
164
+ const keysArr2 = Object.keys(obj2)
165
+ if (keysArr1.length !== keysArr2.length) return false
166
+ else if (keysArr1.length === 0 && keysArr2.length === 0) return true
167
+ else return !keysArr1.some(key => obj1[key] !== obj2[key])
168
+ }
169
+
170
+ export function padLeftZero (str, zerosCount) {
171
+ return ((new Array(zerosCount)).fill('0').join('') + str).substr(str.length)
172
+ }
173
+
174
+ export const formatDate = (fmt = 'yyyyMMddhhmmss', date = new Date()) => {
175
+ if (!date) return ''
176
+ if (/(y+)/.test(fmt)) {
177
+ fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
178
+ }
179
+ let o = {
180
+ 'M+': date.getMonth() + 1,
181
+ 'd+': date.getDate(),
182
+ 'h+': date.getHours(),
183
+ 'm+': date.getMinutes(),
184
+ 's+': date.getSeconds(),
185
+ // 'i+': date.getTime() % 1000
186
+ 'i+': date.getMilliseconds()
187
+ }
188
+ for (let k in o) {
189
+ if (new RegExp(`(${k})`).test(fmt)) {
190
+ let str = o[k] + ''
191
+ fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str, RegExp.$1.length))
192
+ }
193
+ }
194
+ return fmt
195
+ }
196
+
197
+ export const formatTimeStr = (timeStr) => {
198
+ return timeStr ? `${timeStr.substr(0, 4)}/${timeStr.substr(4, 2)}/${timeStr.substr(6, 2)} ${timeStr.substr(8, 2)}:${timeStr.substr(10, 2)}:${timeStr.substr(12, 2)}` : ''
199
+ }
200
+
201
+ export function uuid(replaceLetter = '-') {
202
+ let uuid = uuidv4()
203
+ if (replaceLetter) {
204
+ uuid = uuid.replace(new RegExp('-', 'g'), '')
205
+ }
206
+ return uuid
207
+ }
208
+
209
+ export function swap (obj, map) {
210
+ for (const [a, b] of Object.entries(map)) {
211
+ const c = obj[a]
212
+ obj[a] = obj[b]
213
+ obj[b] = c
214
+ }
215
+ return obj
216
+ }
217
+
218
+ export function getUrlParams () {
219
+ const query = window.location.search.substring(1)
220
+ const vars = query.split('&')
221
+ return vars.reduce((pre, cur) => {
222
+ const [k, v] = cur.split('=')
223
+ if (k) {
224
+ pre[k] = decodeURIComponent(v || '')
225
+ }
226
+ return pre
227
+ }, {})
228
+ }
229
+
230
+ export function closeStream (stream) {
231
+ if (!stream) {
232
+ return
233
+ }
234
+
235
+ // Latest spec states that MediaStream has no stop() method and instead must
236
+ // call stop() on every MediaStreamTrack.
237
+ try {
238
+ let tracks
239
+
240
+ if (stream.getTracks) {
241
+ tracks = stream.getTracks()
242
+ for (const track of tracks) {
243
+ track.stop()
244
+ }
245
+ } else {
246
+ tracks = stream.getAudioTracks()
247
+ for (const track of tracks) {
248
+ track.stop()
249
+ }
250
+ tracks = stream.getVideoTracks()
251
+ for (const track of tracks) {
252
+ track.stop()
253
+ }
254
+ }
255
+ } catch (error) {
256
+ // Deprecated by the spec, but still in use.
257
+ // NOTE: In Temasys IE plugin stream.stop is a callable 'object'.
258
+ if (typeof stream.stop === 'function' || typeof stream.stop === 'object') {
259
+ stream.stop()
260
+ }
261
+ }
262
+ }
263
+
264
+ const CH_ZN_REG = /[\u4E00-\u9FA5]/
265
+ export function strToHex (str) {
266
+ const ar = []
267
+ for (let i = 0; i < str.length; i++) {
268
+ let a = ''
269
+ if (CH_ZN_REG.test(str.charAt(i))) {
270
+ a = encodeURI(str.charAt(i)).replace(/%/g, '')
271
+ } else {
272
+ a = str.charCodeAt(i).toString(16)
273
+ }
274
+ ar.push(a)
275
+ }
276
+ str = ar.join('')
277
+ return str
278
+ }
279
+ function readUTF (arr) {
280
+ if (typeof arr === 'string') {
281
+ return arr
282
+ }
283
+ let UTF = '', _arr = arr
284
+ for (let i = 0; i < _arr.length; i++) {
285
+ let one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/)
286
+ if (v && one.length === 8) {
287
+ let bytesLength = v[0].length
288
+ let store = _arr[i].toString(2).slice(7 - bytesLength)
289
+ for (let st = 1; st < bytesLength; st++) {
290
+ store += _arr[st + i].toString(2).slice(2)
291
+ }
292
+ UTF += String.fromCharCode(parseInt(store, 2))
293
+ i += bytesLength - 1
294
+ } else {
295
+ UTF += String.fromCharCode(_arr[i])
296
+ }
297
+ }
298
+ return UTF
299
+ }
300
+
301
+ export function hexToStr (str) {
302
+ if (str.length % 2 !== 0) {
303
+ return ''
304
+ }
305
+ const buf = []
306
+ for (let i = 0; i < str.length; i += 2) {
307
+ buf.push(parseInt(str.substring(i, i + 2), 16))
308
+ }
309
+ return readUTF(buf)
310
+ }
311
+
312
+
package/src/libs/zh.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Created by Wade (weida1985@163.com) on 2023/8/1.
3
+ */
4
+ const zh={
5
+ serverConnecting: '服务器连接中',
6
+ serverConnected: '服务器已连接',
7
+ connectionClosed: '连接已断开',
8
+ clickButtonToMakeCall: '点击拨号开始呼叫',
9
+ gotCameraStreamFailed: '获取摄像头视频流失败',
10
+ calling: '呼叫中',
11
+ // pleaseBePatient: '请耐心等待',
12
+ pleaseBePatient: '正在邀请对方加入视频通话...',
13
+ cameraOrMicUnsupported: '不支持开启摄像头或Mic接口',
14
+ WebRTCUnsupported: '不支持WebRTC',
15
+ connectionFailedPleaseCheckYourNetwork: '服务器连接失败,请检查网络。',
16
+ registered: '已注册',
17
+ unregistered: '已注销',
18
+ registerFailed: '注册失败',
19
+ cancelled: '已取消',
20
+ hangedUp: '已挂机',
21
+ remoteRinging: '对端开始振铃',
22
+ remoteAccept: '已接通'
23
+ }
24
+ export default zh
package/src/main.js ADDED
@@ -0,0 +1,24 @@
1
+ import Vue from 'vue'
2
+ import App from './App.vue'
3
+ import VueI18n from 'vue-i18n'
4
+ import vuetify from './plugins/vuetify'
5
+ import zh from '@/libs/zh.js'
6
+ import en from '@/libs/en.js'
7
+ import '@/utils/rem'
8
+ Vue.use(VueI18n)
9
+ const i18n = new VueI18n({
10
+ locale: window.config.lang || localStorage.getItem('language') || 'zh', // 语言标识
11
+ messages: {
12
+ 'zh': zh,
13
+ 'en': en
14
+ }
15
+ })
16
+
17
+
18
+ Vue.config.productionTip = false
19
+
20
+ new Vue({
21
+ vuetify,
22
+ i18n,
23
+ render: h => h(App)
24
+ }).$mount('#app')
@@ -0,0 +1,11 @@
1
+ import '@mdi/font/css/materialdesignicons.css';
2
+ import Vue from 'vue';
3
+ import Vuetify from 'vuetify/lib/framework';
4
+
5
+ Vue.use(Vuetify);
6
+
7
+ export default new Vuetify({
8
+ icons: {
9
+ iconfont: 'mdi'
10
+ }
11
+ });
@@ -0,0 +1,22 @@
1
+ (function (window, document) {
2
+ function resize() {
3
+ var ww = window.innerWidth;
4
+ if (ww > window.screen.width) {
5
+ window.requestAnimationFrame(resize);
6
+ } else {
7
+ if (ww > 750) {
8
+ ww = 750;
9
+ }
10
+ document.documentElement.style.fontSize = (ww * 100) / 750 + 'px';
11
+ }
12
+ }
13
+
14
+ resize();
15
+
16
+ window.addEventListener('resize', resize);
17
+ window.addEventListener('pageshow', function (e) {
18
+ if (e.persisted) {
19
+ resize();
20
+ }
21
+ });
22
+ })(window, document);
@@ -0,0 +1,39 @@
1
+ module.exports = {
2
+ transpileDependencies: [
3
+ 'vuetify'
4
+ ],
5
+ publicPath: '/sip-phone-demo',
6
+ productionSourceMap: false,
7
+ // 新增的css配置部分
8
+ css: {
9
+ loaderOptions: {
10
+ stylus: {
11
+ use: [
12
+ require('poststylus')([
13
+ require('postcss-pxtorem')({
14
+ rootValue: 100,
15
+ propWhiteList: [],
16
+ minPixelValue: 2,
17
+ }),
18
+ 'autoprefixer',
19
+ ]),
20
+ ],
21
+ import: [require('path').resolve('./src/assets/theme.custom')]
22
+ },
23
+ postcss: {
24
+ plugins: [
25
+ require('postcss-pxtorem')({
26
+ rootValue: 100,
27
+ propWhiteList: [],
28
+ minPixelValue: 2,
29
+ }),
30
+ require('autoprefixer')(),
31
+ ],
32
+ }
33
+ }
34
+ },
35
+ devServer: {
36
+ port: 8080,
37
+ hot: true
38
+ }
39
+ }
@@ -0,0 +1,11 @@
1
+ module.exports = {
2
+ transpileDependencies: [
3
+ 'vuetify'
4
+ ],
5
+ publicPath: '/sip-phone-demo',
6
+ productionSourceMap: false,
7
+ devServer: {
8
+ port: 8080,
9
+ hot: true
10
+ }
11
+ }
package/vue.config.js ADDED
@@ -0,0 +1,39 @@
1
+ module.exports = {
2
+ transpileDependencies: [
3
+ 'vuetify'
4
+ ],
5
+ publicPath: '/sip-phone-demo',
6
+ productionSourceMap: false,
7
+ // 新增的css配置部分
8
+ css: {
9
+ loaderOptions: {
10
+ stylus: {
11
+ use: [
12
+ require('poststylus')([
13
+ require('postcss-pxtorem')({
14
+ rootValue: 100,
15
+ propWhiteList: [],
16
+ minPixelValue: 2,
17
+ }),
18
+ 'autoprefixer',
19
+ ]),
20
+ ],
21
+ import: [require('path').resolve('./src/assets/theme.custom')]
22
+ },
23
+ postcss: {
24
+ plugins: [
25
+ require('postcss-pxtorem')({
26
+ rootValue: 100,
27
+ propWhiteList: [],
28
+ minPixelValue: 2,
29
+ }),
30
+ require('autoprefixer')(),
31
+ ],
32
+ }
33
+ }
34
+ },
35
+ devServer: {
36
+ port: 8080,
37
+ hot: true
38
+ }
39
+ }