@kokimoki/app 0.6.3 → 0.6.4

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.
@@ -19,6 +19,7 @@ export declare class KokimokiClient<StatelessDataT = any, ClientContextT = any>
19
19
  private _serverTimeOffset;
20
20
  private _clientContext?;
21
21
  private _synced;
22
+ private _lastPongAt;
22
23
  constructor(host: string, appId: string, code?: string);
23
24
  get id(): string;
24
25
  get token(): string;
@@ -27,6 +28,7 @@ export declare class KokimokiClient<StatelessDataT = any, ClientContextT = any>
27
28
  get clientContext(): ClientContextT & ({} | null);
28
29
  connect(): Promise<void>;
29
30
  serverTimestamp(): number;
31
+ private receivePong;
30
32
  private checkConnectionState;
31
33
  setProvider<T extends DocTypeDescription>(name: string, store: SyncedStore<T>): Promise<void>;
32
34
  removeProvider(name: string): void;
@@ -14,6 +14,7 @@ export class KokimokiClient extends EventEmitter {
14
14
  _serverTimeOffset = 0;
15
15
  _clientContext;
16
16
  _synced = false;
17
+ _lastPongAt = 0;
17
18
  constructor(host, appId, code = "") {
18
19
  super();
19
20
  this.host = host;
@@ -80,19 +81,26 @@ export class KokimokiClient extends EventEmitter {
80
81
  });
81
82
  // Ping interval
82
83
  setInterval(() => {
83
- this._providers.forEach((provider) => {
84
- provider.sendStateless("ping");
85
- });
86
- }, 30000);
87
- // Initial connected state
88
- this._synced = true;
89
- this.emit("connected");
84
+ this.checkConnectionState();
85
+ this._providers.forEach((provider) => provider.sendStateless("ping"));
86
+ }, 5000);
87
+ // Check initial connected state
88
+ this.receivePong();
90
89
  }
91
90
  serverTimestamp() {
92
91
  return Date.now() - this._serverTimeOffset;
93
92
  }
93
+ receivePong() {
94
+ this._lastPongAt = Date.now();
95
+ this.checkConnectionState();
96
+ }
94
97
  checkConnectionState() {
95
- const synced = !Array.from(this._providers.values()).some((provider) => provider.status !== "connected" || !provider.synced);
98
+ const pongReceived = Date.now() - this._lastPongAt < 6000;
99
+ if (!pongReceived && this._synced) {
100
+ this._providers.forEach((provider) => provider.disconnect());
101
+ }
102
+ const synced = pongReceived &&
103
+ !Array.from(this._providers.values()).some((provider) => provider.status !== "connected" || !provider.synced);
96
104
  if (synced && !this._synced) {
97
105
  this._synced = true;
98
106
  this.emit("connected");
@@ -116,6 +124,7 @@ export class KokimokiClient extends EventEmitter {
116
124
  // Handle incoming stateless messages
117
125
  provider.on("stateless", (e) => {
118
126
  if (e.payload === "pong") {
127
+ this._lastPongAt = Date.now();
119
128
  return;
120
129
  }
121
130
  const payload = JSON.parse(e.payload);
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const KOKIMOKI_APP_VERSION = "0.6.3";
1
+ export declare const KOKIMOKI_APP_VERSION = "0.6.4";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const KOKIMOKI_APP_VERSION = "0.6.3";
1
+ export const KOKIMOKI_APP_VERSION = "0.6.4";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kokimoki/app",
3
- "version": "0.6.3",
3
+ "version": "0.6.4",
4
4
  "type": "module",
5
5
  "description": "Kokimoki app",
6
6
  "main": "dist/index.js",