override fun init()

in rd-kt/rd-framework/src/main/kotlin/com/jetbrains/rd/framework/impl/RdMap.kt [83:139]


    override fun init(lifetime: Lifetime, proto: IProtocol, ctx: SerializationCtx) {
        super.init(lifetime, proto, ctx)

        if (!optimizeNested) {
            change.advise(lifetime) {
                if (isLocalChange) {
                    val definitions = tryGetBindDefinitions(lifetime) ?: return@advise

                    if (it !is IViewableMap.Event.Add)
                        definitions[it.key]?.terminate()

                    if (it is IViewableMap.Event.Remove)
                        definitions.remove(it.key)

                    if (it !is IViewableMap.Event.Remove) {
                        val value = it.newValueOpt
                        value.identifyPolymorphic(proto.identity, proto.identity.next(rdid))
                        val definition = tryPreBindValue(lifetime, it.key, value, false)
                        definitions.put(it.key, definition)?.terminate()
                    }
                }
            }
        }

        localChange { advise(lifetime) lambda@{
            if (!isLocalChange) return@lambda

            proto.wire.send(rdid) { buffer ->
                val versionedFlag = (if (master) 1 else 0) shl versionedFlagShift
                val op = when (it) {
                    is IViewableMap.Event.Add ->    Op.Add
                    is IViewableMap.Event.Update -> Op.Update
                    is IViewableMap.Event.Remove -> Op.Remove
                }
                buffer.writeInt(versionedFlag or op.ordinal)

                val version = if (master) ++nextVersion else 0L

                if (master) {
                    Sync.lock(pendingForAck) {
                        pendingForAck.put(it.key, version)
                    }

                    buffer.writeLong(version)
                }

                keySzr.write(ctx, buffer, it.key)

                it.newValueOpt?.let { valSzr.write(ctx, buffer, it) }

                logSend.trace { logmsg(op, version, it.key, it.newValueOpt) }
            }

            if (!optimizeNested)
                it.newValueOpt.bindPolymorphic()
        }}
    }