ar_sync 1.1.0 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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 +112 -112
- 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/rails.rb +14 -17
- data/lib/ar_sync/version.rb +1 -1
- data/src/core/ArSyncModel.ts +9 -8
- data/src/core/ArSyncStore.ts +128 -121
- data/src/core/hooks.ts +6 -5
- metadata +5 -19
- data/Gemfile.lock +0 -54
@@ -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/rails.rb
CHANGED
@@ -47,8 +47,8 @@ module ArSync
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def sync_call
|
50
|
-
_api_call :sync do |
|
51
|
-
ArSync.sync_serialize
|
50
|
+
_api_call :sync do |schema, current_user, query|
|
51
|
+
ArSync.sync_serialize schema, current_user, query
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -69,15 +69,8 @@ module ArSync
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def static_call
|
72
|
-
_api_call :static do |
|
73
|
-
|
74
|
-
when ArSync::Collection, ActiveRecord::Relation, Array
|
75
|
-
ArSerializer.serialize model.to_a, query, context: current_user
|
76
|
-
when ArSerializer::Serializable
|
77
|
-
ArSerializer.serialize model, query, context: current_user
|
78
|
-
else
|
79
|
-
model
|
80
|
-
end
|
72
|
+
_api_call :static do |schema, current_user, query|
|
73
|
+
ArSerializer.serialize schema, query, context: current_user
|
81
74
|
end
|
82
75
|
end
|
83
76
|
|
@@ -87,15 +80,19 @@ module ArSync
|
|
87
80
|
if respond_to?(ArSync.config.current_user_method)
|
88
81
|
current_user = send ArSync.config.current_user_method
|
89
82
|
end
|
83
|
+
sch = schema
|
90
84
|
responses = params[:requests].map do |request|
|
91
85
|
begin
|
92
86
|
api_name = request[:api]
|
93
|
-
sch
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
87
|
+
raise ArSync::ApiNotFound, "#{type.to_s.capitalize} API named `#{api_name}` not configured" unless sch.class._serializer_field_info api_name
|
88
|
+
query = {
|
89
|
+
api_name => {
|
90
|
+
as: :data,
|
91
|
+
params: request[:params].as_json,
|
92
|
+
attributes: request[:query].as_json
|
93
|
+
}
|
94
|
+
}
|
95
|
+
yield schema, current_user, query
|
99
96
|
rescue StandardError => e
|
100
97
|
{ error: handle_exception(e) }
|
101
98
|
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) {
|