@@ -9,6 +9,8 @@ import { Logger } from '@nestjs/common';
9
9
import { Server } from 'socket.io' ;
10
10
import { YSocketIO } from 'y-socket.io/dist/server' ;
11
11
import * as Y from 'yjs' ;
12
+ import { NodeService } from '../node/node.service' ;
13
+ import { NodeCacheService } from '../node-cache/node-cache.service' ;
12
14
13
15
@WebSocketGateway ( 1234 )
14
16
export class YjsService
@@ -17,6 +19,10 @@ export class YjsService
17
19
private logger = new Logger ( 'YjsGateway' ) ;
18
20
private ysocketio : YSocketIO ;
19
21
22
+ constructor (
23
+ private readonly nodeService : NodeService ,
24
+ private readonly nodeCacheService : NodeCacheService ,
25
+ ) { }
20
26
@WebSocketServer ( )
21
27
server : Server ;
22
28
@@ -32,20 +38,36 @@ export class YjsService
32
38
33
39
this . ysocketio . initialize ( ) ;
34
40
41
+ this . ysocketio . on ( 'document-update' , ( doc : Y . Doc ) => {
42
+ // console.log(doc.get("content").doc.share.get("content"));
43
+ // console.log(doc.share.get('default'));
44
+ } ) ;
45
+
35
46
this . ysocketio . on ( 'document-loaded' , ( doc : Y . Doc ) => {
36
- this . logger . log ( `Document loaded: ${ doc . guid } ` ) ;
47
+ doc . on ( 'update' , ( ) => {
48
+ const nodes = Object . values ( doc . getMap ( 'nodes' ) . toJSON ( ) ) ;
49
+
50
+ // 모든 노드에 대해 검사한다.
51
+ nodes . forEach ( ( node ) => {
52
+ const { title, id } = node . data ;
53
+ const { x, y } = node . position ;
54
+ // 만약 캐쉬에 노드가 존재하지 않다면 갱신 후 캐쉬에 노드를 넣는다.
55
+ if ( ! this . nodeCacheService . has ( id ) ) {
56
+ console . log ( id ) ;
57
+ this . nodeService . updateNode ( id , { title, x, y } ) ;
58
+ this . nodeCacheService . set ( id , title ) ;
59
+ return ;
60
+ }
37
61
38
- const titleMap = doc . getMap ( 'title' ) ;
39
- titleMap . observe ( ( ) => {
40
- console . log ( titleMap . toString ( ) ) ;
62
+ // 만약 캐쉬에 노드가 존재하고 title이 다르다면 갱신한다.
63
+ if ( ! this . nodeCacheService . hasSameTitle ( id , title ) ) {
64
+ this . nodeService . updateNode ( id , { title, x, y } ) ;
65
+ this . nodeCacheService . set ( id , title ) ;
66
+ return ;
67
+ }
68
+ // 만약 캐쉬에 노드가 존재하고 title이 동일하다면 패스한다.
69
+ } ) ;
41
70
} ) ;
42
- // const toggleMap = doc.getMap('toggleMap');
43
- // toggleMap.observe(() => {
44
- // const toggleState = toggleMap.get('toggle') || false;
45
- // this.logger.log('🐰 토글 상태 변경', {
46
- // toggleState,
47
- // });
48
- // });
49
71
} ) ;
50
72
}
51
73
0 commit comments