Skip to content

Commit dd52f56

Browse files
committed
1 parent e73af55 commit dd52f56

5 files changed

Lines changed: 109 additions & 69 deletions

File tree

polycode/context.go

Lines changed: 22 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ package polycode
22

33
import (
44
"context"
5-
"fmt"
65
"time"
76
)
87

8+
type AuthContext struct {
9+
claims map[string]interface{}
10+
}
11+
912
type BaseContext interface {
1013
context.Context
1114
Meta() ContextMeta
1215
AppConfig() AppConfig
16+
AuthContext() AuthContext
1317
Logger() Logger
1418
}
1519

@@ -30,10 +34,8 @@ type WorkflowContext interface {
3034
ControllerEx(envId string, controller string) RemoteController
3135
UnsafeDb() *UnsafeDataStoreBuilder
3236
Memo(getter func() (any, error)) Response
33-
SignalAwait(signalName string) Response
34-
SignalResumeSuccess(taskId string, signalName string, data any) error
35-
SignalResumeError(taskId string, signalName string, err Error) error
36-
EmitRealtimeEvent(channel string, data any) error
37+
Signal(signalName string) Signal
38+
RealtimeChannel(channelName string) RealtimeChannel
3739
}
3840

3941
type ApiContext interface {
@@ -54,12 +56,17 @@ type ContextImpl struct {
5456
serviceClient *ServiceClient
5557
logger Logger
5658
meta ContextMeta
59+
authCtx AuthContext
5760
}
5861

5962
func (s ContextImpl) Meta() ContextMeta {
6063
return s.meta
6164
}
6265

66+
func (s ContextImpl) AuthContext() AuthContext {
67+
return s.authCtx
68+
}
69+
6370
func (s ContextImpl) AppConfig() AppConfig {
6471
return s.config
6572
}
@@ -135,62 +142,20 @@ func (s ContextImpl) Logger() Logger {
135142
return s.logger
136143
}
137144

138-
func (s ContextImpl) Acknowledge() error {
139-
return s.serviceClient.Acknowledge(s.sessionId)
140-
}
141-
142-
func (s ContextImpl) SignalAwait(signalName string) Response {
143-
req := SignalWaitRequest{
144-
SignalName: signalName,
145-
}
146-
147-
output, err := s.serviceClient.WaitForSignal(s.sessionId, req)
148-
if err != nil {
149-
fmt.Printf("client: signal await error: %v\n", err)
150-
return Response{
151-
output: nil,
152-
isError: true,
153-
error: ErrTaskExecError.Wrap(err),
154-
}
155-
}
156-
157-
fmt.Printf("client: signal await output: %v\n", output)
158-
return Response{
159-
output: output.Output,
160-
isError: output.IsError,
161-
error: output.Error,
145+
func (s ContextImpl) Signal(signalName string) Signal {
146+
return Signal{
147+
name: signalName,
148+
sessionId: s.sessionId,
149+
serviceClient: s.serviceClient,
162150
}
163151
}
164152

165-
func (s ContextImpl) SignalResumeSuccess(taskId string, signalName string, data any) error {
166-
req := SignalEmitRequest{
167-
TaskId: taskId,
168-
SignalName: signalName,
169-
Output: data,
170-
IsError: false,
153+
func (s ContextImpl) RealtimeChannel(channelName string) RealtimeChannel {
154+
return RealtimeChannel{
155+
name: channelName,
156+
sessionId: s.sessionId,
157+
serviceClient: s.serviceClient,
171158
}
172-
173-
return s.serviceClient.EmitSignal(s.sessionId, req)
174-
}
175-
176-
func (s ContextImpl) SignalResumeError(taskId string, signalName string, err Error) error {
177-
req := SignalEmitRequest{
178-
TaskId: taskId,
179-
SignalName: signalName,
180-
IsError: true,
181-
Error: err,
182-
}
183-
184-
return s.serviceClient.EmitSignal(s.sessionId, req)
185-
}
186-
187-
func (s ContextImpl) EmitRealtimeEvent(channel string, data any) error {
188-
req := RealtimeEventEmitRequest{
189-
Channel: channel,
190-
Input: data,
191-
}
192-
193-
return s.serviceClient.EmitRealtimeEvent(s.sessionId, req)
194159
}
195160

196161
func (s ContextImpl) Counter(group string, name string, ttl int64) Counter {

polycode/model.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,20 @@ func (t TaskOptions) WithTimeout(timeout time.Duration) TaskOptions {
2323
}
2424

2525
type MethodStartEvent struct {
26-
SessionId string `json:"sessionId"`
27-
Method string `json:"method"`
28-
Meta ContextMeta `json:"meta"`
29-
Input any `json:"input"`
26+
SessionId string `json:"sessionId"`
27+
Method string `json:"method"`
28+
Meta ContextMeta `json:"meta"`
29+
AuthContext AuthContext `json:"authContext"`
30+
Input any `json:"input"`
3031
}
3132

3233
type ServiceStartEvent struct {
33-
SessionId string `json:"sessionId"`
34-
Service string `json:"service"`
35-
Method string `json:"method"`
36-
Meta ContextMeta `json:"meta"`
37-
Input any `json:"input"`
34+
SessionId string `json:"sessionId"`
35+
Service string `json:"service"`
36+
Method string `json:"method"`
37+
Meta ContextMeta `json:"meta"`
38+
AuthContext AuthContext `json:"authContext"`
39+
Input any `json:"input"`
3840
}
3941

4042
type ServiceMeta struct {
@@ -51,9 +53,10 @@ type ServiceCompleteEvent struct {
5153
}
5254

5355
type ApiStartEvent struct {
54-
SessionId string `json:"sessionId"`
55-
Meta ContextMeta `json:"meta"`
56-
Request ApiRequest `json:"request"`
56+
SessionId string `json:"sessionId"`
57+
Meta ContextMeta `json:"meta"`
58+
AuthContext AuthContext `json:"authContext"`
59+
Request ApiRequest `json:"request"`
5760
}
5861

5962
type ApiCompleteEvent struct {

polycode/realtimechannel.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package polycode
2+
3+
type RealtimeChannel struct {
4+
name string
5+
sessionId string
6+
serviceClient *ServiceClient
7+
}
8+
9+
func (r RealtimeChannel) Emit(data any) error {
10+
req := RealtimeEventEmitRequest{
11+
Channel: r.name,
12+
Input: data,
13+
}
14+
15+
return r.serviceClient.EmitRealtimeEvent(r.sessionId, req)
16+
}

polycode/runtime.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ func runService(ctx context.Context, taskLogger Logger, event ServiceStartEvent)
211211
serviceClient: serviceClient,
212212
logger: taskLogger,
213213
meta: event.Meta,
214+
authCtx: event.AuthContext,
214215
}
215216

216217
var ret any
@@ -305,6 +306,7 @@ func runApi(ctx context.Context, taskLogger Logger, event ApiStartEvent) (evt Ap
305306
serviceClient: serviceClient,
306307
logger: taskLogger,
307308
meta: event.Meta,
309+
authCtx: event.AuthContext,
308310
}
309311

310312
newCtx := context.WithValue(ctx, "polycode.context", ctxImpl)

polycode/signal.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package polycode
2+
3+
import "fmt"
4+
5+
type Signal struct {
6+
name string
7+
sessionId string
8+
serviceClient *ServiceClient
9+
}
10+
11+
func (s *Signal) Await() Response {
12+
req := SignalWaitRequest{
13+
SignalName: s.name,
14+
}
15+
16+
output, err := s.serviceClient.WaitForSignal(s.sessionId, req)
17+
if err != nil {
18+
fmt.Printf("client: signal await error: %v\n", err)
19+
return Response{
20+
output: nil,
21+
isError: true,
22+
error: ErrTaskExecError.Wrap(err),
23+
}
24+
}
25+
26+
fmt.Printf("client: signal await output: %v\n", output)
27+
return Response{
28+
output: output.Output,
29+
isError: output.IsError,
30+
error: output.Error,
31+
}
32+
}
33+
34+
func (s *Signal) EmitValue(taskId string, data any) error {
35+
req := SignalEmitRequest{
36+
TaskId: taskId,
37+
SignalName: s.name,
38+
Output: data,
39+
IsError: false,
40+
}
41+
42+
return s.serviceClient.EmitSignal(s.sessionId, req)
43+
}
44+
45+
func (s *Signal) EmitError(taskId string, err Error) error {
46+
req := SignalEmitRequest{
47+
TaskId: taskId,
48+
SignalName: s.name,
49+
IsError: true,
50+
Error: err,
51+
}
52+
53+
return s.serviceClient.EmitSignal(s.sessionId, req)
54+
}

0 commit comments

Comments
 (0)