diff --git a/docs/key_concepts.md b/docs/key_concepts.md index 8ae67a05..23cb7cf3 100644 --- a/docs/key_concepts.md +++ b/docs/key_concepts.md @@ -107,11 +107,12 @@ Nodes are classified based on how they process packets: Ports are connection points for sending and receiving packets between nodes. There are two types of ports: `InPort` and `OutPort`, and packets are transmitted by connecting them. A packet sent to one port is forwarded to all connected ports. Commonly used port names include: -- `init`: A special port used to initialize nodes. When the node becomes available, the workflow connected to the `init` port executes. -- `io`: Processes packets and returns them immediately. -- `in`: Receives packets for processing and sends the results to `out` or `error`. If there are no connected `out` or `error` ports, the result is returned directly. -- `out`: Sends processed packets. The transmitted result can be sent to other `in` ports. -- `error`: Sends errors encountered during packet processing. Error handling results can be sent back to an `in` port. +- **`init`**: A special port used to initialize nodes. When a node becomes available, the workflow connected to the `init` port is executed. +- **`term`**: A special port used to terminate nodes. The workflow connected to the `term` port is executed when the node is being deactivated. +- **`io`**: Processes packets and immediately returns the results. +- **`in`**: Receives packets for processing and sends the results to the `out` or `error` ports. If there are no connected `out` or `error` ports, the result is returned directly. +- **`out`**: Sends processed packets. The transmitted results can be sent to other `in` ports. +- **`error`**: Sends errors encountered during packet processing. The results of error handling can be sent back to an `in` port. When multiple ports with the same role are needed, they are expressed as `in[0]`, `in[1]`, `out[0]`, `out[1]`, etc. diff --git a/docs/key_concepts_kr.md b/docs/key_concepts_kr.md index d0d995ee..8001f0be 100644 --- a/docs/key_concepts_kr.md +++ b/docs/key_concepts_kr.md @@ -107,13 +107,14 @@ env: 포트는 노드 간에 패킷을 주고받는 연결 지점입니다. 포트에는 `InPort`와 `OutPort` 두 가지 종류가 있으며, 이들을 연결하여 패킷을 전송합니다. 한 포트로 전송된 패킷은 모든 연결된 포트로 전달됩니다. 일반적으로 사용되는 포트 이름은 다음과 같습니다: -- `init`: 노드를 초기화하는 데 사용되는 특수 포트입니다. 노드가 사용 가능해지면 `init` 포트에 연결된 워크플로우가 실행됩니다. -- `io`: 패킷을 처리하고 즉시 반환합니다. -- `in`: 패킷을 입력받아 처리하고, 처리 결과를 `out`이나 `error`로 전송합니다. 연결된 `out`이나 `error` 포트가 없으면 결과를 반환합니다. -- `out`: 처리된 패킷을 전송합니다. 전송된 결과는 다른 `in` 포트로 다시 전송될 수 있습니다. -- `error`: 패킷 처리 중 발생한 오류를 전송합니다. 오류 처리 결과는 `in` 포트로 다시 전송될 수 있습니다. - -동일한 역할을 하는 여러 포트가 필요할 때는 `in[0]`, `in[1]`, `out[0]`, `out[1]`과 같이 표현합니다. +- **`init`**: 노드를 초기화하는 데 사용되는 특수 포트입니다. 노드가 활성화될 때 `init` 포트에 연결된 워크플로우가 실행됩니다. +- **`term`**: 노드를 종료하는 데 사용되는 특수 포트입니다. 노드가 비활성화될 때 `term` 포트에 연결된 워크플로우가 실행됩니다. +- **`io`**: 패킷을 처리하고 즉시 반환합니다. +- **`in`**: 패킷을 입력받아 처리하며, 처리 결과를 `out` 또는 `error`로 전송합니다. 연결된 `out`이나 `error` 포트가 없을 경우, 결과를 즉시 반환합니다. +- **`out`**: 처리된 패킷을 전송합니다. 전송된 결과는 다른 `in` 포트로 전달될 수 있습니다. +- **`error`**: 패킷 처리 중 발생한 오류를 전송합니다. 오류 처리 결과는 `in` 포트로 다시 전달될 수 있습니다. + +동일한 역할을 하는 여러 포트가 필요할 경우, `in[0]`, `in[1]`, `out[0]`, `out[1]`과 같이 표기합니다. ## 패킷 diff --git a/pkg/node/port.go b/pkg/node/port.go index ba7ec066..7a588a99 100644 --- a/pkg/node/port.go +++ b/pkg/node/port.go @@ -9,6 +9,7 @@ import ( // Commonly used port names. const ( PortInit = "init" + PortTerm = "term" PortIO = "io" PortIn = "in" PortOut = "out" diff --git a/pkg/symbol/table.go b/pkg/symbol/table.go index d4f0710c..b821d316 100644 --- a/pkg/symbol/table.go +++ b/pkg/symbol/table.go @@ -150,7 +150,7 @@ func (t *Table) load(sb *Symbol) error { linked := t.linked(sb) for _, sb := range linked { if t.active(sb) { - if err := t.init(sb); err != nil { + if err := t.call(sb, node.PortInit); err != nil { return err } if err := t.loadHooks.Load(sb); err != nil { @@ -169,6 +169,9 @@ func (t *Table) unload(sb *Symbol) error { if err := t.unloadHooks.Unload(sb); err != nil { return err } + if err := t.call(sb, node.PortTerm); err != nil { + return err + } } } return nil @@ -336,22 +339,20 @@ func (t *Table) active(sb *Symbol) bool { return true } -func (t *Table) init(sb *Symbol) error { +func (t *Table) call(sb *Symbol, name string) error { out := port.NewOut() defer out.Close() ports := sb.Ports() - for _, port := range ports[node.PortInit] { + for _, port := range ports[name] { id := port.ID if id == uuid.Nil { id = t.lookup(sb.Namespace(), port.Name) } - if ref, ok := t.symbols[id]; ok { - if ref.Namespace() == sb.Namespace() { - if in := ref.In(port.Port); in != nil { - out.Link(in) - } + if ref, ok := t.symbols[id]; ok && ref.Namespace() == sb.Namespace() { + if in := ref.In(port.Port); in != nil { + out.Link(in) } } }