new WSyncWebdataServer(instWConverServer, optopt) → {Object}
- Description:
伺服器端之資料同步器
- Source:
Example
//前後端共用範例
import w from 'wsemi'
import WSyncWebdataServer from './src/WSyncWebdataServer.mjs'
import WSyncWebdataClient from './src/WSyncWebdataClient.mjs'
let ms = []
let ntg = 0
let genTag = () => {
ntg++
return `tag-${ntg}`
}
//-------- 後端 ---------
//EventEmitter, 模擬後端推播至前端
let ee = w.evem()
//instWConverServer
let instWConverServer = w.evem()
//wsds
let wsds = new WSyncWebdataServer(
instWConverServer,
{
// fpTableTags: 'tableTags-sync-webdata.json',
genTag,
},
)
//tableTagsSrv
let tableTagsSrv = {
tabA: 'tag-0-a',
tabB: 'tag-0-b',
}
//initTableTags
wsds.initTableTags(tableTagsSrv)
//readTableTags
console.log('server: nowTableTags', wsds.readTableTags())
ms.push({ 'server nowTableTags': JSON.stringify(wsds.readTableTags()) })
//updateTableTag
setTimeout(() => {
wsds.updateTableTag('tabA')
ms.push({ 'server updateTableTag': 'tabA' })
}, 500)
setTimeout(() => {
wsds.updateTableTag('tabB')
ms.push({ 'server updateTableTag': 'tabB' })
}, 750)
setTimeout(() => {
wsds.updateTableTag('tabA')
ms.push({ 'server updateTableTag': 'tabA' })
}, 1000)
//changeTableTags
wsds.on('changeTableTags', (nowTableTags) => {
console.log('server: changeTableTags', nowTableTags)
//server push
console.log('server: push')
ms.push({ 'server changeTableTags': JSON.stringify(nowTableTags) })
ee.emit('push', nowTableTags)
})
//error
wsds.on('error', (err) => {
console.log('server: error', err)
})
//getAPIData, 模擬後端提供API
let tabsCount = {
tabA: 0,
tabB: 0,
}
async function getAPIData(tableName) {
ms.push({ 'server call getAPIData before': tableName })
return new Promise((resolve, reject) => {
setTimeout(() => {
tabsCount[tableName] += 1
ms.push({ 'server call getAPIData after': `table[${tableName}] = ${tabsCount[tableName]}` })
resolve(`table[${tableName}] = ${tabsCount[tableName]}`)
}, 100)
})
}
//-------- 前端 ---------
//instWConverClient
let instWConverClient = w.evem()
//wsdc
let wsdc = new WSyncWebdataClient(instWConverClient, {})
//tableTagsCl
let tableTagsCl = {
tabA: 'tag-0-a',
tabB: 'tag-0-b',
}
//setTableTags, 模擬前端將tableTags預先或有變更即儲存至localStorage, 啟動時有既有tableTags
wsdc.setTableTags(tableTagsCl)
ms.push({ 'clinet setTableTags': JSON.stringify(tableTagsCl) })
//push, 模擬前端接收後端推播有變更tableTags
ee.on('push', (nowTableTags) => {
//updateTableTags
wsdc.updateTableTags(nowTableTags)
ms.push({ 'clinet updateTableTags': JSON.stringify(nowTableTags) })
})
//refreshState
wsdc.on('refreshState', (msg) => {
console.log('client: refreshState needToRefresh', msg.needToRefresh)
})
//refreshTable
wsdc.on('refreshTable', (input) => {
// console.log('client: refreshTable', input)
//收到有變更tableTags, 模擬呼叫後端API
console.log('client: getAPIData before: ' + input.tableName)
ms.push({ 'clinet call getAPIData before': input.tableName })
getAPIData(input.tableName)
.then((data) => {
console.log('client: getAPIData after: ' + data)
ms.push({ 'clinet call getAPIData after': data })
input.pm.resolve(data) //Use pm.resolve to retrieve the data, and pm.reject the message when get an error.
})
.catch((err) => {
input.pm.reject(err)
})
})
//getData
wsdc.on('getData', (data) => {
console.log('client: getData', data)
//前端取得數據
})
//beforeUpdateTableTags, afterUpdateTableTags
wsdc.on('beforeUpdateTableTags', (msg) => {
// console.log('client: beforeUpdateTableTags', msg)
})
wsdc.on('afterUpdateTableTags', (msg) => {
// console.log('client: afterUpdateTableTags', msg)
})
//error
wsdc.on('error', (err) => {
console.log('client: error', err)
})
setTimeout(() => {
console.log('ms', ms)
}, 2000)
// server: nowTableTags { tabA: 'tag-0-a', tabB: 'tag-0-b' }
// server: changeTableTags { tabA: 'tag-1', tabB: 'tag-0-b' }
// server: push
// client: refreshState needToRefresh true
// client: getAPIData before: tabA
// client: getAPIData after: table[tabA] = 1
// client: getData { tableName: 'tabA', timeTag: 'tag-1', data: 'table[tabA] = 1' }
// server: changeTableTags { tabA: 'tag-1', tabB: 'tag-2' }
// server: push
// client: refreshState needToRefresh true
// client: getAPIData before: tabB
// client: getAPIData after: table[tabB] = 1
// client: getData { tableName: 'tabB', timeTag: 'tag-2', data: 'table[tabB] = 1' }
// server: changeTableTags { tabA: 'tag-3', tabB: 'tag-2' }
// server: push
// client: refreshState needToRefresh true
// client: getAPIData before: tabA
// client: getAPIData after: table[tabA] = 2
// client: getData { tableName: 'tabA', timeTag: 'tag-3', data: 'table[tabA] = 2' }
// ms [
// { 'server nowTableTags': '{"tabA":"tag-0-a","tabB":"tag-0-b"}' },
// { 'clinet setTableTags': '{"tabA":"tag-0-a","tabB":"tag-0-b"}' },
// { 'server updateTableTag': 'tabA' },
// { 'server changeTableTags': '{"tabA":"tag-1","tabB":"tag-0-b"}' },
// { 'clinet updateTableTags': '{"tabA":"tag-1","tabB":"tag-0-b"}' },
// { 'clinet call getAPIData before': 'tabA' },
// { 'server call getAPIData before': 'tabA' },
// { 'server updateTableTag': 'tabB' },
// { 'server call getAPIData after': 'table[tabA] = 1' },
// { 'clinet call getAPIData after': 'table[tabA] = 1' },
// { 'server changeTableTags': '{"tabA":"tag-1","tabB":"tag-2"}' },
// { 'clinet updateTableTags': '{"tabA":"tag-1","tabB":"tag-2"}' },
// { 'clinet call getAPIData before': 'tabB' },
// { 'server call getAPIData before': 'tabB' },
// { 'server updateTableTag': 'tabA' },
// { 'server call getAPIData after': 'table[tabB] = 1' },
// { 'clinet call getAPIData after': 'table[tabB] = 1' },
// { 'server changeTableTags': '{"tabA":"tag-3","tabB":"tag-2"}' },
// { 'clinet updateTableTags': '{"tabA":"tag-3","tabB":"tag-2"}' },
// { 'clinet call getAPIData before': 'tabA' },
// { 'server call getAPIData before': 'tabA' },
// { 'server call getAPIData after': 'table[tabA] = 2' },
// { 'clinet call getAPIData after': 'table[tabA] = 2' }
// ]
Parameters:
Name | Type | Attributes | Default | Description | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
instWConverServer |
Object | 輸入通訊服務實體物件,可使用例如WConverhpServer等建立 |
|||||||||||||||||
opt |
Object |
<optional> |
{}
|
輸入設定物件,預設{} Properties
|
Returns:
回傳後端資料同步物件,可監聽事件changeTableTags、error,可使用函數readTableTags、writeTableTags、initTableTags、setTableTags、getTableTags、updateTableTag
- Type
- Object
Methods
(static) getTableTags() → {Object}
- Description:
直接取得各資料表時間資料
- Source:
Example
let tableTags = wsds.getTableTags()
Returns:
回傳各資料表時間戳物件
- Type
- Object
(static) initTableTags(tableTags, modeopt) → {Undefined}
- Description:
初始化各資料表時間資料
- Source:
Example
let tableTags = {...}
let mode = ''
wsds.initTableTags(tableTags, mode)
Parameters:
Name | Type | Attributes | Default | Description |
---|---|---|---|---|
tableTags |
Object | 輸入各資料表時間戳物件 |
||
mode |
String |
<optional> |
'useInputFirst'
|
輸入使用設定方式字串,可有'useInputFirst'代表使用傳入設定優先再與既有JSON檔設定合併,為預設值,'useStorageFirst'代表使用既有JSON檔設定優先再與傳入設定合併,'useInputOnly'代表只使用傳入設定,'useStorageOnly'代表只使用既有JSON檔設定 |
Returns:
無回傳
- Type
- Undefined
(static) onChangeUpdateTableTag(nowTableTags)
- Description:
監聽更新資料表事件,當外部監聽收到更新通知時再推播nowTableTags至前端
- Source:
Example
wo.on('changeTableTags', function(nowTableTags) {
...
})
Parameters:
Name | Type | Description |
---|---|---|
nowTableTags |
Object | 各資料表時間戳物件 |
(static) readTableTags() → {Object}
- Description:
讀取各資料表時間資料
- Source:
Example
let tableTags = wsds.readTableTags()
Returns:
回傳各資料表時間戳物件
- Type
- Object
(static) setTableTags(tableTags) → {Undefined}
- Description:
直接設定各資料表時間資料
- Source:
Example
let tableTags = {...}
wsds.setTableTags(tableTags)
Parameters:
Name | Type | Description |
---|---|---|
tableTags |
Object | 輸入各資料表時間戳物件 |
Returns:
無回傳
- Type
- Undefined
(static) updateTableTag(tableTag) → {Undefined}
- Description:
更新指定資料表之時間戳,當資料表更新時需調用此函數
- Source:
Example
let tableName = '...'
wsds.updateTableTag(tableName)
Parameters:
Name | Type | Description |
---|---|---|
tableTag |
String | 輸入欲更新指定資料表名稱字串 |
Returns:
無回傳
- Type
- Undefined
(static) writeTableTags(tableTags) → {Undefined}
- Description:
儲存各資料表時間資料
- Source:
Example
let tableTags = {...}
wsds.writeTableTags(tableTags)
Parameters:
Name | Type | Description |
---|---|---|
tableTags |
Object | 輸入各資料表時間戳物件 |
Returns:
無回傳
- Type
- Undefined