ar_sync 1.1.1 → 1.1.2
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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +4 -3
- data/.gitignore +2 -0
- data/Gemfile +1 -0
- data/ar_sync.gemspec +1 -1
- data/bin/console +2 -2
- data/core/ArSyncModel.d.ts +10 -12
- data/core/ArSyncModel.js +7 -5
- data/core/ArSyncStore.d.ts +11 -3
- data/core/ArSyncStore.js +91 -83
- data/core/hooks.d.ts +1 -0
- data/core/hooks.js +5 -4
- data/gemfiles/Gemfile-rails-6 +4 -3
- data/gemfiles/{Gemfile-rails-7 → Gemfile-rails-7-0} +4 -3
- data/gemfiles/Gemfile-rails-7-1 +10 -0
- data/lib/ar_sync/class_methods.rb +1 -5
- data/lib/ar_sync/core.rb +2 -6
- data/lib/ar_sync/instance_methods.rb +16 -1
- data/lib/ar_sync/version.rb +1 -1
- data/src/core/ArSyncModel.ts +9 -8
- data/src/core/ArSyncStore.ts +109 -98
- data/src/core/hooks.ts +6 -5
- metadata +5 -19
- data/Gemfile.lock +0 -54
data/core/hooks.js
CHANGED
@@ -18,7 +18,7 @@ function checkHooks() {
|
|
18
18
|
if (!useState)
|
19
19
|
throw 'uninitialized. needs `initializeHooks({ useState, useEffect, useMemo, useRef })`';
|
20
20
|
}
|
21
|
-
var initialResult = [null, { complete: false, notfound: undefined, connected: true }];
|
21
|
+
var initialResult = [null, { complete: false, notfound: undefined, connected: true, destroyed: false }];
|
22
22
|
function useArSyncModel(request) {
|
23
23
|
var _a;
|
24
24
|
checkHooks();
|
@@ -33,13 +33,13 @@ function useArSyncModel(request) {
|
|
33
33
|
}
|
34
34
|
var model = new ArSyncModel_1.default(request, { immutable: true });
|
35
35
|
function update() {
|
36
|
-
var complete = model.complete, notfound = model.notfound, connected = model.connected, data = model.data;
|
36
|
+
var complete = model.complete, notfound = model.notfound, connected = model.connected, destroyed = model.destroyed, data = model.data;
|
37
37
|
setResult(function (resultWas) {
|
38
38
|
var dataWas = resultWas[0], statusWas = resultWas[1];
|
39
|
-
var statusPersisted = statusWas.complete === complete && statusWas.notfound === notfound && statusWas.connected === connected;
|
39
|
+
var statusPersisted = statusWas.complete === complete && statusWas.notfound === notfound && statusWas.connected === connected && statusWas.destroyed === destroyed;
|
40
40
|
if (dataWas === data && statusPersisted)
|
41
41
|
return resultWas;
|
42
|
-
var status = statusPersisted ? statusWas : { complete: complete, notfound: notfound, connected: connected };
|
42
|
+
var status = statusPersisted ? statusWas : { complete: complete, notfound: notfound, connected: connected, destroyed: destroyed };
|
43
43
|
return [data, status];
|
44
44
|
});
|
45
45
|
}
|
@@ -51,6 +51,7 @@ function useArSyncModel(request) {
|
|
51
51
|
}
|
52
52
|
model.subscribe('load', update);
|
53
53
|
model.subscribe('change', update);
|
54
|
+
model.subscribe('destroy', update);
|
54
55
|
model.subscribe('connection', update);
|
55
56
|
return function () { return model.release(); };
|
56
57
|
}, [requestString]);
|
data/gemfiles/Gemfile-rails-6
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in ar_sync.gemspec
|
6
|
-
gemspec path:
|
6
|
+
gemspec path: '..'
|
7
7
|
|
8
|
-
gem
|
8
|
+
gem 'sqlite3', '~> 1.4'
|
9
|
+
gem 'activerecord', '~> 6.0'
|
9
10
|
gem 'ar_serializer', github: 'tompng/ar_serializer'
|
@@ -1,9 +1,10 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in ar_sync.gemspec
|
6
|
-
gemspec path:
|
6
|
+
gemspec path: '..'
|
7
7
|
|
8
|
-
gem
|
8
|
+
gem 'sqlite3', '~> 1.4'
|
9
|
+
gem 'activerecord', '~> 7.0.0'
|
9
10
|
gem 'ar_serializer', github: 'tompng/ar_serializer'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
|
+
|
5
|
+
# Specify your gem's dependencies in ar_sync.gemspec
|
6
|
+
gemspec path: '..'
|
7
|
+
|
8
|
+
gem 'sqlite3', '~> 1.4'
|
9
|
+
gem 'activerecord', '~> 7.1.0'
|
10
|
+
gem 'ar_serializer', github: 'tompng/ar_serializer'
|
@@ -173,12 +173,8 @@ module ArSync::ModelBase::ClassMethods
|
|
173
173
|
|
174
174
|
_sync_define :id
|
175
175
|
|
176
|
-
_sync_define :sync_keys, type: [:string] do |current_user|
|
177
|
-
ArSync.sync_keys self, current_user
|
178
|
-
end
|
179
|
-
|
180
176
|
serializer_defaults namespace: :sync do |current_user|
|
181
|
-
{
|
177
|
+
{ _sync: _sync_field(current_user) }
|
182
178
|
end
|
183
179
|
|
184
180
|
after_initialize do
|
data/lib/ar_sync/core.rb
CHANGED
@@ -41,7 +41,7 @@ module ArSync
|
|
41
41
|
e = { action: action }
|
42
42
|
e[:field] = field if field
|
43
43
|
if model
|
44
|
-
e[:
|
44
|
+
e[:class] = model.class.base_class.name
|
45
45
|
e[:id] = model.id
|
46
46
|
end
|
47
47
|
event = ["#{key}#{path}", e]
|
@@ -53,10 +53,6 @@ module ArSync
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
def self.sync_keys(model, user)
|
57
|
-
[sync_key(model), sync_key(model, user)]
|
58
|
-
end
|
59
|
-
|
60
56
|
def self.sync_key(model, to_user = nil, signature: true)
|
61
57
|
if model.is_a? ArSync::Collection
|
62
58
|
key = [to_user&.id, model.klass.name, model.name].join '/'
|
@@ -91,7 +87,7 @@ module ArSync
|
|
91
87
|
serialized = ArSerializer.serialize target, query, context: user, use: :sync
|
92
88
|
return serialized if target.is_a? ArSync::ModelBase
|
93
89
|
{
|
94
|
-
|
90
|
+
_sync: { keys: [ArSync.sync_key(target), ArSync.sync_key(target, user)] },
|
95
91
|
ordering: target.ordering,
|
96
92
|
collection: serialized
|
97
93
|
}
|
@@ -1,7 +1,18 @@
|
|
1
1
|
module ArSync::ModelBase::InstanceMethods
|
2
|
+
def sync_keys(current_user)
|
3
|
+
[ArSync.sync_key(self), ArSync.sync_key(self, current_user)]
|
4
|
+
end
|
5
|
+
|
6
|
+
def _sync_field(current_user)
|
7
|
+
{ id:, keys: sync_keys(current_user) }
|
8
|
+
end
|
9
|
+
|
2
10
|
def _sync_notify(action)
|
3
11
|
_sync_notify_parent action
|
4
|
-
|
12
|
+
if self.class._sync_self?
|
13
|
+
_sync_notify_self if action == :update
|
14
|
+
_sync_notify_self_destroy if action == :destroy
|
15
|
+
end
|
5
16
|
end
|
6
17
|
|
7
18
|
def _sync_current_watch_values
|
@@ -121,4 +132,8 @@ module ArSync::ModelBase::InstanceMethods
|
|
121
132
|
end
|
122
133
|
ArSync.sync_send to: self, action: :update, model: self
|
123
134
|
end
|
135
|
+
|
136
|
+
def _sync_notify_self_destroy
|
137
|
+
ArSync.sync_send to: self, action: :destroy, path: :_destroy, model: nil
|
138
|
+
end
|
124
139
|
end
|
data/lib/ar_sync/version.rb
CHANGED
data/src/core/ArSyncModel.ts
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
import ArSyncStore from './ArSyncStore'
|
1
|
+
import { ArSyncStore, Request } from './ArSyncStore'
|
2
2
|
import ArSyncConnectionManager from './ConnectionManager'
|
3
3
|
import ConnectionAdapter from './ConnectionAdapter'
|
4
4
|
|
5
|
-
interface Request { api: string; query: any; params?: any }
|
6
5
|
type Path = Readonly<(string | number)[]>
|
7
6
|
interface Change { path: Path; value: any }
|
8
7
|
type ChangeCallback = (change: Change) => void
|
9
8
|
type LoadCallback = () => void
|
10
9
|
type ConnectionCallback = (status: boolean) => void
|
11
|
-
type SubscriptionType = 'load' | 'change' | 'connection'
|
10
|
+
type SubscriptionType = 'load' | 'change' | 'connection' | 'destroy'
|
12
11
|
type SubscriptionCallback = ChangeCallback | LoadCallback | ConnectionCallback
|
12
|
+
type ArSyncModelRef = { key: string; count: number; timer: number | null; model: ArSyncStore }
|
13
13
|
|
14
14
|
type PathFirst<P extends Readonly<any[]>> = ((...args: P) => void) extends (first: infer First, ...other: any) => void ? First : never
|
15
15
|
|
@@ -30,11 +30,12 @@ type DigResult<Data, P extends Readonly<any[]>> =
|
|
30
30
|
: undefined
|
31
31
|
|
32
32
|
export default class ArSyncModel<T> {
|
33
|
-
private _ref
|
33
|
+
private _ref: ArSyncModelRef
|
34
34
|
private _listenerSerial: number
|
35
35
|
private _listeners
|
36
|
-
complete
|
36
|
+
complete = false
|
37
37
|
notfound?: boolean
|
38
|
+
destroyed = false
|
38
39
|
connected: boolean
|
39
40
|
data: T | null
|
40
41
|
static _cache: { [key: string]: { key: string; count: number; timer: number | null; model } } = {}
|
@@ -43,16 +44,17 @@ export default class ArSyncModel<T> {
|
|
43
44
|
this._ref = ArSyncModel.retrieveRef(request, option)
|
44
45
|
this._listenerSerial = 0
|
45
46
|
this._listeners = {}
|
46
|
-
this.complete = false
|
47
47
|
this.connected = ArSyncStore.connectionManager.networkStatus
|
48
48
|
const setData = () => {
|
49
49
|
this.data = this._ref.model.data
|
50
50
|
this.complete = this._ref.model.complete
|
51
51
|
this.notfound = this._ref.model.notfound
|
52
|
+
this.destroyed = this._ref.model.destroyed
|
52
53
|
}
|
53
54
|
setData()
|
54
55
|
this.subscribe('load', setData)
|
55
56
|
this.subscribe('change', setData)
|
57
|
+
this.subscribe('destroy', setData)
|
56
58
|
this.subscribe('connection', (status: boolean) => {
|
57
59
|
this.connected = status
|
58
60
|
})
|
@@ -107,12 +109,11 @@ export default class ArSyncModel<T> {
|
|
107
109
|
for (const id in this._listeners) this._listeners[id].unsubscribe()
|
108
110
|
this._listeners = {}
|
109
111
|
ArSyncModel._detach(this._ref)
|
110
|
-
this._ref = null
|
111
112
|
}
|
112
113
|
static retrieveRef(
|
113
114
|
request: Request,
|
114
115
|
option?: { immutable: boolean }
|
115
|
-
):
|
116
|
+
): ArSyncModelRef {
|
116
117
|
const key = JSON.stringify([request, option])
|
117
118
|
let ref = this._cache[key]
|
118
119
|
if (!ref) {
|