►
From YouTube: Node.js N-API Team meeting 2019-11-11
Description
B
A
B
B
B
A
B
B
A
B
A
A
C
D
A
B
A
B
A
B
B
A
B
Well,
what
we
do
have
the
workshop
right,
so
so
we
can.
We
can
just
sort
of
take
it
offline
afterwards
and
and
see
see
how
much
interest
we
get,
because
it
is
gonna,
be
during
collab
Simon
right,
so
we
might
be
able
to
get
something
going
but
yeah
whatever
code
and
learn
it.
It
might
be
difficult
because
there
is
not
really
a
good
time
slot
for
it.
Okay,.
A
B
A
B
Do
we
need
additional
async
work
of
variants?
I
think
we
could
have
used
Kevin
on
this
one,
but
we
did
land.
We
did
land.
Some
right
like
we
were.
Lucas
was
working
on
the
async
progress
queue
worker
and
last
time
the
the
state
was
that
he
would
look
into
just
using
a
queue
size
of
zero
for
it
and
I.
Don't
leave
made
any
progress
on
that,
but
let
me
just
make
sure
is
I:
I
haven't
had
a
chance
to
look
github
ojsc.
C
B
B
That
still
using
the
queue
size
of
one,
which
means
he
needs
to
do
his
own
queuing,
seem
okay,
alright,
so
I,
don't
think.
We've
had
progress
on
this
one,
but
okay,
but
this
is
the
one
that's
going
on
now,
let's
see
yeah,
so
we
need
we
need.
This
is
this
was
the
one
to
five?
Eighty
nine,
a
oh
boy,
I
need
to
I
need
to
review
this.
Okay,
I'm
gonna
leave
this
open
because
I
need
to
review
it.
So
let's
see,
does
this
thing
of
the
smart
thing?
Ii
know
it
does.
B
A
Yeah,
it's
it's
III
just
thought.
Did
the
reference
to
read
me
yeah.
B
A
B
E
B
D
B
A
B
Weak
reference
so
but
which
is
not
which
is
okay
right,
but
but
then,
but
then
they
have
a
choice
right
either
they
have
a
strong
reference
and
they
provide
an
API
for
explicitly
indicating
that
this
object
is
to
be
released.
You
know
like
the
example,
for
that
is
like
set
interval
right
or
set
immediate
right.
B
A
B
So
that's
one,
that's
one
option
and
you
have
to
to
api's
want
to
create
the
thing
I
want
to
destroy
the
thing.
The
other
option
is
is
to
use
a
weak
reference
and
then
and
then
the
garbage
collector
decides
want
to
destroy
the
thing
right
and
then
you
have
you,
have
you
have
the
opportunity
to
find
out
that
the
thing
was
destroyed?
B
So
in
one
case
you
remain
in
control
as
the
add-on
author
and
you
expect
your
users
to
to
explicitly
release
resources,
and
in
the
other
case
you
you,
you
you
let
the
garbage
collector,
decide
right
and
so
so
I
think
the
most
important
point
for
add-on
authors
about
about
weak
versus
strong
reference
is
this
right.
Is
that.
A
B
You
have
a
strong
reference.
You
need
to
provide
an
API
with
which
to
release
it,
otherwise
it
will
never
be
released
or
you
can
have
a
weak
reference,
in
which
case
the
garbage
collector
lets.
You
know
that,
okay,
you
know
you
do
what
you
need
to
do,
because
this
object
will
never
be
used
again
in
JavaScript
right.
There.
A
B
Want
to
free
the
memory,
but
yeah
I
mean
in
terms
of
circular
references.
Yes,
you
you
can
you
know
you
can
end
up
in
a
situation
where,
where
you
have
circular
references
and
if
they're
strong,
then
they
will
remain
that
way,
whereas,
whereas
if
they
are
weak,
then
the
garbage
collector
can
can
still
destroy
the
entire,
sending
the
entire
ring
and
and
inform
at
each
point
about
the
native
memory.
That
also
needs
to
be
freed.
So
yes,.
A
B
D
D
B
Set
interval
provides
an
object
right
that
is
opaque
right
on
the
JavaScript
side
and
and
and
in
case
of
nodejs.
It
is,
it
has
like
a
native
equivalent
right
and
so
so
that
object.
That
object
is
not
free
right,
so
the
function
is
keeps
getting
called
until
you
call
clear
interval
right
so
so
clear
interval
basically
does
not
delete
the
JavaScript
object,
because
you
have
no
control
over
whether
JavaScript
objects
are
deleted
or
not
right.
What.
A
B
Can
do
is
is
store
it
in
a
variable,
which
means
the
the
JavaScript
side
now
also
has
a
strong
reference
to
it,
because
it's
stored
in
a
variable
and
then
you
pass
it
to
clear
interval,
in
which
case
you
know
it
clear
interval
goes
goes
to
the
native
side.
Freeze
all
the
related
resources,
like
the
event
loop
handles
and
everything
right,
and
then
the
JavaScript
object
is
still
around.
But
at
that
point
it's
just
a
sort
of
a
hollow
shell
and
and
and
sooner
or
later
the
garbage
collector
is
going
to
garbage
collected.
A
B
B
It
to
actually
go
away
right,
so
if
you
don't
close
it,
if
you
don't
close
it
and
it'll,
the
file
will
remain
open
forever,
because
the
native
side
will
not
will
not
do
anything
right.
So
you're
open,
FS,
not
closed
anytime.
You
have
these
sort
of
bookend
api's.
You
you,
you
have.
You
have
strong
references.
D
B
One
one
very
common
example
of
using
a
strong
reference
is,
is
when
you,
when
you
have,
when
you
declare
a
JavaScript
class
on
the
native
side,
the
you
know,
if
you,
if
your
API
provides,
provides
instances
of
a
JavaScript
class
which
are
created
on
the
native
side
right.
So
you
so
at
at
the
add-on.
B
Initialization
you,
you
declare,
you
define
a
JavaScript
class
right,
so
so
and
then
at
some
point
later
on
in
the
life
cycle
of
the
add-on,
you
start
providing
instances
of
that
class
to
the
JavaScript
side
right
and
you
may
even
expose
the
constructor
to
the
JavaScript
side
so
that,
on
the
JavaScript
side
you
can
like
say.
You
know,
instance
of
you
know,
is
this
instance
an
instance
of
that
constructor
right.
D
D
A
B
B
B
C
B
B
Okay:
okay,
the
test
is
not
a
good
example,
because
we
are
persisting
a
simple
object:
we're
not
persisting
the
actual
constructor,
okay
yeah,
so
so,
okay,
so
yeah,
we
don't
have
a
good
example
in
our
tests.
Then
I
was
hoping
that
the
object
rabbit,
but
but
they
are
in
the
in
the
case
of
the
object.
It's
not
typical
usage
right.
So
normally,
normally
the
value
returned
from
defined
class
yeah.
So
normally
the
the
value
returned
from
defined
class
is
the
value
that
you
would
do.
You
would
persist
right.
A
C
D
B
D
B
B
So
yes,
with
this
crash
here
is,
is,
is
something
that
has
exposed
an
issue
with
with
the
core
API,
which
is
that
we
cannot
distinguish
between
between
when
when
the
environment
is
shutting
down
and
when
there
is
a
simple
pending
exception,
and
so
I'm
discussing
this
in
in
core,
did
I
open
this
here,
yeah
so
trying
to
get
some
consensus
on
how
we
should
do
this
because
it
you
can.
You
can
consider
this
to
be
a
semi
major
change
right
to
have
this
and
to
change
the
way
change.
B
The
way
the
the
nappy
preamble
works
to
no
longer
return
that
be
pending
such
a
because
that
the
problem
is
right.
Now
we
have
right
now
in
core.
We
have
this
here
right,
so
so
you
know.
If
so,
you
know
either
either
the
last
exception
is
not
empty
or
you
cannot
call
into
GAA
jsut
return
that
be
pending
exception,
but
that's
not
entirely
correct
right,
because
if
you
cannot
call
into
Jas
but
otherwise
there
was
absolutely
nothing
wrong
in
terms
of
exceptions.
A
A
B
You
construct
the
error
object.
You
are
actually
constructing
a
referenced
object,
which
means
it
calls
nappy,
create
reference
at
some
point,
but
you
cannot
you.
You
cannot
have
a
reference
to
to
JavaScript
undefined.
You
can
only
have
a
reference
to
an
object
right
then
undefined
is
not
an
object,
and
so
sooner
or
later.
A
A
B
But
that
may
not
necessarily
be
the
right
way
to
go
right
because,
ideally,
if
you,
if
you
are
aware
of
the
fact
that
you
cannot
call
into
JavaScript,
then
you
should
still
be
able
to
handle
that
situation
and
maybe
maybe
release
resources
or
shut
down
in
some
way
right
other
than
fatal
exit
right.
Oh
so,
I
don't
know,
I
I
believe
it
makes
sense
to
introduce
this
without
semver
major,
because
because
this
here
this
here
is
a
bug
like
this
is
wrong.
B
Like
you,
if
you
cannot
call
into
j/s
that
doesn't
mean
you
have
a
pending
exception.
That's
just
wrong
right,
but
but
given
given
that
we
have
made
some
pretty
strong,
a
bi-stability
commitments,
I'm,
not
sure
if,
if
we
can
still
fix
it
right
so
because
you
know
part
of
our
commitment
is
that
you
know
in
response
to
a
certain
situation.
B
Our
status
will
be
this
right
now
if
we
change
the
status
and
that
is
technically
semver
major
unless
it's
a
severe
bug
right,
in
which
case
we
can
probably
fix
it
so
so
I'm
trying
to
figure
out
and
trying
to
raise
some
discussion
on
whether
we
should
consider
this
to
be
a
bug
or
whether
we
should
consider
this
to
be
some
ver
major,
because
if
it
ends
up
being
somewhere
major,
then
we're
probably
not
gonna
fix
it.
Now,
of
course
there
is
a
workaround.
B
So
so
you
know
if
you,
if
you
do
retrieve
the
last
exception,
then
then
you
you
can
check
if
it's
undefined
and
if
it
is
undefined,
then
you
can.
You
can
behave
differently
right,
so
you
you
need
not
make
the
assumption
that
that
the
last
error
is
always
a
valid
sort
of
exception
that
it's
it's.
You
know
it
could
be
undefined.
So
so
we
could
handle
this
on
to
know
that
on
API
side
and
then
basically
basically
status
of
nappa,
pending
exception,
plus
last
exception,
is
undefined.
Equals
cannot
call
into
Jas.
B
So
you
know
we
we
could
do
this.
We
could
do
this
downstream,
but
it
would
be
good
if
core
did
it
for
us,
because
that's
that's
correct,
however,
then
this
discussion
starts.
So
so
that's
where
we
are
with
this
thing
and
still
talking
about
it.
So
we
may
need
to
make
some
changes
in
I
know
that
on
API,
if
this
turns
out
to
be
semi
major,
so
that
was
one
thing
I.
D
B
D
B
B
B
B
That
was
one
thing
that
sort
of
crept
up
because
that's
a
crash
and
that's
always
that's
always
pretty
severe
and
intrusive.
So
then
there
we
had
a
few.
We
had
a
PR
for
this
thing
and
it
needs
work,
so
it
needs
like
documentation
and
and
tests
and
also
needs
to
not
throw
an
exception.
So
I
think
Lucas
already
commented
on
that.
So
then
yeah,
that's
that's
pretty
much
the
major,
but
if
you
minor
dark
changes
from
Michael,
which
I
think
we
talked
about
last
week,
if
I
remember
correctly,
yeah.
E
B
A
B
B
B
A
B
B
A
C
A
It
was
of
disgust
from
jealousy
if
you
see
my
example:
I
I
I
tried
to
yeah.
Essentially
he
won't
do
this
and
in
the
in
the
second,
in
the
second
class,
my
item
class
and
he
created
a
method
called
that
essentially
created
the
the
the
use,
the
constructor
and
rate
or
the
the
the
the
rapid
orbit.
I,
don't
know
if
it's
the
right
thing
to
do
in
this
case.
B
A
B
B
No
easy
way
to
replace
them.
You
know
so
I'm,
actually
working
on
that
that
whole
add-on
class
thing
to
try
to
make
that
easier,
so
that
we
don't
use
global
anymore,
but
anyway,
that
that
so
that's
another
thing
that
that
that
we
need
to
talk
about.
But
but
anyway,
let
me
let
me
look
at
the
actual
thing,
like
okay,
yeah
get
items,
yeah.
C
B
A
A
B
A
B
A
B
Yes,
well,
no,
but
sooner
or
later
you
need
to
go
through.
Sooner
or
later
you
need
to
go
through
the
through
the
JavaScript
constructor,
because
I
mean
you're
constructing
a
JavaScript
instance
yeah.
B
B
D
B
A
C
D
B
A
A
Like
a
plane
object,
he
don't
need
to
create
these.
These
second
object
class,
because
my
thinking
was
that
okay,
he
need
to
do
something
with
this
method.
That
I
call
it
get
item
here
yeah,
but
he
only
need
to
read
data.
He
just
he
can
only
return
the
the
plane
object
from
the
first
meter,
first
that
he
here
he
he
he
implemented
in
the
first
of
the
class
yeah.
B
A
B
A
B
B
It's
done
so
you
know
constructing
them
like
this
is
actually
not
the
end
of
the
world
right
and
you're,
avoiding
you're,
avoiding
wrapping
things
up
and
then
unwrapping
them
in
in
the
in
the
in
the
item
constructor,
so
yeah
but
I
mean
for
performance.
It's
probably
better
if
the
arrays
are
large,
I
think
I
think
maybe
performances
is
in
the
background
here,
like
the
reason
why
they
don't
want
to.
You
know
like
say,
like
nappy
number
new.
B
B
D
A
A
A
B
It
there
should
be
no
problem
right
because,
because
you
know
TMP
value,
you
know
I
mean
he's
setting
TMP
value
here
right
and
then
and
then
he's
immediately
calling
you
right,
in
which
case,
in
which
case
it
will
be,
it
will
be
red,
so
it
should
be
okay
right,
it's
just
not
a
very
it's
just
not
not
a
very
good
way
of
writing
it
because
you're
using
a
global
variable
to
pass
things
around.
It's
not
kosher,
but
well
it's
a
solution
right.
B
If
you
want
to
avoid
wrapping
things,
but
but
actually
it's
it's
kind
of
yeah,
it's
kind
of
yeah,
yeah
yeah,
no,
there's
nothing!
We
can
do
here.
I
mean
the
only
other
thing
that
we
could
do
is
is
to
use
an
external
right
like
you
could
construct.
You
can
construct
new
with
an
external
and
then
the
external
has
all
the
native
data
in
it.
And
here
you
retrieve
the
data
from
the
external
right.
B
B
B
Application
data
right
I
mean
just
an
example,
but
basically
the
example
illustrates
the
pattern
and
and
yeah
I,
don't
think
they
have
a
better
choice
than
this.
You
know
because
this
this
really
this
solution
does
avoid
converting
to
JavaScript
values
and
then
converting
back
to
native
values.
It
does
avoid
that
step
right.
So
then,
so
then,
the
only
thing
that
you
can
do
if
avoiding
that
step
is
important,
then
the
only
thing
you
can
do
is
make
sure
that
that
that
it
is
synchronous
right
so
that
you
know
so
that.
A
B
Don't
get
like
you
know
you
you
set
it
here,
but
then
something
happens.
It
changes
the
value
and
then
you
end
up
constructing
with
the
wrong
value.
You
have
to
make
sure
that
it's
synchronous
and
it
is
so
in
this
case
it
should
be
okay.
So
okay
I
can
comment
saying
that
you
know
it's
not
like
yeah.
A
B
B
B
B
C
B
And
then
and
then
the
binding
will
have
will
have
that
data
and
then
they
can
each
and
then
in
the
see
in
each
binding.
You
do
this
so
so
this
this
is
the
way
to
do
it,
and-
and
this
should
actually
work
now,
because
we've
landed
the
that
patch,
that
that
deletes
all
the
references
you
know
when
the
environment
quits
so
that
has
landed
now
and
it
also
landed
on
12.
B
So
so,
if
you,
if
you,
if
you
create,
if
you
create
a
structure
on
the
heap
in
your
in
your
add
on
in
it
and
then
you
and
then
you
wrap
it
and
then
you
attach
attach
it
to
the
exports
object
with
a
weak
reference,
then
then
it
will
be
freed
when
the
add-on
is
unloaded,
meaning
when,
when
the
environment
quits,
it
will
actually
be
freed.
So
it
won't
be
a
memory
leak.
B
So
so
then,
so
then,
after
you
have
that
pointer,
it's
your
responsibility
to
basically
create
all
your
functions
and
and
basically
decorate
your
add-on
using
using
that
pointer,
so
so
make
sure
that
all
the
Nappy
property
descriptors
they
have
it
in
the
data
field.
They
have
the
pointer
in
the
data
field
and
when
you
Nappi
create
function,
you
passed,
you
passed
the
data,
you
pass
the
pointer
as
the
data
and
then
and
then
in
in
in
your
in
your
accessors
and
in
your
callbacks.
B
You
just
retrieve
it
using
like
and
dot
data,
and
and
that's
it
or
if
you're
or
if
you're,
in
in
in
in
napi
chord,
and
you
know
nap,
you
get
CB
info
and
then
give
it
a
data
point
or,
and
then
you
just
cast
it
and
you
have
it
so
so
that
would
be
the
way
to
avoid
it.
It's
not
it's
not
as
convenient,
but
it's
it's
the
way
to
go
and
and
actually
and
actually
so
you
know
do
you
know
for
object,
wrap.
We
have.
We
have
static
methods
and
we
have
instance
methods
right.
B
So
if
you
think
about
it,
an
add-on
if
we
wanted
to
create
a
class,
that
is
an
add-on
right,
and
so
you
do
su
so
to
have
you
avoid
having
to
having
to
pass
these
things
around
like
that
right.
The
solution,
the
solution
would
be
to
have
like
an
object,
wrap
something
that's
similar
to
object,
wrap
which
doesn't
have
anything,
but
instance,
methods
right,
an
instance
accessors
right
and
then
and
then
what
you
do
is
you
give
it?
B
The
exports
object,
and
it
defines
all
these
instance
methods
and
instance
accessors
on
the
exports
object
right
and
then
those
instance
methods
are
not
really
javascript
class
instance
methods.
They
are
your
bindings
right,
but
because
they
are
instance
methods
they
have
access
to
this
right,
mm-hm
and
then,
and
then
the
pointer
that
you
pass
around
becomes
becomes
the
this
pointer.
You.