Skip to content

Commit

Permalink
feat: support term port
Browse files Browse the repository at this point in the history
  • Loading branch information
siyul-park committed Nov 2, 2024
1 parent 52660a8 commit ea41a47
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 20 deletions.
11 changes: 6 additions & 5 deletions docs/key_concepts.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
15 changes: 8 additions & 7 deletions docs/key_concepts_kr.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]`과 같이 표기합니다.

## 패킷

Expand Down
1 change: 1 addition & 0 deletions pkg/node/port.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
// Commonly used port names.
const (
PortInit = "init"
PortTerm = "term"
PortIO = "io"
PortIn = "in"
PortOut = "out"
Expand Down
17 changes: 9 additions & 8 deletions pkg/symbol/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand Down Expand Up @@ -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)
}
}
}
Expand Down

0 comments on commit ea41a47

Please sign in to comment.