►
From YouTube: FE Pairing - 20210312 - Observe THIS, Apollo Link!
Description
In this pairing session we look at simplifying some observable creation used for a new spam capturing apollo link!
MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56190
A
A
Yeah,
I'm
not
trying
to
do
that
right
like
I,
don't
want
to
insult
people.
Yes,
so
this
is
the
one
so
pretty
interesting
top
pick,
and
I
just
need
the
branch
name.
That's
the
only
thing
that
I
need
right:
okay,
cool
get,
checkout.
A
Cool
get
pull
and
gdk.
I
think
my
gdk
is
running,
I
don't
know
well
you'll.
A
A
I
think
that
okay
cool,
so
now,
let's
use
an
editor.
So
to
give
you
some
context
in
the
last
last
front-end
call,
we
had
this
great
call
out
about
the
spam
stuff
and
that
the
spam
stuff
is
essentially
that
we
now
have
this
axios
interceptor,
which
we
can
just
use.
If
we
want
to
handle,
you
know
a
recaptcha
showing
a
recaptcha
and
we
already
have
a
graphql
implementation.
A
Yes,
and
I
was
like
hey,
let's
generalize
this
right,
whoa
and
generalizing
it
with
a
link.
A
It
also
showed
some
downsides
with
the
current
approach,
so
there
are
also
backend
changes,
because
right
now,
basically,
the
backend
expects
us
to
send
all
the
spam
stuff
as
part
of
the
graphql
query,
and
the
problem
is,
if
it's
part
of
the
graphql
query,
you
basically
need
to
edit
like
in
all
the
mutations
and
all
the
you
know,
you
need
to
add
it
in
the
fields
in
as
part
of
the
those
mutations
and
then
it's
very
hard
to
write
a
generalized
thing,
because
you
would
need
to
know
where
to
set
which
variable
and
so
we've
I've
changed
the
approach
about
and
to
be
like
hey.
A
Why?
Don't
we
set
it
as
an
http
header
right
so,
and
the
idea
here,
though,
is-
and
this
is
really
weird-
because
I
don't
know
much
about
of
observers
and
I
heavily
borrowed
there-
is
a
apollo
retry
link
which
just
does
arbitrary
retries
based
on
some
conditions.
A
I
borrowed
their
logic,
reduced
it
a
little
bit
down
to
say,
hey,
you
know,
because
I
don't
need
arbitrary
retries.
I
want
to
show
you
the
model
if
there's
a
capture,
and
otherwise
just
you
know
then
try
to
resend
it
once
it's
not
like
I'm
going
to
do
this
10
times
right.
So
there's
like
less
logic
involved,
but
I
wonder
if,
because
it
still
feels
like
overhead,
I
created
a
class.
I
wonder
if
we
can
reduce
this,
and
so
this
would.
A
You
know,
obviously
also
change
how
the
tests
work
unit
tests,
at
least,
and
so
I
was
wondering
if
we
could
maybe
somehow
reduce
this
observable
right
I'll
be
interesting,
okay,
cool.
While
I
was
talking.
I
hope
that
my
ide
was
like
oh
yeah.
A
This
is
other
stuff
that
I
did
that
my
ide
is
finished,
doing
things
cool,
so
the
idea
here
is
like,
instead
of
so
apollo
links,
we
remember
I
have
operation
and
forward
so
forward,
whatever
returns
an
observable,
but
rather
than
doing
that
directly,
I'm
doing
like
return
new
observable,
I
create
a
capture
operation
and
you
know.
Basically,
the
capture
operation
does
a
normal,
that's
a
normal
forward
right.
A
So
this
is
like
the
normal
thing
that
you
know
pass
it
on
whatever
happens
next
and
after
this,
if
you're
subscribing
to
that
observer,
that's
returned
observable,
that's
returned
here
right
and
in
case
we
get
a
response.
We
check
if
there's
an
error
and
if
the
error
needs
the
captcha
we're
showing
the
captcha
setting
the
headers,
and
you
know
calling
the
execute
function
again
right,
and
I
don't
know
because
this
feels
like
a
lot
of
overhead
for
like
I
want
to
do
a
retry
with
an
observer.
A
It
feels
like
a
lot
of
overhead
to
have
this,
how
you
call
it
this
this
class
right
to
instantiate
an
object,
and
I
have
the
fear,
because
this
now
happens
on
every
request
right.
I
wonder
if
we
should
have
like
a
shop,
a
bailout
somehow
that
you
say
hey
on
the
front
end
still,
especially
as
we
currently
just
have
one
root
thanks.
This
is
whiskey.
Chocolate
fudge,
ice
cream.
I
believe,
oh.
A
Yeah
getting
drunk
by
eating
ice
cream,
it's
great
wow!
No,
and
I
have
some
coke.
So
it's
whiskey
and
coke
and
chocolate
it's
great.
A
Yes-
and
this
was
just
to
give
you
context
right
and
yes,
so
I
would
be
happy
if
we
could
reduce
this
to
have
the
same
functionality
without
you
know.
Creating
new
objects
unless
necessary-
and
I
to
be
honest,
like
don't
know
what
the
overhead
is
or
writing
tests
for
it
and
or
so.
C
So
you
so
to
if
I'm
hearing
you
correctly
you're
talking
about
there's,
there's
might
be
an
opportunity
to
simplify.
What's
there
yes
and
we
might
want
to
see
if
we
can
conditionally
run
this
link
because
there's
probably
some
requests,
we
don't
need
to
even
do
any
of
this.
A
So
the
idea
is
actually
that
this
check
should
be.
Rather,
you
know
if
we
just
this
check
is
rather
cheap
right
because
it
just
checks
the
errors,
and
I
assume
that,
like
an
error
of
that,
that
the
find
on
an
error
is
like
trivial,
like
on
an
array
right,
I
I
assume
like
if
you
I'm
just
worried
with
the
instantiation
of
these
objects.
That's
that's
the
thing
that
I'm
worried
about.
I
think,
if
we're
not
instantiating
those,
we
should
be
fine.
C
And
I
think
it
sounds
like
the
first
thing
we
want
to
do
is
actually
forward
like
I
would
say
it
sounds
like
our
link.
The
the
smallest
thing
we
could
do
is
because
we
only
ever
want
to
do
stuff
if
the
condition
is
after
we've
gotten
something
back.
If
it
has
that
error,
then
we
want
to
do
stuff,
so
I
feel.
B
C
Shouldn't
ever
see
the
new
keyword
or
anything
until
like
when
we
do
apollo
capture
link,
let's
just
call,
let's
just
forward
it
on
and
let's
let's
get
the
response
thing
and
then,
if
we
get
that
error,
then
we
can
that's
when
we
want
to.
Maybe
we
can
create
a
new
object
if
that
makes
things
look
more
maintainable
or
whatever,
but
like
yeah,
I
I
agree,
it
sounds
like
it
sounds
like
this
might
be
a
little
bit
of
overhead
for
every
request.
So.
A
The
only
question
is-
and
I
don't
know
observables
that
well
right,
because
the
problem
is,
if
I'm
just
doing
like
return
forward
operation
right,
then
I
would
subscribe
on
this
one
and
I
would
have
like
on
next
right
this.
This
is
the
thing
that
we
care
about.
I
mean
there's
also
on
error
and
whatnot,
and
I
would
do
my
logic
here
right
and
in
promises.
I
would
just
return
a
new
promise
and
then
the
promised
chain
kind
of
thing
takes
care
of
it.
But
if
I'm.
C
Like
in
an
observable,
observables
are
very,
very
similar.
Observables
are
like
take
a
promise.
I
promise
you
get.
A
single
value.
Observable
is
very
very
similar
to
that.
But
now
you
get,
you
can
get
a
bunch
of
values,
and
so
you
can
actually
map
an
observable
and
that's
kind
of
what
we
would
do.
We
want
to
forward
it,
but
then,
whatever
I
get
as
my
response,
if
I
get
one
of
these
graphql
error
things,
I
may
want
to
map
that
value
to
something
else,
so
we
don't
have
to
actually
do
a
whole
subscription.
C
C
C
A
C
C
A
And
so
the
thing
that
happens
is
like
this:
this
should
be
our
first
post
right
and
in
the
first
post
I
have
an
error.
The
arrow
says:
hey
you
know,
needs
kept
like
extensions
is
a
thing
in
graphql.
You
have
an
error,
object
with
message,
location
and
path.
This
is
all
related
to
the
graphql
query.
An
extension
is
the
stuff
where
you
can
put
arbitrary
stuff.
A
So
we
put
all
the
all
the
stuff
in
here
like
regarding
captchas
right
and
then
you
know,
we
show
the
modal
and
once
the
model
is
resolved,
you
know
we
just
forward
in
the
link
again
so,
and
here
we
just
on
the
request
on
the
headers
set,
the
spam
lock
id
and
the
this
is
actually
wrong
and
the
capture
response
right.
C
So
what
what
happens
so
so?
This
is
this
happy
path
makes
sense.
What
happens
when
the
user
just
closes
the
modal
very
transparent.
It
should.
A
Be
so
let
me
just
show
you
we
basically
trigger
a
normal
on
next,
so
let
me
just
cancel
and
then
you
should
saving
you
see.
Saving
is
still
yes,
so
that's
that's
actually
funny,
because
I
think
it
should
just
work.
I
don't
know
why
it
doesn't
work
right
now,
so
normally
we
are
now
giving
you
the
old
error
that
we
had.
So
you
should
see
the
graphql
error
here,
like
the
oh
gosh,
like
your
snippet,
has
been
recognized
as
spam.
A
So
you
should
see
this
arrow
on
on
the
top
level
here
right
like
and
maybe
may
this
observer
next,
maybe
I
need
to
complete.
No.
This
is
like
catch
result
like
this
dish.
So
basically
you
know
this
is
the
catch
right,
because
we
are
like
checking
that
you
solved
the
capture
and
we
should
have
just
forwarded
the
original
arrow
object
or
the
original
response
to
the
front
end
right.
Maybe.
B
B
Does
the
does?
The
capture
model
throws
because.
B
C
A
Yes
sure
so
console
log
capture
not
solved
got
a
capsule,
and
you
know
I
mean
this.
We
actually
should
also
have
the
error
right,
like.
A
A
Let
me
let
me
also
think,
because
I
could
be
no,
no,
no,
never
mind
it's.
It's
all
right!
Yeah,
okay,
okay,
let's
try
again
what
does
the
console
say.
C
A
B
A
Usually
I'm
using
warnings;
okay,
let's
try
again
save
cancer.
C
A
C
So
here's
here
here's
another.
This
is
crazy:
crazy,
go
nuts
idea,
yeah
and
and
nico
and
and
ip
help
me
out.
C
What
we're
doing
with
okay,
this
thing:
that's
catching
hey!
There's
a
there's!
A
captcha
issue!
Yes
handling
that
here
by
saying
okay,
we
need
to
now
show
the
modal
and
do
all
this
stuff.
We're
really
really
coupling
ourselves
to
to.
I
think
this,
this
modal
ux
is
it
possible
that
I
could
not.
A
Have
no
we
don't
we
don't
because
sorry
for,
for
you
know,
this
is
wait
for
capture
to
be
solved,
and
that
doesn't
mean
that
it's
a
modal
or
anything
if,
in
the
future,
for
example,
we
move
to
another
capture
solution
that
would
just
do
some
calculation
mining,
some
bitcoins
or
whatever,
and
doesn't
show
you
a
modal.
It
just
needs
to
return
a
promise
right
so
like,
but,
and
this
is
actually
what
what
what
you're
targeting
right,
like.
C
My
but
my
question
is:
is
it
possible
and
my
gut
tells
me
it's
possible,
although
very
unlikely,
to
have
two
captchas
on
the
same
screen?
So
let's
say
it's
not
a
modal,
but
let's
say
it's
like
an
embedded
little
box.
Could
I
have
two
forms
and
it's
like?
Oh
I've
submitted
this
one
and
now
I
have
a
little
box
and
then
I
go
to
submit
another
one.
Now
I
have
a
little
box
like
how
is
it
gonna
know?
Okay,.
A
Code
of
the
of
the
the
catcher
to
be
solved,
and
what
does
it
do
on
cancer
button?
Yes,
no
it
it
actually
it
it
will
reject
it's
100
percent
sure
that
it
will.
A
B
C
C
A
A
Yes,
no
I
had
it.
I
was
working
on
the
keyboard.
Help
model
right
and
the
keyboard
help
model
is
so
large
that
you
know
yeah.
Anyhow,
sorry
now
we
have
it
right.
Save
changes,
capture
link,
oh
man,
yeah.
This
is
from
recaptcha,
so
cancel
capture
not
solved
unsolved
capture,
error
and
so
on.
The
the
thing
is-
and
this
is
why
I
don't
understand
we
actually
send
it
down
the
line
like
the
original
result
right
like
we're
sending
it
like.
So
we
going
here,
the
question
is
like
like:
how
does
the
mutation
handle
errors?
A
A
Yes,
so,
let's
maybe
just
console
log
wait,
this
makes
no
sense.
It
should
check
the
data
right.
Oh
no
base
object.
Yes,
this
makes
sense
because
we
moved
the
errors
before
the
arrows
were
on
the
update,
snippet
right,
but.
A
C
A
A
A
A
B
C
A
A
C
See
there
it
is,
you
got
to
complete
your
observables
man,
but
yeah
so
like
with.
I
think
that
you
can.
I
think
that
we
can
map
this,
but
what
we're
actually
doing
is
mapping
to
another
observable,
so
you
can
actually
flat
map
observables.
So
we
can
map
each
value,
we
see
to
another
observable
and
then
it
will
expand
that
as
well.
So
I
think
I
think
flat
map
might
be
what
we're
wanting
to
do
here.
C
Can
you
look
up
rxjs
flat
map
because,
and
we
can,
we
can
write
this
ourselves?
It's
it's
not
hard
but
like
this
is
what
we
want
to
do
and
I
think
if,
if
you
add
a
new
tab,
rxjs
flat
map
that
mpa
they
may
have
that
one
too
I'm
joking.
C
A
C
Check
out
the
diagram,
so
you
have
an
observable:
that's
sending
items
down
the
pipe
yeah,
but
then
we
have
a
function
that
creates
observables,
and
this
is
this
one
that
does
can
take
10
to
10..
So
then,
for
every
thing
that
comes
down
the
pipe
we're
now
going
to
have
all
of
that,
we're
going
to
have
that
observable,
spread
till
it
completes
and
that's
going
to
be
on
the
pipe
now
so
quick
question:
can
we
also
return
non-observables?
C
So
then
you
just
use
a
regular
map,
so,
like
flat
map
would
be
it's
like
returning
a
promise
and
a
then
of
a
promise.
That's
kind
of
what
flap
map
is
like
doing,
okay,
where,
where,
if
I
wanted
to
just
do
a
regular
map,
I
just
want
to
map
this
value
to
another
value.
I
can
do
that,
but
I
see
we're
returning
a
promise.
A
promise
can
easily
be
mapped
to
an
observable,
so
you
can
just
use
observable.of
for
the
promise
or
something
so
we
can
map
each.
C
A
C
So
we're
gonna
want
to
return
a
so
up
there
where
we
have.
If
it's
a
capture
error,
we
want
to
return
that
promise.
It
seems
like
right.
C
C
If
you
go
to,
if
you
go
up
to
of.
A
As
iterator
is
array,
doesn't
do
one
bit,
but
I
mean
to
be
honest,
like
should
be
super
easy
because
we
can
just
do
like
return
new
yep.
We
could
do
it
like
that.
Yeah
observable
right
and
then
it's
observer,
and
then
we
just
do
import.
A
Then
console
1
capture
required.
I
don't
care
about
this
anymore
and
we
just
do
observer
next,
complete,
oh
geez.
This
is
like
because
here
we
would
retur
yeah
here
we
want
basically
to
do
like
you
know,
oh
jeez,
because
here
we
basically
no
this
is
like
super
can,
can
we
can
we
make
this
an
async
function
and
just
use
a
weight
and
then
return
sync?
C
C
C
C
So
if,
if
I'm
not
entirely
sure
why
we
want
to
do
this,
but
if
I
understood
what
ip
was
talking
about,
if
you
wanted
to
take
our
observer
observable
here-
and
you
want
to
bring
it
over
to
forward
again-
we
could
just
call
forward
and
just
subscribe.
Whatever
observer
now
is
going
to
receive
whatever
forward
gets,
I'm
not
sure
why
we
want
to
do
that,
but
no,
we
don't
have
to
wait
or
anything
or
do
anything
recursive.
We
can
just
trigger
that.
C
C
C
Yeah
yeah
I
mean
chances.
Are
this
isn't
going
to
be
completely
right?
The
first
time,
but
I
think
it's
already
a
little
cleaner.
A
We
check
the
result
for
the
error
if
the
error,
so
let's
go
to
happy
path.
First
right,
we
we've
got
no
capture
error.
We
just
return
the
result
again
and
I
think
you
want
to
use.
A
Yes,
so
you
know,
this
is
the
happy
path
like
we
go
in
here.
We
check
are
nothing
found,
we
will
just
return
it,
and
this
is
the
arrow
path
where
it's
like,
hey.
You
know,
solve
the
capture
thing.
A
If
the
capture
we
return
a
new
observable
and
if
the
captcha
is
then
solved,
we
just
do
the
operation
once
again
and
subscribe.
This
is
like
a
bit
confusing
because
we
basically.
B
A
Oh,
this
is
actually
good.
No,
this
is
a
good
point.
I
assume,
if
the
back
end
would
return
something
bad
and
we
can
try
this
out
in
a
second.
We
can
actually,
actually
you
will
just
see
the
arrow,
so
it
would
be
the
same
as
cancelling.
So
if
you're
like
caught
in
a
capture
loop
or
whatever,
you
would
see
that
error
like
and
why
we
yeah.
B
B
A
C
A
No,
it's
it's
pretty.
It's
pretty
simple.
Let
me
just
maybe
I
can
open
next
to
the
code.
I
can
open
the
the
apollo
link
documentation.
I
don't.
A
A
What's
this,
why
isn't
this
like?
Is
this
a
picture
or
what
so
imagine
imagine
this?
Is
our
capture
thingy
right
like
this
is
our
capture,
so
we
come
down
the
first
time
we
forward.
We
forward.
We
get
the
capture
error,
we
get
the
capture
error,
we
are
like,
oh
god,
we
got
to
capture
arrow.
Please
solve
the
capture
user
solves
the
capture,
we
are
like.
Oh,
you
solved
the
game
yeah
and
then
we
forward
forward
back,
but
we're
not
subscribing
to
that.
C
C
But
we're
not
we're
not
creating
the
line.
56
observable
anymore,
we're
not
doing
that
whole
condition.
We're
not
doing
that.
We're
we're
the
this
observer
is
going
to
be
okay,
that's
the
beat
that
I
was
missing.
B
B
C
The
naming
confuses
me
horribly,
no,
it's
it's.
It's
definitely
trippy
and
it's
the
only
question
I
was
like:
why
didn't
it
go
through
yeah?
That's
a
good
question
did.
Can
we
go
back
to
our?
I
want
to
compare
with
with
the
with
the
code
that
was
working
so
we're
doing
it's
gone.
Okay,
that's
good!.
A
C
C
Basically
doing
the
flat
map
like
you're-
basically,
yes,
you're
basically
manually
doing
that,
and
we
could
do
that.
But
I'd
like
to
yeah
I'd
like
to
see
I'm
curious.
Did
we
send
the
right
parameters
down
when
we
forwarded
the
operation.
A
I
mean
I
changed
something
here
that
you
know
confused
me,
because
this
was
apparently
sending
the
wrong
thing.
It
could
be
that
you
know
our
logic
with
the
back
end
is
just
a
little
bit
broken
like
it
could
be,
because
there
are
basically
three
things.
First
thing
is.
First
thing
is
like
that.
You
tell
recapture
hey,
you
know,
this
is
a
capture
for
the
site.
This
is
the
capture.
This
is
the
capture
site
key.
Then
we
have
a
spam
lock
id
and
the
spam
lock
id
is.
A
Actually
you
know
that
the
backend
knows
hey.
You
know
the
solution
that
I'm
getting
now
is
actually
for
this.
This
capture
that
was
solved,
and
the
third
thing
is
the
captcha
response,
the
solution
right.
So
I
just
wonder
like
if
we
did
something
wrong
here.
Maybe
I
don't
know,
let's
check
it
out:
okay,
okay,
edit,
I'm
just
going
to
you
know,
set.
A
Is
actually
happy
right?
Okay,
let's,
let's
try
it
here
and
we
got
our
graphql
query
the
first
one
right
that
that
just
happened.
Yep
response
here
is
no
header
whatsoever.
We
just
click
yay.
A
A
C
C
A
A
A
Oh
yeah,
the
error
wasn't
cleared
right,
so
one
of
the
things
that
we
probably
should
do
in
the
edit
app
is.
We
should
have
like
a
flash
api
failure.
We
should
clearly
you
know
before
updating.
We
should
clear
a
flash
that
might
have
existed
from
a
previous
yeah.
C
A
B
C
C
C
B
A
A
You
a
different
different
perspective
on
that.
We
could
do
it
that
way,
but
then
it
will
be
pretty
hard
because
we
don't
know
where
we
need
to
put
and
read
stuff
in
this
generalized
apollo
link
right.
You
would
need
to
go
through
every
object
and
see
if
errors
are
on
there.
That's
generally
good,
but
give
you
my
most
apt
analogy
that
I
have
for
the
captcha.
Is
it's
like
authorization
right?
It's
like
a
second
authorization,
and
I
don't
know-
and
that's
actually
something
I
wanted
to
try
out
like
what
happens.
A
B
A
C
Yes,
you
so
go
back.
Can
you
go
back
to
our
query
or
to
the
query,
can
you
go
to
our
mutation
to
the
yes?
C
What
and
I
I
had
this
idea
with
chad
when
we
were
working
when
he
was
working
on
it
and
put
the
spam
stuff
very
specific
just
to
this
mutation.
C
What
if,
when
I
made
a
mutation
like
update,
snippet
yeah,
there
was
a
second
object
that
I
query
for
yes,.
A
A
About
this,
who
wrote
the
the
backend
parts
of
this
right
or
helped
me
write
it
and
the
problem
with
that?
Is
that
the
way
that
our
controllers
work?
So
if
you
actually
have
the,
oh
god,
the
mutation?
How
is
it
called
the
update
mutation?
A
It
it
makes
like
the
back
end
harder,
and
you
know
we
would
need
to
change
all
of
the
back-end
stuff
and
yeah,
and
actually
really
funny
that
you
mentioned
it
because
alex
actually
says
like
hey,
let's
maintain
both
and
chat
that
you
know
actually
is
like
hey
the
solution
with
the
headers
like
this
is
his
response.
Why?
The
solution
with
the
headers
is
actually
quite
nice
and
why
we
should
go
for
the
solution
with
the
headers
right,
like
yeah,.
B
Think
I
think
we
are
talking
about
two
different
things,
so
the
others
is
to
send
the
capture
things.
But
paul
was
asking
if
we
could
have
a
spam
type
that
in
the
response
right.
A
B
B
B
A
I
mean
that
that
potentially
would
maybe
doable.
I
don't
know
if
we,
if
you,
if
you
just
because
in
the
response,
so
instead
of
arrows,
you
would
have
a
spam
thingy,
but
still
like.
How
would
I
know
where
I
look,
because
adding
a
second
top
level
result
doesn't
make
any
sense
right,
because
everything
that
happens,
everything
that
comes
as
a
result
of
the
update,
snippet
mutation
will
be
inside
of
here
right.
A
So
I
cannot
have
like
a
spam
top
level
here.
You
can
the
response,
because
everything,
because
everything
that
that
happens
as
part
of
the
update
snippet,
must
be
inside
of
the
part
of
the
update
snippets
right.
Yes,.
C
A
Okay,
all
right
so-
and
you
know
adding
something
like
it
would
be-
maybe
doable
to
add
something
on
the
top
level
so
that
it's
not
part
of
okay.
C
Me
on
your
and
it's
a
really
good
point
and
I
think
there's
different
alternatives.
They
all
have
their
trade-offs,
but
I
think
the
simplest
thing
would
be
if
we
can
only
have
one
root.
That
should
actually
be
really
easy
for
us
to
traverse.
I
get
an
object
back,
let's
just
go
to
the
first
key
and
look
at
the
errors
there,
so,
rather
than
putting
the
errors
at
the
top
treating
this
spam
as
a
top
level
error
which
could
cause
issues
like
this,
because
this
is
actually
user
recoverable
area
and
our
like.
A
To
be
honest,
yeah,
another
thing
why
why
I'm
saying
like
hey
this?
Maybe
I
don't
want
you,
I
I
have
no
idea
about
graphql
right
and
we
have
now
this
thing
where
we're
sending
arrows
down
the
arrows
down
the
drain
and,
to
be
honest,
like
this,
is
not
something
in
the
graphql
spec,
with
the
arrows
being
part
of
the
object.
This
is
actually
something
that
graphql
ruby
recommends
right
and,
to
be
honest,
like
this
e,
and
why
don't
we
have
different
arrow
handling
based
on
the
type.
C
C
Change
layer,
five
line
five,
so
we
would
do
result
so
first,
we're
gonna
do
result.data.
C
Well,
I
mean
that's.
My
one
suggestion
was
how
about
in
our
mutation.
We
have
another
key
that
we
request,
but
if
we
can
only
have
one
key,
then
it's
like
hey,
we
should
just
be
able
to
just
go
yeah
just
like
that
and
then
and
then
get
the
errors
from
there.
So
I
all
that
to
say,
like
I
think.
A
I
think
this
is
something
that
we
could
discuss
on
the
amount.
The
other
thing
that
I
would
basically
have
done
here
is
like
hey
doing
the
right
thing
and
we
would
have
said
like,
in
my
opinion,
right
thing
I
would
have
said,
like
hey,
you
know
in
the
edit
handler
you
could
say
like
hey.
If
e
instance
of
you
know,
the
un
solve
capture
error,
do
something
better,
and
I.
C
Think
and
I
think
that'd
be
really
sweet,
it'd
be
really
nice
to
solve
errors
in
just
one
spot.
I
do
know
apollo,
treats
those
errors
on
181,
like
those
are
like
very
special.
Something
went
really
bad
with
apollo
and
so
natalya
has
diff
a
much
better
perspective
of
this
than
I
do.
I
ran
into
this
one.
I
was
doing
some
testing,
but
I
know
that,
like
this
dot
catch
is
is
means
something
really
bad
happened
in
apollo
land,
but
that
was
just
my
answer.
I
mean.
C
B
Yeah,
the
reality
is
that
it
depends
on
how
the
back
and
then
point
type
is
configured
for
every
mutation,
yeah,
yeah.
C
I
think,
on
the
plus
side,
there's
lots
of
options
there
like.
I
think
we
could
traverse
the
object
that
doesn't
seem
like
that'd,
be
that
difficult
yeah,
but
I
think
I
think,
there's
lots
of
options
but
dude
this
looks
so
sweet.
This
is
a
really
really
awesome
way
to
approach
the
the
capture
stuff,
so
it
looks
really
sweet
thanks
for
I'm
glad
we
got
to
do
some
observable
stuff.
I
love
touching
that
stuff,
so
that
was
a
lot
of
fun.
C
Yeah
rx
is
like
actually
really
optimized
like
they
do.
They
they
have
tree
shaking
like
because
they
have
a
glorious
amount
of
operations
you
could
do,
but
they
treat
tree
shaking
really
seriously
yeah,
it's
pretty
cool,
dude
nico.
I
pee
it
was
awesome,
seeing
you
all
I'll
catch,
you
all
later
have
a
good
one.
Bye.