►
From YouTube: Elsa Workflows Community Meeting 28
Description
Topics
- Multitenancy
- HTTP Request activities
- Workflow contexts, create sample application
A
C
You
don't
have
to
the
microphone,
not
not
worth
sorry
for
why
you
had
English,
okay
and.
C
A
That's
great
well
you're
welcome
on
the
on
the
meeting
good
that
you
can
join
so
the
way
this
works
at
the
start
of
the
meeting.
We
come
up
with
topics
for
discussion
or
little
demos
that
we
have
prepared
or
just
think
of
on
the
Fly
and,
of
course,
if
there's
any
questions
or
if
you
have
a
request
to
look
into
some
topic
that
fits
within
this
one
hour
of
the
meeting
that
that
will
be
good
to
add
to
the
agenda.
A
So
if
you
have
anything
in
mind,
please
let
me
know.
For
the
past
week
myself
I've
been
busy
debugging
making
the
core
engine
and
the
design
are
more
stable.
As
we've
seen
during
the
last
community
meeting
yeah,
there
were
a
couple
of
issues
identified
during
the
meeting,
which
was
fun
and
last
week,
I
demonstrated
the
these
topics
here.
So
we
talked
about
the
flow
HP
request,
improved
Json
handling
for
sap
workflows
by
that
I
mean
let's
say
you
have
an
HP
endpoint
on
your
workflow.
You
receive
some
Json
payloads.
A
You
want
to
be
able
to
treat
it
as
actual
Json,
but
of
course,
what
else
and
using
jint,
which
is
a
net
interpreter
for
JavaScript
syntax.
You
also
have
to
deal
with
net
types,
so
sometimes
it
could
be
confusing
and
there
were
a
few
bugs
as
well,
so
those
have
been
fixed
there.
A
We
also
looked
at
improved
parent-child
communication
or
you
know,
being
able
to
pass
data
into
sub
workflows
and
being
able
to
communicate
it
back,
which
is
something
maybe
we
can
reiterate,
because
there
were
some
issues
when
I
did
the
demo
and
since
you're
just
joined
for
the
first
time
or
yeah.
Maybe
it's
interesting
for
you
as
well
since
you're,
since
you
mentioned
an
interest
in
lsf3
and
then
and
during
the
session,
if
any
questions
come
up
or
topics,
please
let
me
know.
A
All
right,
then,
we
don't
have
to
reiterate:
that's
yeah.
Well,
that's
great
all
right!
So
if
you
guys
think
of
something,
let
me
know
if
not
so
I'll
just
start
looking
at
the
commit
history,
maybe
something
of
Interest
comes
to
mind
you
actually
or
actually
this
meeting
I
I
almost
forgot
about
it
and
I
was
in
the
middle
of
working
on
the
following.
A
A
I
can
show
you
the
input
and
output
properties.
Just
let
me
start
the
engine
all
right
that
started.
Let
me
refresh
so
here
there's
a
workflow
called
get
sign
of
number,
and
the
idea
is
that
this
this
workflow
will
accept
some
inputs,
some
number
and
it
will
return
the
sign
of
the
number.
So
that's,
either
positive
or
negative,
so
positive,
being
0
or
greater
and
negative
anything
below
zero
and
also
as
a
as
a
test.
A
So
this
is
just
to
showcase
the
set
workflow
output
activity
to
set
the
output
here.
So
it's
an
activity
and
you
can
configure
it
by
selecting
the
available
outputs.
So
so
this
list
is
populated
from
whatever
you
have
here
and
here
you
can
provide
an
expression
to
provide
the
value
for
the
output,
and
this
value
then
becomes
available
to
the
workflow
using
this
this
this
activity
yeah,
so
any
in
any
case.
A
So
we
went
over
this
during
the
last
meeting
and
while
I'm
implementing
this
for
customer
there's,
there's
a
an
issue
with
the
input
and
the
way
it's
implemented.
So
if
you
use
it
in
a
very
simple
way
like
I'm
doing
here,
actually
this
is
actually
the
culprit.
Let
me
move
this
away
for
a
second,
let's
say:
use
it
like
this,
then
there's
no
problem.
All
of
the
activities
can
just
access
the
inputs
by
using
JavaScript
in
this
format.
So
if
you
have
an
input,
called
number
request,
a
value
using
the
function
get
number.
A
B
A
Dynamic
configured
so
the
gene
run,
the
gene
engine
is
configured
dynamically
with
available
functions.
I
can
actually
show
you
real
quick,
so
this
is
how
it
works.
So
here
we
have
agent
engine.
So
this
is
a
JavaScript
interpreter,
and
here
you
can
see
we
can
just
set
the
values
on
it,
so
that
works
by
setting
a
key
and
a
value,
and
that,
if
you
put
in
a
a
Lambda
or
delegate
I
mean
this
is
this
is
what
gets
executed
when
you
invoke
this
as
a
function.
So.
B
B
Yeah
ID
back
this
week
down
to
the
chint
debugger,
because
I
I
need
to
understand
the
functionality
behind
it
because
I
added
dynamically
inputs
and
output
values
and
need
to
know
when
to
get
it
the
literal
or
at
the
JavaScript
way.
And
but
but
it's
a
little
bit
different
in
LS3
as
in
as
A2.
But
that's
fine,
good
yeah.
A
For
sure
there
there's
a
few
differences,
yeah,
so
yeah,
then
you're
familiar
a
little
bit
with
the
engine,
yeah
good
yeah.
So
so
that's
dynamically
made
available.
The
issue
is:
whenever
this
the
workflow
gets
suspended
and
goes
out
of
memory,
then
these
inputs
would
be
re-evaluated,
but
if,
if
you
go
one
level
deeper
I,
don't
quite
fully
understand
to
be
honest,
the
the
actual
issue,
but
you
basically
don't
have
access
anymore
to
the
outer
context.
And
so
what
would
happen
is
whatever
value
is
set
to
this
input.
A
So,
for
example,
going
back
to
the
consumer
here-
and
let's
say
this
is
not
a
literal
but
a
actual
expression
or
in
fact
this
is
an
expression,
because
it's
a
JavaScript,
this
expression
would
be
re-evaluated
right
before
the
inputs
are
evaluated
of
the
composite
activity
and
if,
if
there's
too
many
levels,
then
it
doesn't
have
all
of
the
context,
so
that
would
then
well
basically
break
the
inputs.
It
would
not
be
able
to
to
find
the
the
requested
input.
A
So
it's
it's
very
buggy
at
this
moment
and
and
that's
what
I'm
fixing
and
the
way
to
fix
it
is
to
Simply
copy.
The
whatever
input
is
provided
so
as
soon
as
this
activity
gets
scheduled
for
Execution.
At
that
point,
its
inputs
should
be
evaluated
like
with
any
other
activity.
So
that's
the
same
way.
It
works
with
with
these
non-composite
activities,
those
inputs
get
evaluated
once
and
then
they
are
available
to
the
activity.
A
The
difference,
of
course,
between
a
composite
activity
like
that
sign
of
number,
is
that
it
can
potentially
be
long
running
so
it
has
its
own.
It
is.
It
is
its
own
State
machine
as
compared
to
others
like
ASP
response
request.
They
don't
they
are
not
long
running.
They
just
perform
some
functionality
in
C,
sharp
and
then
they're
done.
So
that's
a
very
short-lived
context.
A
If
you
will-
and
this
is
long
lived
so
that
makes
it
a
little
bit
complicated,
but
to
fix
that
is
just
to
evaluate
the
inputs
right
before
this
gets
evaluated,
as
is
with
the
other
activities
and
then
stored
in
local
variables,
local
to
this
activity,
and
then
those
evaluated
values
are
available
as
long
as
the
instance
of
this
activity
lives.
So
so
that's
what
that's
currently
my
focus.
A
It's
it's
an
important
fix
when
you
actually
use
this
this
feature
with
the
sub
workflows
or
composite
activities.
Yeah
you
would
get.
You
would
otherwise
run
into
troubles
pretty
quick.
So
it's
important
to
fix
and
another
issue
that
I
will
work
on
right
after
is
scoping
right
now.
These
variables
that
you
see
here
they
are
Global
in
scope
and
that's
also
the
case.
A
If
you
go
into
a
sub
workflow,
like
the
get
sign
of
number
all
of
its
variables,
if
you
were
to
declare
a
variable
that
has
the
same
name
as
the
variable
in
the
parent
workflow
one
or
the
other
would
overwrite
one
or
the
other,
depending
on
which
one
gets
evaluated
first,
which
obviously,
is
it's
a
a
big
problem?
Because
now
you
have
to
make
sure
you
don't
use
duplicate
names,
but
you
shouldn't
have
to
worry
about
that.
A
It
should
be
just
like
in
C
sharp
when
you
have
different
Scopes
nested
Scopes
should
should
be
able
to
see
variables
from
Outer
Scopes,
but
not
the
other
way
around,
and
that's
how
it's
going
to
work
here
as
well.
Nice
yeah,
so
that
level
of
isolation
is
gonna,
make
it
make
it
much
better,
and
that
also
brings
us
much
closer
to
being
able
to
provide
a
or
doing
a
proper,
stable
release,
even
though
it
won't
be
feature
complete
without
two
as
of
yet
but
at
the
very
least,
it
will
be
useful
and
yeah.
A
B
A
You
for
asking
me,
because
that's
that's
something
I
would
like
to
demo
it's
new
features
since
last
week
and
let's
create
a
new
workflow.
So
there's
two
two
HP
requests,
there's
ASP
requests
and
there's
flow.
Eight
speed
request.
So
let's
talk
about
this
one
first
and
then
I'll
also
explain
this
one
so
forget
about
the
word
flow
for
a
second.
Just
just
know
that
this
is
an
8
speed,
request
activity
and
what
it
allows
you
to
do
is
make
a
HTTP
call
to
some
endpoint.
A
So
let's
say
request
here:
this
is
let's
imagine
this
is
our
backend
to
get
user
information
so
I'll
copy.
Just
this
URL.
D
A
A
So
actually,
let's
test
the
ladder,
that's
a
better,
better
use
a
better
example.
Let's
say
we
do
post
so
there's
two
versions
of
post,
one
that
will
return
successful,
which
is
200
and
one
version
will
return.
400
unsuccessful,
and
that's
that
happens
whenever
you
forget
to
provide
a
password,
for
example.
So
so
let's
say
we
want
to
make
this
API
call
so
we're
gonna
register.
A
So
we'll
use
this.
It
will
be
post
request
and
here
will
provide
some
some
Json,
so
we'll
say
or
actually
this
is
a
return
now
as
a
JavaScript
object
which
will
be
serializing
to
a
string.
You
should
be
able
to
also
just
provide
a
string,
Json
string
directly,
but
I
didn't
test
it
and
I'm
afraid
to
try
it
right
now.
So
let
me
just
do
it
like
this,
because
this
has
to
be
tested.
A
So
let's
say
we
want
to
send
this
payload
all
right,
so
this
will
return
200,
we
know,
but
we're
also
going
to
be
potentially
receiving
a
400
response
and
that's
where
the
expected
status
codes
come
in.
So
let
me
first
tell
you
how
you
would
deal
with
the
potential
response
before
we
added
this
field.
So
if
you
forget
about
this
for
a
second,
the
way
to
do
it
is
you
would
look
at
the
outputs
and
then
you
would
capture
the
HP
response
into
a
variable.
A
Let's
do
that
it
will
be
of
type
HP
response,
I'm
putting
these
stories
as
memory,
because
I
know
that
the
XP
response
is
not
serializable.
The
future
will
make
this
easier
to
automatically
hint
or
even
disable
storage
providers
that
aren't
supported
for
given
a
certain
data
types.
But
for
now
you
have
to
be
very
conscious
what
storage
mechanism
you
need
to
use
based
on
the
type
that
you're
gonna
store
in
a
variable,
because
these
variables
are
always
going
to
be
persisted
and
the
assistance
provider
depends
on
the
the
storage
driver
selected
here
Okay.
A
Let's
say:
if
responses
that
is
code
I
believe
is
the
name
the
intellisense
is
broken
because
because
of
a
small
bug,
I
think
if
I
refresh
it
should
work
so
I
think
yeah
Status
codes.
So
if
it's
200,
then
we
know
it's
okay.
So
this
is
what
you
would
do
before
this
change
that
I'm
about
to
show-
and
here
of
course
you
would
say-
is
hundreds
okay,
something
like
that
and
then
based
on
the
you
could
continue
this
way
or
this
way.
A
But
this
is
this
extra
step
is
now
in
unnecessary
because
you
could
do
it
easier
with
the
expected
status
code.
So
here
you
could
say
I'm
expecting
200,
but
also
400s,
and
maybe
even
two
or
one
in
case.
You
want
to
distinguish
between
these
two
and
any
number
you
like,
based
on
this
inputs,
you
will
get
this
additional
ports
on
on
your
activity.
So,
instead
of
going
through
this
flow
decision,
you
can
now
directly
connect
the
next
activity.
So
it's
a
little
bit
easier
to
to
work
with.
A
So
that's
the
idea
here,
yeah,
it's
pretty
good.
It
also
has
an
element
status
code.
So
if
you
want
to
handle
any
unexpected
code,
you
you
can
do
that
as
well.
Of
course,
like.
C
This
it's
possible
to
disable
the
default
output
of
unexpected
status
codes.
A
No,
it's
well
not
the
way
it's
implemented
now,
but
if,
if
you
think
that's
a
useful
feature
to
have,
then
we
can
absolutely
configure
it
it's
flexible
enough
to
to
be
able
to
implement
that
functionality.
So
so
we
could
have
a
checkbox
somewhere
that
that
either
enables
or
disables
Ahmed
status
code.
That's
that
could
be
a
good
enhancement
actually,
but.
A
Will
always
be
there,
but
if
again,
if
you,
if
you
think
it's
it's
good
to
be
able
to
hide
this
or
you
know
not
support
it
optionally,
then
then
maybe
we
should
consider
that
okay.
B
C
To
have
more
clean
designer
or
okay.
B
A
Yeah
to
be
clear,
if
if
if
this
is
not
here
and
the
response
is
none
of
these
expected
status
codes,
the
the
activity
will
just
end,
but
if
there's
no
other
additional
activity
to
execute
the
entire
workflow
will
end
depending
on,
if
you
have
branches,
of
course,
but
in
this
specific
example,
this
workflow
would
just
end
immediately,
so
it
would
not
go
to
any
of
these.
Obviously,
but
just
end
yes,
yes,
yeah,
it's!
Okay,
all
right
all
right
good!
A
So
now
that
we
have
seen
this
one,
we
can
look
at
the
other
one
and
that's
HP
request
with
the
lmat
status
code
and
this
both
activities,
HP
requests
and
flow.
Eight
speed
request
they
inherit
from
the
same
Base
Class,
but
the
difference
is
well.
First
of
all,
I
don't
see
the
setting
anymore.
Let
me
see
if
that's
a
browser
gas
issue,
yeah
okay,
so
that
was
some
old
script.
A
So
here
you
can
enter
this
the
same
thing,
so
the
expected
status
codes
for
hundreds
to
a
one
and,
as
you
can
see
here,
instead
of
showing
these
ports
here,
it
shows
embedded
orgs
if
you
will
so
these
are
embedded
and
the
difference
is
that
what
you
can
do
with
this
activity
with
this
yeah,
this
flavor
is
you
can
handle
200
responses
in
its
own
little
sub
workflow.
So
here
you
could
do
whatever
you
want,
maybe
write
something
to
the
console.
A
A
If
it's
400,
it
will
execute
this
one
Etc
or
if,
if
none
of
these
mats,
then
you
can
do
something
here
and
what's
nice
about
this
process
that
you
can
do
whatever
you
want
before
and
then
continue
on
like
this,
so
this
will
be
executed
or
this
one
or
this
one
once
the
entire
8
speed
request
and
and
its
child
activities
finished,
the
the
main
workflow
continues
on
to
this
one.
B
Okay,
if
if
a
sub
workflow
is
is
called,
is
the
original
response,
the
the
body
of
the
response
available
within
the
sub
workflow
yeah.
C
A
Sorry
I
didn't
get
the
question.
Can
you
repeat
it.
A
C
Question
is
in
the
in
the
inner:
it's
create
a
workflow.
A
Sorry
here,
yep
yeah,
so
creating
a
workflow.
No,
so
instead
of
creating
a
workflow,
it's
actually.
What
happens
is
that
right
now
this?
This
is
like
a
property.
It's
a
well!
It's
it's,
a
port
that
stores
an
activity.
So
here
you
can
store
something
that
implements
eye
activity.
So
what
the
designer
does
it
instantiates
a
flowchart
activity.
So
this
entire
thing
is
a
flowchart
activity
and
now
here's
another
flowchart
activity-
and
this
is
the
designer
for
that
flowchart
activity.
So
in
fact
you
see
it
here,
flowchart
one
or
actually
that's
sorry,
that's
the
root.
A
I
think
I
I
hate
it
because
it's
implied
it
didn't
add
any
value.
So
this
is
the
roots
flow
chart.
Then
there's
send
HP
request.
This
200
contains
this
current
flowchart
activity
and
this
flowchart
activity
then
has
and
activities
collection,
and
that's
currently
has
this
one
activity,
which
is
this
one.
So
it's
not
an
actual
workflow
definition.
It's
just
a
composite
activity,
a
flowchart
yeah.
A
Good
question
yeah,
so
that's
basically
it
it's
like
a
hybrid
model.
The
the
this
is
more
of
a
sequential
activity
to
you
know
to
use
the
terminology
a
little
bit
from
Windows
workflow
Foundation,
where
they
there.
They
have
a
strict
separation
between
the
flow
charts
and
sequence
diagrams,
and
this
designer
attempts
to
be
a
hybrid,
because
it's
easier
from
the
perspective
of
migrating
from
Elsa
to
2003,
where
you
still
want
support
for
flowcharts.
A
But
it's
too
soon
to
have
a
separate,
sequential
diagram.
Editor
I
mean
it
would
be
much
more
work
and
it
would
delay
the
release.
So
this
is
like
a
intermediate
version
of
of
flowchart
editor
and
the
only
disadvantage
that
I
think
at
this
moment
is
that
it
can
be
confusing
to
have
two
flavors
from
the
Picker
like
here.
A
You
have
HP
requests
and
Floyd
speed
request
the
way
I'm
going
to
solve
it
is
to
allow
the
integrator
or
the
developer
to
configure
the
available
activities,
and
it's
up
to
the
you
know
to
those
developers
to
implement
Theirs
to
decide
whether
they
prefer
this
kind
of
this
kind
of
activities
or
these
kind
of
activities.
At
the
very
least,
we
have
all
of
these
options
to
choose
from.
A
A
There's
no
way
to
continue
using
this
approach,
just
from
the
200s
to,
for
example,
right
line,
because
right
line
is
connected
to
this
HP
request,
regardless
of
the
outcome
here
versus
this
sorry,
this
one
here
the
same
outcomes.
But
here
you
don't
you
you
don't
have
these
embedded
ports,
so
you
can
directly
connect
the
outcome
to
the
next
activity.
So
it's
a
matter
of
of
your
particular
use
case.
A
What
makes
more
sense,
because
what
you
can
do
with
this
one
is
have
a
like
a
a
done
outcome
like
you
have
an
answer
too,
where,
where
you
have
activities
like
the
effectivity,
it
has
a
true
Brands,
a
false
Brands
and
then
a
done
brands,
and
even
though
it's
it
allows
you
to
continue
with
the
workflow
after
either
the
true
or
the
false
brands
have
executed.
It's
also
a
little
bit
confusing
because
it's
not
visually
clear,
which
one
will
execute.
B
All
of
the
outcomes
on
the
upload
HTTP
request
and
then
you've
got
the
same
as
the
the
normal
HTTP
request.
That's.
A
Exactly
right,
yeah,
you
would
do
it
like
this,
so
then
it
doesn't
matter
which
one
executes
you
could,
of
course
do
stuff
in
between,
like
maybe
this
one.
You
want
to
do
it
like
this
and
then
join
this,
and
then
you
don't
care
about
the
others.
You
just
want
to
continue
yeah,
that's
the
way
to
do
it.
A
Yeah
loop
loop
is
in
in
L2
has
is,
is
is
a
good
example
here
we
don't
have
a
flow
Loop,
not
yet
at
least
maybe
we'll
add
it,
but
for
now
there's
only
these
looping
constructs
and
they
only
support
embedded
ports
and
that
fixes
the
issue
where
it
could
potentially
go
from
the
body
and
Elsa
to
to
an
arbitrary
other
activity.
Here,
that's
just
not
possible.
A
Looks
oh
sure
we
can
take
a
look
at
what
that
looks
like
do
you
want
to
look
at
a
specific
activity
here
that
executes
and
then
see
what
it
looks
like
in
the
journal.
C
C
A
A
So
it
sends
wait.
That's
not
right!
It
should
not
have
returned
an
instance.
It
should
have
returned
to
it.
This
one,
oh
wait,
maybe
I
suppose.
Well,
let's
take
a
look
at
the
workflow
instances.
So
here
we
have
an
instance.
It's
finished
it's
not
currently
showing
the
sub
status
because
it
could
be
finished,
but
errored.
Then
right
now
you
don't
see
that
that's
majorly
confusing
it
should
not
display
if
right
line,
three
I,
don't
think
we
are
oh
unless
unless,
let's
see
assume
to
fit,
oh
I
see
okay,
so
there's
this
sneaky.
A
A
Exactly
yeah
and
or
at
least
say
a
yeah,
some
helpful
hints
because
it
is
a
valid
case
where
you
do
want
to
allow
your
Warfare
to
start
with
multiple
ones,
but
it
would
be
good
to
be
aware
of
that
if
in
case
you
have
it,
so
let's
try
this
again.
A
Okay,
so
so,
apparently
we
did
a
bad
request
because
we
got
a
400
results,
but
in
any
case
first,
let's
take
a
look
at
the
journal.
So
this
is
the
journal
here
we
have
a
view
of
the
the
workflow
here
we
see
the
what
executed
so
first
we
got
flows
and
HP
requests,
which
is
this
one
here
we
can
see
what
we
conf,
how
we
configured
the
activity
at
the
time
it
executed.
So
imagine
we
were
in
some
sort
of
Loop
and
during
each
iteration
the
the
input
of
an
activity
changes.
A
We
will
be
able
to
see
that
on
its
entry
in
the
journal.
Right
now
we
have
a
very
simple
workflow,
so
we
only
see
simple
data
yeah,
so
it
went
from
this
request
to
HP
response
to
with
this
this
one.
Of
course,
the
interesting
part
will
be
figuring
out.
Why
did
it
go
to
this
route
and
not
to
this
one
so.
B
A
Yeah
good
question:
we
should
indeed
inspect
the
response
of
the
thing,
so
we
didn't
capture
the
response,
but
we
can
try.
So
let's
go
back
to
this
one,
and
so
this
here
we
also
this
is
the
parsed
object,
but
here's
the
HP
response,
let's
capture
this
one.
So
now
that
we
have
to
capture
this
one-
and
let's
say
we
come
here:
let's
change
this
to
get
nice
speed
response.
A
First,
let
me
refresh
if
that
intellisense
bug
is
gone,
so
it
has
a
body
of
type
any
so
I,
don't
know
what
the
type
is
here,
because
Annie
is
not
very
helpful,
but
we
can
try
we'll
see
what
happens
so
now.
We
got
an
instant
study
finish
with
an
hour.
So
probably
this
voltage
okay
fail
to
convert
an
object
of
response
message:
oh
assistant,
HP,
EXP,
ERT
yeah,
that's
not
gonna
work
yeah!
This
is
not
an
ATP
response
message,
of
course,
but
let's
do
object.
A
Okay
and
then,
if
this
is
a
response
message,
I
don't
know
if
it
has
a
party
to
be
honest,
so
it
returns
a
bad
requests
which
is
expected
but
I'm
not
seeing
a
reason.
So
this
was
the
request
message:
let's
see
what
what
happens
if
we
do
it
in
Postman
this.
This
is
okay,
so
I
think
at
this
point
the
only
way
the
only
effective
way
to
troubleshoot
this
one,
because,
as
you
see,
the
journal
isn't
too
complete
yet
to
to
be
able
to
figure
this
out
without
the
proper
debugging
tools.
A
A
Okay,
so
it
didn't
automatically
include
the
content
type
which
I
think
is
supposed
to
happen,
but
I'll
look
into
that,
but
now
it
returns
this
information.
So
it
went
to
the
to
the
HP
response,
one,
which
is
this
one.
B
B
A
A
B
A
A
Let's
see,
content
try
get
so
here
we
get
content
of
type
object
so
that
it
could
be
well
anything
basically,
but
it's
going
to
expect
something
based
on
what's
determined
by
this
HP
content
Factory.
So
here
we
have
an
innumerable
of
HP
content
factories,
so
we
have
a
bunch
of
them.
So
we
have
support
for
Json
text
form
URL,
and
this
one
will
match
Json.
It
text
the
application
Json
and
text
Json,
and
here
it's
going
to
do
the
test.
If
it's
a
string,
it
will
just
produce
a
string
content.
A
Hp
content
object.
Otherwise
it's
gonna
create
a
Json
content
using
the
optic.
So
this
object
is
going
to
be
serialized
here
to
see
if
that
works.
What
we
can
do
is
just
copy
this
and
switch
to
liquid
liquid
will
always
return
a
string
type.
So
here
we
can
just
enter
the
Json
as
we
would
normally.
So
this
is
adjacent
string
and
if
we
publish
this
one
and
send-
and
then
it
also
works
and
as
a
two
I
think
only
strings
are
supported
for
HP
request
or
only
objects.
One
of
those
two
I
think
and.
A
Like
here
yeah,
not
yet,
but
we
will
add
support
for
that
as
well,
so
you
can
directly
say
just
enter
Json.
At
least
we
may
add
it
I'm,
because
liquid
is
is
like
Json,
it
doesn't
really
add,
what's
value
I
think
other
than
maybe
syntax
highlighting,
which
is
nice,
but
it
would
also
be
nice
if
you
could
have
producer.
Dynamic
value,
so
maybe
liquid
is
is,
is
even
more
suitable
because
it
allows
you
to
do
things
like
you
know
variables
that
some
email,
if
you
had
a
variable
cool,
some
some
email.
A
Probably
it
would
be
good
interesting
to
look
at
and
maybe
if
we
were
to
add
Json
here,
maybe
it
should
have
support
for
liquid
syntax.
Just
as
a
you
know,
very
opinionated
configuration
and
then
you
have
the
best
of
both
worlds
and
similarly,
maybe
so
he
would
have
Json
Plus
or
Liquid
Plus
Json
Liquid
Plus
HTML.
If
you
are
creating
a
templates
for
send
email,
for
example,
that
would
be
nice.
D
A
Yeah
and
there's
and
it
works
the
same
way
for
content
from
HTTP
response,
and
it
uses
the
same
mechanism
to
produce
these
this.
This
content
objects.
So
here
too,
you
can
provide
a
string
or
an
object
which
will
then
get
serialized,
and
it
will
also
take
into
account
the
content
type.
So
maybe
you
don't
want
to
produce
Json,
maybe
you
want
to
produce
XML
or
even
an
octet
stream.
In
case
your
object
is
a
byte
array.
Then
you
want
to
send
it
as
a
file
download
Maybe
all
right.
A
One
thing
I
noticed
today
was
a
response
to
get
up
about
the
multi-tenancy
topic.
So
I
wanted
to
take
a
look
at
it
briefly
here.
So
it's
it's
here's
the
roadmap,
here's
multi
tendency.
So
it's
an
old
issue.
It's
from
2021
by
Craig
and
elsa2,
has
support
for
multi-tenancy
at
the
database
level.
So
you
have
basically
a
tenant
ID
column
that
you
can
configure
and
the
API
knows
about
tenant
IDs
that
you
can
pass
through
the
various
apis
that
are
there.
A
Elsa3
doesn't
have
any
anything
like
it
yet
the
main
reason
is
I.
I
want
to
really
explore
the
options
and
and
come
come
up
with
a
good
architecture
and
I
never
got
a
opportunity
to
do
it
properly
for
Elsa
2,
unfortunately
yeah,
but
thanks
to
the
community.
We
have
a
lot
of
support
for
multi
tennis
in
Elsa
too,
but
I
want
also
want
to
take
this
opportunity
with
this
rewrite
of
Elsa
into
Elsa.
A
3
to
you
know,
to
come
up
with
a
a
decent
implementation
for
multi-tenancy
at
the
database
level,
so
that
you
can
use
a
single
database
with
the
same
set
of
tables
so
not
having
prefixed
tables,
for
example,
but
actually
being
able
to
do
it
at
the
table
level.
A
A
So
the
what
I
understand
is
that
it
allows
you
to
implement
multi-tenancy
in
your
application.
So
it's
a
library
that
has
a
bunch
of
abstractions
and
concrete
options
for
you
to
implement
multi-tenancy,
but
I've
I've,
yet
to
explore,
if,
if
it
supports
only
Entity
framework
core,
for
example,
or
if
or
if
it's
designed
in
a
way
that
it
doesn't
matter
what
persistence
mechanism
you
use
that
you
can,
you
know
maybe
Implement
some
abstraction
and
and
go
from
there.
A
My
only
hesitance
of
using
a
library
like
this
directly
is
the
dependency
on
on
such
a
library,
but
maybe
we
can
abstract
it
in
a
way
so
that
it,
you
know
if
somebody
doesn't
like
this
using
this
library
for
some
reason
they
could
always
if
they
wanted
to
use
multi-tenancy,
they
could
Implement
a
different
strategy
altogether,
one
way
or
another.
If
we
want
to
implement
multi-tenancy
at
the
table
level,
the
domain
objects
in
Elsa
will
have
to
be
aware
of
the
of
multi-tenancy.
A
C
B
But
multi-tenancy
is
a
big
point
for
us,
because
we
we
we're
starting
right
with
our
project
and
we
need
multi-tenancy
for
our
project,
because
we
we
have
a
project
where
we,
where
each
of
the
customers
could
design
their
own
workflows,
and
so
it
shouldn't
be
possible
to
see
workflows
from
another
from
another
customer.
So
at
some
point
it
should
be
implemented,
but
would
be
great
if
it
if
you
could
do
that,
but
I
I
know
it's
it's
a
big
task
for
Elsa.
A
Yeah
absolutely
yeah
and
there's
the
good.
E
A
That's
great
because
I
was
just
about
to
say,
there's
another
customer.
That
also
mentioned
it's
very
important
for
them
for
also
three
to
support.
Multi-Tenancy
so
sounds
like
there's
a
there's,
a
good,
the
good
there's,
a
good
reason
to
to
really
explore
the
same
in
more.
B
Detail
right
now:
it's
the
big
biggest
missing
feature
for
us,
so
a
BP
man
would
be
fine
too,
but
multi-tenancy
is,
is
the
biggest
missing
feature
first
right
now.
B
E
On
our
side,
I
would
say
basically
controlling
the
data
storage.
That's
most
critical,
because
our
cases
we
would
physically
need
to
have
a
separate
databases
for
different
antennas.
A
A
Yeah
so
there's
a
perfect
multi
tenants,
so
here
they
go
explain
what
is
multi-tenancy
in
their
View,
some
general
principles
and
essentially
the
way
I
understood
it
is
that
you
will
have
a
container
per
tenant.
You
will
have
probably
a
root
container
and
then
child
containers
where
a
container
like
the
difference
have
between
Singleton
and
scoped.
You
would
also
have
another
flavor
of
let's
say
container,
which
is
then
tight
to
to
a
tenant.
B
And
you
see
we
could
use
it
already,
this
this
type
of
containers
to
to
store
data
for
Elsa.
A
I
think
so,
because
I
and
to
be
clear,
I
haven't
tried
it.
So
I
could
be
wrong,
but
my
understanding
is
yes,
because
you
don't
have
to
use
the.net
built-in
iservice
collection
default
implementation.
You
could
replace
it
with
the
artifact
implementation
of
that
interface
and
then
also
through
that
through
through
this
package,
you
can
then
take
advantage
of
multi-tenants.
E
Correctly
and
again,
this
is
just
purely
so.
It's
checking
you
know
we
can
use
artifact,
but
rather
than
use
a
default
registration
of
services
that
provided
right
now,
as
extension,
we'll
just
register
ourselves
using
this
container
tenant
specific
about
attack
exactly.
A
Yeah
and
I
think
what
the
way
it
will,
or
at
least
one
approach
that
it
takes,
is
that
I've
seen
is
that
you
configure
your
service
collection.
So
the
concrete
object,
service
collection
and
then
you
construct
a
artifact
container
and
then
basically
feed
it
with
your
service
collection
and
object,
and
then
it
will
internally
set
up
all
of
the
dependencies
and
from
that
point
on
you'll
produce
an
isource
provider
that
is
implemented
by
artifact.
B
A
E
It's
very
like
I,
really
like
this
approach,
again,
theoretically,
of
course,
because
even
for
distributed
environment
where
we
need
to
have
a
quart,
so
we
need
to
have
a
lot
of
other
services
being
able
to
Notre
invent
the
wheel
but
to
use
on
a
level
of
eye
service
container.
That
sounds
very
good
to
us.
Yeah.
A
It's
great
because
it
allows
you
to
separate
configuration,
so
you
can
have
a
connected
string
for
tenants,
for
example,
but
also
have
different
implementations
of
services.
So
maybe
one
customer
should
use
more
fancy,
email
service,
let's
say
and
another
one,
a
more
crappy
one
because
they
pay
less.
A
You
could
configure
it
at
that
level,
so
that's
very
flexible,
but
what
you,
but
it
will
always
require
you
to
have
separate
connection
strings,
even
though
they
could
point
to
the
same
database.
But
then
you
need
to
make
sure
that
you
don't
conflict
between
one
tenant
and
another
in
the
same
database
in
terms
of
the
tables
being
created,
or
maybe
you
can
create
a
a
schema
so
that
it's
scoped
per
tenant
per
schema.
A
So
that's
the
that's
what
it
doesn't
give
you,
okay,
cool,
all
right,
so
so
yeah
so,
ideally,
I
I
will
be
able
to
produce
the
reference
application
using
artifact
and
I
will
probably
start
with
that,
because
it's
the
it's
it's
it's
very
flexible
and
and
very
suitable
for
most
multi-tenant
scenarios
and
after
that
Look
Into,
Thin
Buckle,
even
if
just
to
get
some
inspirational
in
terms
of
Designing
multi-tenancy.
At
the
database
table
level,
so
yeah,
that's
that's
what
I
want
to
briefly
mention:
okay,.
B
I'm
splitting
the
the
information
to
different
databases
will
databases
will
other
be
possible
in
the
future
Maybe?
So
maybe
workflow
definitions
could
be
loaded
from
different
databases.
A
That's
that's
possible
today,
so
it's
completely
separated
and
in
fact
we
have
a
implementation
for
workflow
instance
store
to
be
stored
in
leucine
or
not
losing,
but
elasticsearchs,
so
that
you
can
have
work
for
definitions
could
come
from
your
database,
one
one
database
that
you
have
for
even
from
blob
storage
or
local
disk
stores
or
from
from
Json
files
as
embedded
resources,
and
that
that
stores
mechanism
is
separate
from
the
workflow
instances.
That
could
be
completely
different
and
it's
even
optional.
You
don't
have
to
store
workflow
instances.
C
Yeah
I
can
ask
about
the
current
status
of
the
workflow
context.
Providers.
A
It
is
I,
started
the
implementation
and
had
some
success
with
it,
but
it's
not
fully
tested
out,
so
it
could
be
lacking
some
features
so
just
to
be
aware
of
it,
but
there's
something
there:
there's
no
documentation
yet
I
need
to
provide
a
proper,
at
least
a
proper
sample
application
to
showcase
the
usage.
So
it's
it's
there,
but
it's
not
finished
yet.
A
A
Every
time
the
workflow
executes
and
that's
very
convenient
in
case,
you
work
with
certain
domain
entities
that
you
need
to
make
sure
they
are
always
loaded,
firstly
from
your
own
database,
instead
of
having
to
load
that
entity
or
refresh
the
entity
every
step
of
the
way
in
your
workflow
explicitly.
This
would
be
done
automatically
for
you
in
the
background.
That's
the
way
it
works
in
LSAT,
2.
and
also
three
that
will
be
the
same,
but
it
had
will
have
the
option
to
provide
multiple
contexts
and
also
it
wouldn't
be
Associated
on
the
context
type.
A
Let's
say
you
have
a
customer
type
or
a
document
type.
It
would
be
associated
associated
directly
to
your
provider.
So
you
configure
workflow
implementation
with
a
set
of
workflow
context
providers
that
then
they
can
then
all
provide
the
context
or
parts
of
the
context
to
your
workflow.
So
it's
more
flexible
this
way,
that's
so
nice,
yeah,
I,
yeah
I,
like
that
too,
it's
it
was
one
of
my
Heath
pets
with
with
Elsa
too.
Let's
see
just
looking
at
the
extensions
here
save
context.
A
A
It's
similar
the
way
it
would
work.
Maybe
I
can
figure
it
out
on
the
Fly.
Let's
see,
let's
say
we
have
a
project
called
hello.
No,
not
this
one.
So
here's
an
Excel
workflow,
let's
see!
Oh,
wait!
Sorry!
This
is
just
a
static
class
I'm,
looking
I'm
looking
for
an
axle
implementation
of
workflow
base,
so
that's
I
workflow.
Let's
see
what
workflow
Builder
has
actually
I'm
looking
at
it
from
the
wrong
perspective,
because
workflow
context
is
an
optional
opt-in
module.
So
the
core
doesn't
know
anything
about
context.
A
It's
an
unobtrusive
implementation
of
sorts,
so
I
should
look
at
it
from
this
way.
So,
let's
see
we
have
workflow
execution,
Builder
extensions
Okay.
So
that's
that's
pretty
cool!
Actually,
here
we
have
a
middleware,
that's
being
installed,
not
an
a
spin
at
core
middleware,
but
a
workflow,
a
workflow
execution
pipeline,
middleware
components
and
what
that
does
it
allows
you
to
anytime
a
workflow
is
to
be
executed.
It
goes
through
a
pipeline
of
steps
and
by
default
it
will
just
be
one
or
maybe
two
steps,
the
one
being
just
responsible
for
running
the
workflow.
A
But
you
can
configure
this
pipeline
to
do
stuff
before
the
workflow
executes
and,
of
course,
after
it
executed
and
that's
features
what
workflow
context
takes
advantage
of
so
it
installs
a
middleware
code,
workflow
context,
workflow
execution
middleware,
so
it
installs
workflow
context
and
it
takes
advantage
of
the
workflow
objects,
custom
properties,
property
bag
and
it's
going
to
try
and
see
if
it
yeah.
If
it
contains
any
workflow
context,
then
if
not,
it
just
continues
to
the
next
middleware,
which
is
probably
just
executing
the
workflow.
A
Otherwise,
it's
gonna
for
each
workflow
context,
it's
gonna
invoke
its
provider
and
the
provider
would
be
responsible,
would
be
implemented
by
you
and
it
would
be
responsible
for
retrieving
the
data
or
constructing
some
context,
using
whatever
data
is,
it
makes
sense
in
your
scenario,
but
for
each
context
it's
gonna
get
the
provider,
invoke
your
load,
async
method
and
then
install
it
into
the
workflow
context
like
this.
So
internally
that
looks
like
okay,
so
it's
gonna
set
it
into
a
transient
property
of
your
workflow
execution
context.
A
A
Oh,
and
we
even
have
a
I
was
just
explained
about
workflow
execution,
middleware,
there's
also
an
activity,
execution
middleware,
which
looks
like
it's
doing
the
same
thing.
So
it's
gonna,
just
it's
workflow
context.
It's
going
to
be
loaded
and
then
be
provided,
but
I
I
need
to
remind
myself
why
it's
on
both
levels,
it
might
seem
a
little
bit
extraneous
to
have
two
of
them,
but
maybe
there
was
a
good
reason:
I
need
to
try
and
remind
myself,
but
I
will
come
when
I
work
on
the
example
all
right
so
that
that
went
by
fast.
A
Let's
look
at
the
calendar,
so
it's
16
March,
so
April
at
this
point
seems
a
little
bit
early
given
what's
what's
left
and
that's
what
I
mentioned
at
the
start
of
the
meeting,
although
that
should
be
solved
sometime
next
week
at
the
latest.
But
let
me
remind
myself
quickly
on
the
outstanding
issues:
I
mean
it's
possible
it,
but
it's
time
goes
a
little
bit
faster
than
I
I
expected.
A
So
here
we
have
a
little
task
overview.
I
want
to
finish
a
workflow
context,
because
that's
people
use
it
in
Alpha
2.
So
we
do
need
it
before
the
well
I
wanted
to
be
there
for
the
release
candidate.
At
least
this
is
a
refactoring
job
that
I
need
to
do
and
very
important
I
need
a
sufficient
amount
of
documentation,
so
people
can
actually
try.
A
Otherwise,
the
release
candidate
would
be
hard
to
to
use
for
people
without
guidance
on
the
most
common
scenarios
to
use
it
for
so
I
think
that's
the
the
bark
of
the
work
honestly
I,
don't
think
beginning
of
April,
but
end
of
April
is
realistic
and
if
not,
it
should
be
made,
but
I
don't
expect
it
to
be
much
later.
Even
more
so
because
I
know
there's
a
few
customers
that
are
actively
working
on
implementing
elsa3,
so
they
are
reporting
issues,
we're
fixing
them
very
fast.
A
No
worries
and
just
to
add
to
that,
if
you
have
anything
that
you're
missing,
that
you
think
is
crucial
to
have
as
part
of
your
RC
release,
please
feel
free
to.
Let
me
know,
because
that
also
helps
Drive
priorities,
because,
as
you
can
imagine,
also
looking
at
this
list,
there's
there's
a
whole
bunch
of
features
and
functionalities
that
are
today
in
Elsa
too,
but
not
yet
in
Elsa
3
and
it's
I.