BANano v4.50
This version introduces the BANanoServer b4xlib library, which makes the B4J connection full circle:
	
	
		
			
			
				
				INTRODUCTION  B4J has an excellent jetty based server: the jServer library.  BANanoServer uses this lib and provides you with a lot of goodies to make building WebApps with B4J very simple.  NOTE: This library is in the full BANano library zip file.  NOTE: You can still use BANano without the...
				
					
						
							 
						
					
					www.b4x.com
				
 
			 
		 
	 
The BANanoServer.b4xlib library, source code and demo can be found in the zip in BANano4.50\B4JServerDemo\New System 4.50+\
It add some specific methods to BANano that can only be used when you use this BANanoServer.b4xlib library!
In the B4J IDE there are three new templates classes added :
a. BANanoServer SERVER Class: a template of the server side of a page
b. BANanoServer BROWSER Class: a template of the browser side of a page
c. BANanoServer SHARED Class: a template of a class that can be used both in BANano and B4J.
Use to specify which code is specific for the BANanoServer (B4J) and the BANano Browser part in c.
	
	
	
	
	
Making changes a this class in B4J debug mode will NOT have any effect on the BANano side until recompiled!
If you want a specific class/module to be transpiled, use the following on top of your class/module:
	
	
	
	
	
	
	
	
	
		#Region BANano
    ' <-------------- IMPORTANT! This is because we want the non specific B4J code in this module to be transpiled by BANano
#End Region
	 
	
	
		
	
 
--------------------------------------------
1. [NEW] a BANano event _ParseEvent(params As Map)
Typically used in a SERVERClass to process an event coming from the browser
	
	
	
	
	
	
	
	
	
		' event raised to distribute incoming events coming from the BROWSER
public Sub BANano_ParseEvent(params As Map)
    Main.Server.ParseEvent(Me, ws, CacheReport.BANPageID, CacheReport.BANSessionID, params)
End Sub
	 
	
	
		
	
 
2. [NEW] a BANano event _Uploaded(status As Int, fileName As String)
Typically used in a SERVERClass to handle an UploadFile
	
	
	
	
	
	
	
	
	
		' event raised when a file has been uploaded
public Sub BANano_Uploaded(status As Int, fileName As String)
    Log(fileName & " = " & status)
    Select Case status
        Case 200 ' OK
        Case 500 ' was not a POST call
        Case 501 ' file to big
        Case 502 ' file type not allowed
    End Select
End Sub
	 
	
	
		
	
 
3. [NEW] BANano.TranspilerOptions.SetStaticFolder() and BANano.StaticFolder (get)
SetStaticFolder has to be used in the AppStart method.
StaticFolder (get) can be used both in B4J as in a BANano class/module.
4. [NEW] BANano.GetPageID
On the Browser side, here you can read the unique page ID (autogenerated)
5. [NEW] UploadFile: Uploads a file from the browser side to the BANanoServer
	
	
	
	
	
	
	
	
	
		' uploading a file to our server
Sub SKButton1_Click (event As BANanoEvent)
    Dim Response As BANanoObject
    ' get the file object
    Dim theFile As BANanoObject = SKTextBox1.File
    If theFile = Null Then
        BANano.Alert("Please select a file first!")
        Return
    End If
    ' prevent big uploads
    If theFile.GetField("size") > 1024 * 1024 * 5 Then
        BANano.Alert("File is to big!")
        Return
    End If
    ' returns a promise
    Dim prom As BANanoPromise = BANano.UploadFile(theFile)
    prom.Then(Response)
        SKLabel1.Text = "Upload status: " & Response.GetField("status").Result
    prom.Else(Response)
        Log(Response)
    prom.end
End Sub
	 
	
	
		
	
 
6. [NEW] New class BananoCacheReport, which returns more info of the cached page.
typical use is on the SERVER side:
	
	
	
	
	
	
	
	
	
		Private Sub WebSocket_Connected (WebSocket1 As WebSocket)
    Log("Connected")
   
    ws = WebSocket1
   
    ' Lets update the cache with this class
    CacheReport = Main.Server.UpdateFromCache(Me, ws)
    Log("PageID: " & CacheReport.BANPageID)
    Log("Comes From Cache:" & CacheReport.ComesFromCache)
    Log("Is a reconnecting socket: " & CacheReport.IsReconnected)
   
    ' We can already send stuff to the browser, using normal B4J jServer code with Future
    Dim fut As Future = ws.RunFunctionWithResult("AddInTheBrowser", Array(20, 30))
    ws.Flush
    Log("BROWSER says sum of 20+30=" & fut.Value)
   
    ' or if no result is expected back
    ws.RunFunction("BROWSERTest", Array("Hello from the SERVER!"))
    ws.Flush
       
    ' IMPORTANT lets tell the browser we are ready to receive call from the browser
    ' Uses the classic WebSocket_Connected and WebSocket_DisConnected events on the browser size
    ' Use Main.Server.SendReady(ws, "ws") if you use the advanced events OnOpen, OnMessage, OnServerReady, ...
    Main.server.SendConnected(ws)   
End Sub
	 
	
	
		
	
 
7. [NEW] BANano.B4JCallSubX(Component as Object, Sub as String, Arguments as List)
Similar to CallSub, but with unlimited arguments.  Arguments must be passed as an Array.
Can only be used in pure B4J, not in a BANano module!
8. [NEW] BANano.TranspilerOptions.SetSessionMaxInactiveInterval
Sends a heartbeat. Only applicable if a BANanoServer is used.
Should be the same a the BANanoServer.SessionMaxInactiveInterval
9. [NEW] BANanoWebSocket.RunFunctionWithResult
Similar to RunFunction.  Returns a BANanoPromise with the result.
10. [NEW] BANanoWebSocket.RunFunction
Runs a B4J function.  Pass null to Args if is not needed.
11. [NEW] BANanoWebSocket.IsReconnected
In case of a Reconnecting Websocket, you can check if this was a reconnected session
--------------------------------------------
Used in the BANanoServer library. 
In most cases you do not have to use these methods directly but use the BANanoServer methods instead
12. [NEW] BANano.UploadHandlerPath, use BANanoServer.UploadFolder instead
Sets/Gets the folder where Uploads are put
13. [NEW] GetPageHTML. Used internally.
Other changes:
---------------------------------------------
14. [NEW] BANAno.CallBackExtra
Useful where a library you are wrapping needs a function() {} as parameter.
The params are the 'event' params like in the normal CallBack.
The extraParams are extra parameters that the callback method takes, not default to the callback
Example:
	
	
	
	
	
	
	
	
	
		Sub GetFileFromServer(FileName As String)
      Dim Response As BANanoFetchResponse
    Dim Blob As BANanoObject
   
    ' list (GET is default, and we do not need extra options so we pass Null for the options)
    Dim fetch1 As BANanoFetch
    fetch1.Initialize(FileName, Null)
    fetch1.Then(Response)
        ' we got the response promise, so resolve it to a blob
        fetch1.Return(Response.Blob)
    fetch1.Then(Blob)
        ' we got the blob, read it in a FileReader
        Dim FileReader As BANanoObject
        FileReader.Initialize2("FileReader", Null)
        Dim event As BANanoEvent
        ' the CallBackExtra, which next to the normal event, also we like to pass the filename
        FileReader.SetField("onload", BANano.CallBackExtra(Me, "ReadData", Array(event), Array(FileName)))
        ' get the DataURL
        FileReader.RunMethod("readAsDataURL", Blob)           
    fetch1.End ' always end a fetch with this!   
End Sub
Sub ReadData(event As BANanoEvent, FileName As String) 'ignore
    ' get the data
    Dim Target As BANanoObject = event.OtherField("target")
    Dim DataUrl As String = Target.GetField("result").Result
    Log(FileName)
    log(DataURL)   
End Sub
	 
	
	
		
	
 
15. [NEW] BANano.GetFileAsDataURL
Does a Fetch with a resource (e.g. url) and an optional Request options object
Pass null if no request options need to be set
Returns a promise holding the DataURL   
	
	
	
	
	
	
	
	
	
		Dim dataUrl As String
Dim dataUrlProm As BANanoPromise = BANano.GetFileAsDataURL("./assets/B4X.jpg", Null)
dataUrlProm.Then(dataUrl)
         Log(dataUrl)
dataUrlProm.end
	 
	
	
		
	
 
16. [NEW] BANano.GetFileAsText
Does a Fetch with a resource (e.g. url) and an optional Request options object
Pass null if no request options need to be set
Returns a promise holding the text   
17. [NEW] BANano.GetFileasJSON
Does a Fetch with a resource (e.g. url) and an optional Request options object
Pass null if no request options need to be set
Returns a promise holding the JSON
18. [NEW] BANano.GetFileAsArrayBuffer
Does a Fetch with a resource (e.g. url) and an optional Request options object
Pass null if no request options need to be set
Returns a promise holding the ArrayBuffer
-------------------------------------------------------
New in BANanoPromise
19. [NEW] Promise.NewStart & promise.NewEnd
Make a new Promise with this signature:
	
	
	
	
	
	
	
	
	
		Dim prom as BANanoPromise
prom.NewStart
   ...
   BANano.ReturnThen(ret)
   ...
   BANano.ReturnElse(ret)
prom.NewEnd
prom.Then(response)
prom.Else(response)
prom.End
	 
	
	
		
	
 
Transpiles to:
	
	
	
	
	
	
	
	
	
		prom = new Promise(function(resolve, reject) {
  ...
  resolve(ret);
  ...
  reject(ret)
});
prom.then(function(response) {
}).else(function(response) {
});
	 
	
	
		
	
 
Example:
	
	
	
	
	
	
	
	
	
		Dim response As String   
Dim prom As BANanoPromise 'ignore
prom.NewStart
        BANano.ReturnThen("Alain")
prom.NewEnd
prom.Then(response)
        Return "Hello " & response & "!" 'ignore
prom.Then(response) 'ignore
        Log(response) ' prints: Hello Alain!
prom.end
	 
	
	
		
	
 
20. [NEW] Promise.then now returns a BANanoPromise
---------------------------------------------
BANano.TranspilerOptions:
21. [NEW] BANano.TranspilerOptions.IgnoreB4JLibrary
A B4J library the BANano Transpiler should ignore.
By default, the following are ignored:
BANano
BANanoServer
jCore
jFx
jServer
JavaObject
ABJJWT
22. [NEW] BANano.TranspilerOptions.SetSessionMaxInactiveInterval
Sends a heartbeat. Only applicable if a BANanoServer is used.
Should be the same a the BANanoServer.SessionMaxInactiveInterval
---------------------------------------------
BANanoWebsocket:
23. [NEW] New websocket events.
NOTE:
.Initialize will raise the 'normal' B4J WebSocket events
.InitializeExtended will raise the more advanced websocket events     
For the usage of the events, see the demo
OnConnecting(event As BANanoEvent)
OnServerReady()
WebSocket_Connected()
WebSocket_Disconnected(event As BANanoEvent)
24. Other minor Transpiler fixes and optimisations
Download: 
https://www.b4x.com/android/forum/t...-abstract-designer-support.99740/#post-627764
Alwaysbusy